使用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>
前面提到延迟加载只能通过协会收集来实现,因为只有存在关联关系映射的业务场景里你才需要延迟加载,也叫懒加载,也就是常说的用的时候再去加载对吧,那么我们来配一个协会来实现:
我来编写一个加载博客列表的同时加载出博客额作者,主要功能点在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 (); } }
从图一中看出,执行selectBlogAuthor返回List
了解缓存前我们先看一张图片(图片来源于传智播客视频图片)。从图中可以了解一级缓存是sqlsession级别,二级缓存是映射器级别。在操作数据库时我们需要先构造sqlsession【默认实现是DefaultSqlSession。java】,在对象中有一个数据结构【hashmap】来存储缓存数据。不同的sqlsession区域是互不影响的。如果同一个sqlsession之间,如果多次查询之间执行了提交,则缓存失效,mybatis避免脏读。
好了,在看mybatis一级缓存时,我总是觉的一级缓存有点鸡肋,两个查询如果得到一样的数据,你还会执行第二次么,果断引用第一次的返回值了。可能还没了解到一级缓存的奥妙之处。一级缓存默认是开启的,不需要额外设置,直接使用。