MyBatis延迟加载,一级缓存,二级缓存(详解)

  

使用ORM框架我们更多的是使用其查询功能,那么查询海量数据则又离不开性能,那么这篇中我们就看下mybatis高级应用之延迟加载,一级缓存,二级缓存。使用时需要注意延迟加载必须使用resultMap, resultType不具有延迟加载功能。

  

  

延迟加载已经是老生常谈的问题,什么最大化利用数据库性能之类之类的,也懒的列举了,总是我一提到延迟加载脑子里就会想起来了Hibernate得到和负载的区别对吧,废话少说,直接看代码。先来修改配置项xml。

  

注意,编写mybatis.xml时需要注意配置节点的先后顺序,设置在最前面,否则会报错。

        & lt; settings>   & lt;设置name=" lazyLoadingEnabled " value=" https://www.yisu.com/zixun/true "/比;   & lt;设置name=" aggressiveLazyLoading " value=" https://www.yisu.com/zixun/false "/比;   & lt;/settings>      

 MyBatis延迟加载,一级缓存,二级缓存(详解)

  

前面提到延迟加载只能通过协会收集来实现,因为只有存在关联关系映射的业务场景里你才需要延迟加载,也叫懒加载,也就是常说的用的时候再去加载对吧,那么我们来配一个协会来实现:

  

我来编写一个加载博客列表的同时加载出博客额作者,主要功能点在id为blogAuthorResumtMap这个resultmap上,其中使用了协会,关键点是它的选择属性,该属性也就是你需要懒加载调用的语句id。当然需要懒加载的声明返回值当然是resultmap

        & lt; resultMap id=癰logAuthorResumtMap”类型=安┛汀痹?   & lt; id列=癷d”属性=" id "/比;   & lt;结果列=氨晏狻笔粜?"标题"/比;   & lt;结果列=袄啾稹笔粜?"类别"/比;=癮uthor_id”属性=& lt;结果列author_id”/比;   & lt; !——使用assocition支持延迟加载功能,配置延迟加载关联关系——比;   & lt;协会财产="作者"将javaType="作者"选择==癮uthor_id”/皊electAuthorById”列在   & lt;/resultMap>      & lt; !——要使用延迟记载的方法——比;   & lt;选择id=" selectBlogAuthor " resultMap=癰logAuthorResumtMap”比;   选择id、标题、类别,从t_blog author_id   & lt;/select>      & lt; !——延迟加载查询博客对应的作者方法——比;   & lt;选择id=" selectAuthorById " parameterType=癷nt”resultType=白髡摺北?   选择id、名称从t_author id=# {value}   & lt;/select>      

好的,来看测试结果:
  

        @Test   公共空间getBlogAuthorByLazyloading () {   SqlSession SqlSession=零;   尝试{   sqlSession=sqlSessionFactory.openSession ();   List=sqlSession.selectList列表(“com.autohome.mapper.Author.selectBlogAuthor”);      (博客博客:列表){   System.out.println (“id:”+ blog.getId() +”,标题:“+ blog.getTitle() +“,类别:”+ blog.getCategory ());   System.out.println(“作者:”+ blog.getAuthor () . getname ());   }      }捕捉(异常e) {   e.printStackTrace ();   最后}{   sqlSession.close ();   }   }      

 MyBatis延迟加载,一级缓存,二级缓存(详解)

  

 MyBatis延迟加载,一级缓存,二级缓存(详解)

  

从图一中看出,执行selectBlogAuthor返回List对象时只执行了SQL SELECT id、标题、类别,从t_blog author_id,循环遍历时才去执行选择id、名称从t_author id=& # 63;。

  

  

了解缓存前我们先看一张图片(图片来源于传智播客视频图片)。从图中可以了解一级缓存是sqlsession级别,二级缓存是映射器级别。在操作数据库时我们需要先构造sqlsession【默认实现是DefaultSqlSession。java】,在对象中有一个数据结构【hashmap】来存储缓存数据。不同的sqlsession区域是互不影响的。如果同一个sqlsession之间,如果多次查询之间执行了提交,则缓存失效,mybatis避免脏读。

  

 MyBatis延迟加载,一级缓存,二级缓存(详解)

  

好了,在看mybatis一级缓存时,我总是觉的一级缓存有点鸡肋,两个查询如果得到一样的数据,你还会执行第二次么,果断引用第一次的返回值了。可能还没了解到一级缓存的奥妙之处。一级缓存默认是开启的,不需要额外设置,直接使用。

MyBatis延迟加载,一级缓存,二级缓存(详解)