************20210402_am************
1、mybatis介绍:
1)说明:
a、原名ibatis,是一个基于java的持久层框架;是对jdbc的上层封装;
b、核心包括SQL Maps和DAO;
c、ORM:对象关系映射;类--表、类的属性--表的列、类的对象--表的记录
d、mybatis是半自动化的框架:程序员写sql语句(更灵活)、框架自动封装结果;
e、hibernate是全自动化的框架:框架生成sql语句、框架自动封装结果;
f、sql语句可以放置在xml配置文件中(常用),也可以通过注解写到java的接口类中;
2)mybatis框架的工作流程:课件第1章第14页;--请自行整理; --一般没人问
2、第一个mybatis项目:
1)过程:
a、创建maven的java项目,修改jdk版本配置;
b、引入数据库驱动程序依赖、mybatis相关依赖;
c、创建实体类与表对应;
d、创建全局配置文件mybatis.xml,里面配置数据库连接信息、框架的配置信息;
e、创建工具类MybatisUtil.java,用于获取SqlSession对象;
f、创建映射文件UserMapper.xml,里面配置各个sql语句;
g、创建测试类进行测试;
2)示例:mybatis_01_wdr项目的test01包;
3)mybatis中两种事务管理方式:JDBC、MANAGED; --了解
4)mybatis中三种数据源方式:POOLED、UNPOOLED、JNDI; --了解
************20210402_pm************
--继续完成第一个例子;
************20210406_am************
3、补充知识点:
1)插入数据时,自动获取数据库生成的主键值;
a、我们在插入数据时,通常不直接提供主键值,而是通过数据库支持的方式来生成;
b、mysql数据库支持自动生成主键值,Oracle数据库通过序列来生成主键值;
c、我们有时候需要使用刚刚插入数据的主键值,就可以通过mybatis框架来获取;
示例:mybatis_01_wdr项目的test02包;
2)java代码对表中date类型列的处理:
a、方式1:在java中使用String来对应date类型的列;
b、方式2:在java中使用java.util.Date来对应date类型的列;
示例:mybatis_01_wdr项目的test03包、test04包;
3)java代码对表中下划线分隔的列名的处理:
a、方式1:使用标签,手动对应类的属性和表的列;
b、方式2:在全局配置文件mybatis.xml中,配置来自动对应(要求两边名称要符合标准);
c、方式3:在查询语句中给列起别名;
示例:mybatis_01_wdr项目的test05包;
@补充:标签用来映射表的列和类的属性,主要用在两种情况:
a、表的列名与类的属性名不能自动匹配时,使用本标签进行映射;
b、多表关联查询时,使用本标签映射结果;--后面讲
4、mybatis的核心配置文件:
1)两种配置文件:
a、全局配置文件:设置框架的基本信息、数据源信息等;
b、映射文件:
2)全局配置文件(mybatis.xml):
a、根标签是;
b、有多个子标签:
3)映射文件(XxxMapper.xml):
a、根标签是;
b、有多个子标签:
5、Mybatis的核心接口和类:
1)说明:
a、框架会针对每个数据源创建一个SqlSessionFactory对象;
b、可以通过SqlSessionFactory对象来获取多个SqlSession对象;
c、所有针对数据库的操作,都是通过SqlSession对象进行的;
2)SqlSession的常用方法:
a、T selectOne(String, Object)
b、List selectList(String, Object)
c、int insert(String, Object)
d、int update(String, Object)
e、int delete(String, Object)
f、void commit()
g、void rollback()
************20210407_am************
6、mybatis开发dao:
1)说明:
a、两种方式:原始dao开发、mapper代理开发;
2)原始dao开发:
a、需要我们写映射文件、dao接口类、dao实现类;
b、示例:mybatis_01_wdr项目的test06包;
3)mapper代理开发:
a、只需要我们写映射文件和dao接口类,具体的dao实现类对象由框架动态生成;
b、注意:在项目中,代码实现会更简单(现在学习过程中,需要手写多一点代码);
c、要求(背下来): --可能的笔面试题
映射文件名与接口类名必须一致;
映射文件中的sql语句的id、参数类型、返回值类型,要与接口类中方法名称、参数类型、返回值类型一致;
映射文件的标签的namespace属性值必须是接口类的全类名;
d、示例:mybatis_01_wdr项目的test07包;
7、逆向工程:--了解即可
1)说明:
a、我们把根据模型(或者数据库表等)生成java代码的过程,称为逆向工程;
b、根据java代码生成模型(或者表)的过程,称为正向工程;
c、mybatis框架可以根据表,生成实体类、映射文件、mapper接口类;--代码比较乱,wdr说不实用
2)mybatis的逆向工程的实现:
a、引入相关依赖;
b、编写配置文件;
c、执行逆向工程的那个类;
示例:mybatis_01_wdr项目的test08包;
************20210408_am************
8、动态sql:
1)说明:
a、在针对查询条件不确定的情况时,可以使用动态sql根据值来动态生成查询语句;包括插入、修改也可能涉及到动态sql的使用;
b、mybatis框架提供了各种标签,可以实现动态sql的效果;支持OGNL方式;
2)+的使用: --掌握
a、用来生成动态的查询语句;判断传入的参数是否为有效值,来决定是否生成该条件;
3)+的使用: --了解即可
a、用来生成动态的插入语句;可以使用标签实现对代码前后增加前缀和后缀功能;不太常用;
4)+的使用; --暂时了解即可,将来可能会使用;
a、用来生成动态的修改语句;
5)标签的使用:--暂时了解即可,将来可能会使用;
a、用来生成in的条件;
b、有collection属性,取值可以有三种:array、list、map的key值;(前两个是固定值)
6)补充:使用mybatis框架,java代码调用sql语句时,给sql语句传参可以有下面两种情况:
a、传入参数是单参数;类型可以是基本类型、包装类类型、String、数组或者List集合;
b、传入参数是多参数;类型是实体类类型、Map类型;(表现为一个参数,只是把多个值封装到实体类对象中,或者Map集合中)
7)标签的使用: --了解即可
a、标签用于多选一的条件,需要配合、来使用;
8)标签的使用:--掌握
a、sql片段,使用把多条sql语句中共同的代码提取出来,方便维护;
b、需要配合来引用sql片段;
示例:mybatis_01_wdr项目的test09包;
************20210408_pm************
@补充:mybatis框架会对查询结果进行自动的封装,前提是我们需要在标签中提供resultType属性或者resultMap属性;
1)resultType属性对应我们的实体类类型;
2)resultMap属性对应在映射文件中定义的标签的id值;
3)这两个属性二选一使用,不能同时使用;
9、mybatis的多表关联查询实现:
1)说明:
a、关系型数据库中的多表之间的联系:一对一(人口信息表--护照表)、一对多(班级表--学生表)、多对多(学生表--课程表,需要通过“选课表”实现关联);
b、mybatis框架中多表之间的联系;一对一(员工表--部门表,一个员工只属于一个部门)、一对多(班级表--学生表)、多对多(学生表--课程表);
2)一对一关联:--掌握
a、概念:在查询emp表的数据时,级联查询出对应的dept表的数据;(查询一条员工信息,级联查询出一条该员工所在部门的信息)
b、方式1:只创建一个实体类Emp,里面直接包含Dept表的列作为属性;使用resultType属性;
示例:mybatis_01_wdr项目的test10包;
c、方式2:创建两个实体类Emp、Dept,Emp里面包含Dept类型的属性;使用resultMap属性,配合映射文件中标签和子标签使用;
示例:mybatis_01_wdr项目的test11包;
************20210409_am************
9(续)、mybatis的多表关联查询实现:
3)一对多关联:--了解即可
a、概念:在查询dept表的数据时,级联查询出对应的emp表的数据;(查询一条部门信息,级联查询出该部门下多条员工的信息)
b、实现:创建两个实体类Dept、Emp,Dept中包含Set类型的数学;使用resultMap属性,配合映射文件中的标签和子标签使用;
示例:mybatis_01_wdr项目的test12包;
@补充:自己百度 5W+2H
10、分页功能: --建议掌握
1)说明:
a、如果查询结果有很多条记录,通常我们会采用分页功能,只显示第一页的数据;这样可以减轻服务器压力;
b、mybatis框架有两种分页实现:
数据库本身支持的分页实现(mysql使用limit关键字,oracle数据库使用rownum伪类和子查询);
mybatis框架的RowBounds插件;
2)mysql数据库的limit方式:--建议使用的方式
a、通常需要两条sql语句:查询共有多少条记录、查询指定页数据;
b、可以提供一个Pager类,专门存储分页相关信息;(不是必须的)
示例:mybatis_01_wdr项目的test13包;
3)mybatis框架的RowBounds插件方式:
a、RowBounds插件是框架自带的api,默认查询出符合条件的最后一条记录之前的所有记录,然后截取指定页的记录来返回;
b、缺点:性能没有limit方式好;
c、优点:跨数据库;
示例:mybatis_01_wdr项目的test14包;
11、延迟加载(Lazy Load):--了解即可
1)说明:
a、概念:在数据真的被使用时,才查询数据库把数据映射到java的对象中,称为延迟加载(懒加载);
b、在使用配合和时,才可能产生懒加载的效果;
c、mybatis默认没有开启懒加载,需要我们手动配置(在标签中配置);
lazyLoadingEnabled=true
aggressiveLazyLoading=false
12、mybatis的缓存:--记住概念,常见的面试题
1)说明:
a、概念:是一种以空间换时间的设计理念;利用内存空间资源占用来加快查询速度;
b、mybatis框架直接支持缓存机制,支持手动配置;
c、mybatis中有两种缓存:
一级缓存:直接支持,不需要配置;
二级缓存:需要在全局配置文件和映射文件中配置,才能开启;需要类实现序列化接口;
2)mybatis的缓存机制: --大概背一下,可能的面试题
a、MyBatis提供了一级缓存和二级缓存
b、一级缓存:也称为本地缓存,用于保存用户在一次会话过程中查询的结果,用户一次会话中只能使用一个sqlSession,一级缓存是自动开启的,不允许关闭。mybatis和spring整合后进行mapper代理开发,不支持一级缓存。
c、二级缓存:也称为全局缓存,是mapper级别的缓存,是针对一个表的查结果的存储,可以共享给所有针对这张表的查询的用户。也就是说对于mapper级别的缓存不同的sqlsession是可以共享的。
3)示例:mybatis_01_wdr项目的test15包;
4)mybatis支持与第三方的缓存框架整合;--了解即可