目录
目录
延迟加载:
就是需要用到数据的时才会进行加载,不需要用到数据时就不加载数据,延迟加载也叫懒加载
坏处: 因为只有当需要用到数据时才会进行数据库查询,这样在大批量数据查询时,因为查询工作也需要时间,可能会造成用户等待时间长,用户体验下降
好处: 先从表单查询,需要时在从关联表去关联查询,大大提高了数据库性能
延长加载只有在多表联合查询时才会出现
延迟加载的实现,需要将原来的一条连接查询sql语句修改为两条表单查询的sql语句
延迟加载一(多)对一,Assoction实现:
使用延迟加载就不能使用连接查询, 因为连接查询会一次性将数据信息查询出来
实际就是将连接查询一步实现改为两步实现,并且当不需要具体数据的时候,第二步可以省略
一对一的配置:
association:用于配置一对一
property:设置一方属性名称
javaType:设置一方属性类型
延迟加载配置:
column:条件列 设置传递到下一个查询的条件列
select:配置关联的下一个查询
fetchType:加载类型 lazy:延迟加载 eager:立即加载
延迟加载和关联查询(内连接|外连接)区别:
-
关联查询的动作: 会把两张表同时都查询出来,意思就是:数据结果在一次就搞定,不会再来第二次。
-
懒加载的动作: 分开来查,先查询A表, B表会不会查询,取决于用户想不想看B表的数据。如果想看,就查询B表,如果不想看,就不查询B表。
Collection 实现延迟加载 (一对多,多对多)
多对多可以看做是一对多的形式来操作
先查询主表的所有记录,在查询从表的单条记录,根据外键查询
collection:用于配置1对多 配置多方
property:多方对象集合属性名称
ofType:多方对象集合属性类型 写集合的泛型
延迟加载配置:
column:条件列
select:设置下一个查询 select * from t_account where uid=?
fetchType:加载类型 lazy:延迟加载 eager:立即加载
立即加载: 只要一方调用方法,则码数发起查询,把所有数据查询出来
延迟加载: 只有在真正使用是,才发起查询,不使用则不查询
MyBatis注解开发
使用 Mybatis 注解实现基本CRUD
注解添加在dao接口的方法中配置sql语句就可以了,原来的映射文件就可以消失了
增删改需要进行事物手动提交
-
@Insert:实现新增
-
@Update:实现更新
-
@Delete:实现删除
-
@Select:实现查询
-
@SelectKey:保存之后 获得保存的id
-
@SelectKey:查询获取添加记录的主键,填充到插入对象的主键上
-
keyProperty:表示要将查询出的主键填充到对象的哪个属性上
-
resultType:主键列属性类型
-
before:boolean类型 如果主键生成在插入语句之前就设置为true 主键生成在插入语句之后就设置为false
-
statement:设置获取主键的SQL语句
-
使用Mybatis注解实现复杂关系映射开发
实现复杂关系映射在映射文件中通过配置<resultMap>标签来实现
复杂关系映射的注解说明
@Result注解代替的是标签<resultMap>
1.该注解中农可以使用单个@Result注解也可以使用@Result集合
@Results({@Result(), @Result() })或@Results(@Result())
2.@Resutl 注解属性说明
column 数据库的列名
Property 需要装配的属性名
one 需要使用的@One 注解(@Result(one=@One)()))
many 需要使用的@Many 注解(@Result(many=@many)()))
3.@One注解(一对一)
代替了<assocation>标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
@Result(column="列名",property="属性名",one=@One(select="指定用来多表查询的 sqlmapper"))
column:条件列 也就是两个表关联的外键列
property:配置一方对象属性名称
one:@One注解 替代association标签 配置一方
select:配置关联的下一个查询
fetchType:配置加载类型 FetchType.LAZY:懒加载 FetchType.EAGER:立即加载
4.@Many注解(一对多)
代替了<collection>标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合
注意:聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType(一般 为 ArrayList) 但是注解中可以不定义;
@Result(property="",column="",many=@Many(select=""))
column:作为条件列【外键】 传递给下一个查询
property:配置多方对象集合属性
many:@Many注解 替代collection标签 配置多方
select:配置关联的下一个查询
fetchType:加载类型 FetchType.LAZY:懒加载
总结:
-
@Results:替代resultMap标签 用于手动配置关联映射
-
@Result:替代resultMap标签中的id和result标签
-
@One:替代association标签 用于配置一方
-
@Many:替代collection标签 用于配置多方
-
@ResultMap:注意 它不是用于封装数据的 而是用于引用配置好的Results
实际开发中,xml配置居多, 注解和xml可不可以同时使用,但是要注意不要一个方法配置了两次映射 这时就会出问题,一般使用 简单的CURD使用注解配置,复杂的使用xml配置
-
缓存
-
mybatis有两层缓存: 一级缓存 , 二级缓存
-
一级缓存 : 属于SqlSession级别的缓存,不用设置,默认就存在。
-
只有当我们执行的查询语句和以前的查询语句是一样的,才会从缓存里面拿数据
-
-
二级缓存 : 属于SqlSessionFactory级别的缓存,虽然是默认开启,但是哪个想用,还需要在xml里面配置 : <cache/>
-
由于它的范围很大,所以只要是从这个SqlSessionFactory产出的session对象,都可以共享这份缓存。
-
-
不管是什么缓存,只要执行了增删改的动作,那么都会清空缓存(一级&二级)
-
-
-
懒加载
-
在涉及到多张表查询的时候,才会用到懒加载。另一张表的数据先别查询出来,等需要的时候再查询。
-
步骤: 把查询拆分成两个表的独立查询,需要有两个dao,需要查询两次。
-
通常来说:
-
第一次查询都是查询整张表的所有数据
-
第二次查询,一般是按照主键来查询数据
-
-
关联:
-
如果是一对一: 使用<association property="user" column="uid" select="com.itheima.dao.UserDao.findByUid" fetchType="lazy">
-
如果是一对多: 使用 <collection property="acccountList" column="uid" select="com.itheima.dao.AccountDao.findByUid" fetchType="lazy">
-
-
-
-
注解开发
-
基本单表操作的注解:
-
@Insert | @Delete | @Update | @Select | @SelectKey
-
-
多张表的操作:
-
@Results : 对应 <resultMap>
-
@Result : 对应 <id> 和 <result>
-
@One 对应 <association>
-
@Many 对应 <collection>
-
-
-
分页插件
-
-
导入依赖
-
在SqlMapConfig.xml配置拦截器
-
在调用dao方法之前,先设置要查询第几页,每页查询多少条: PageHelper.startPage(1, 10);
-
-
MyBatis缓存:
缓存: 就是一块内存空间,保存临时数据
将数据源(数据库或者文件)中的数据读取出来存储到缓存中,再次获取的时候,直接从缓存中获取,这样可以减少和数据库交互的次数,提升程序的性能
使用场景:
经常查询但不经常修改的数据,数据的正确与否对最终的结果影响不大
不适用的场景:
经常改变的数据,敏感数据
MyBatis缓存的类别:
一级缓存:-----默认开启
是sqlSession对象的缓存,自带的(不需要配置),不可卸载的(不使用不行),一级缓存的生命周期和sqlSession的一致
二级缓存:-----需要配置,手动开启且属于sqlSessionFactory
是sqlSessionFactory的缓存,只要是同一个sqlSessionFactory创建的sqlSession就会共享二级缓存的内容,并且可以操作二级缓存(二级缓存需要使用需要手动开启也就是配置)
只有查询操作才会有缓存的必要,增删改不会有缓存
一级缓存:
增删改会清空一级缓存
sqlSession的销毁,调用close()也会情况
二级缓存:
同一个sqlSessionFactory创建的SqlSession二级缓存的内容是共享的
MyBatis默认不会开启二级缓存,需要手动开启配置
<settings></settings>标签下<setting name=”cacheEnabled” value=”true”/>
true----表示开启
如果希望查询的数据存储到二级缓存中,就需要在映射文件中配置
<cache>标签表示使用二级缓存(该mapper文件中所有的查询操作都将使用二级缓存,无需单独使用<select>标签一个一个的开启)
针对每次查询都需要使用最新的数据sql , 需要设置useCache=false禁用二级缓存