发表于: 2018-01-26 19:54:40
1 678
今天做的事情:学了下懒加载,发现这玩意真的是不好实现....
查了非常多的资料,我总结一下,懒加载的意义、一些原理,和实现步骤。
懒加载的概念和意义:网上的长篇大论很多,我归纳下用自己的话描述一遍:当webapp的体量较大,业务量比较繁忙的时候,为了减少不必要的信息查询,减轻数据库负担,采取“设置某部分信息先不加载,直到一些特定操作(鼠标点击等)后,才延迟加载”的方法,叫做懒加载。
关键原理:采取动态代理的方式,拆分联表查询的sql语句,使之在不同的时间点执行查询。
实现步骤:网上实现懒加载的方法一大堆...但很多只是停留在service/dao层的....实际投入使用,把功能呈现给用户,至少要做到三步:
1、在settings标签中开启懒加载开关,扩展mybatis配置。关于这个,我在任务一中有过应用,通过加载本地mybatis.xml的方法,实现自动转驼峰的功能。然后配置*mapper.xml文件,配置相应的resultmap,然后写接口,在service和dao层实现功能。这个时候,可以做一下实验,获取一个关联对象,然后用反射的办法去获取其中的被关联对象,我们会发现这个成员变量是null,也就是说第二部分的sql语句还没开始执行。
2、第二步,通过contler层。据说,懒加载会在转json时抛异常,关于这一点我还没有做到,暂时放到一边。不过我看那些抛异常的都是Hibernate框架,导致原因是传进来的被关联对象实际上是一个继承了被关联对象的代理类。我用Mybatis(version 5.1.25)做下了实验,通过getClass().getSimpleName()的方式,发现成员变量并没有指向代理类,不知道什么原因,可能是Mybatis新版本解决了这个隐患吧。
3、前端工程师进行控件的编写。有些控件它可以设置为不显示,不加载(但是对应的部分依旧要被构造出来,不然可能就会报错),当进行某些特定的操作后,才会加载这些控件,触发额外的加载动作。这部分工作我们接触不到,了解一下就行了。
今天实战了下,成功做到根据一条优秀学员信息寻找其入学信息。
代码如下:
配置Mybatis扩展功能(setting标签),注意lazyLoadTriggerMethods属性:
比如,如果这里我删除了toString,那么尝试打印懒加载对象的时候就不会触发懒加载!!
而且经过本人亲测:
1、Mybatis会在尝试调用lazyLoadTriggerMethods指定的这些方法之前,完成懒加载!
2、该处支持正则表达式!比如get*,就会在尝试在调用get方法的时候进行懒加载!
GraduateMapper.xml配置:
为了测试懒加载是否生效,测试类如下,在查询得到Graduate和打印Graduate之间,sout了一句标志语句:
数据库数据如下:
日志开启debug模式,输入如下:
很明显地看到了两段sql语句执行的时间点不同!说明懒加载生效了!
明天要做的事情:把任务四的屁股擦干净...
今天遇到的问题:resultMap的用法挺麻烦的....不过听说是Mybatis最强大的功能,以后必须要深入。
今天的收获:学习了懒加载 了解了resultMap和resultType的优缺点
评论