zoukankan      html  css  js  c++  java
  • Mybatis Laz-Load功能实现代码赏析(原创)

    对于Mybatis 拥有的Lazy Load(有中文翻译成延迟加载)功能,应该很同学都有听说过,今天主要与大家一起来解读一下Mybatis在Lazy Load功能的实现的代码。Lazy Load实现的功能很好理解,就是在数据与对象进行Mapping操作时,只有当真正使用该对象时,才进行Mapping操作,以减少不必要的数据库查询开销,从而提升了程序的效率。

       首先就从配置部分讲起。(本文以Mybatis-3.0.5版本的源代码进行分析)

       在配置SqlSessionFactoryBean时,需要指定configLocation 属性,需要设置Mybatis Configuration对象的配置信息,其中有一个配置项目名为lazyLoadingEnabled的设置属性,就是用来开启或关闭MybatisLazy Load功能。默认设置是 false.  可以看一下 sqlmap-config.xml文件内容。

    Sqlmap-config.xml 文件在SqlSessionFactoryBean 初始化后,解析并加载到 org.apache.ibatis.session.Configuration 该对象上



    在 Configuration类的setLazyLoadingEnabled 方法的实现上,还可以很清楚的分析,Mybatis的lazy load功能是需要借助Cglib的代理功能来实现的。



    接下来,根据之前给大家讲Lazy Load的意义时,提供其解决的数据与对象进行Mapping操作时加载优化,那就找到了出现,只要找到Mybatis是如何对数据集与BO对象进行Mapping操作的实现,就应该可以定位与这个属性是如何来启动Lazy Load功能

    Mybatis 的Mapping操作都是由 org.apache.ibatis.executor.resultset.ResultSetHandler接口的handleResultSets方法来完成的。而且Mybatis只有一个类实现了这个接口 FastResultSetHandler.下面的分析方向很明确了,直接分析一下FastResultSetHandlerhandleResultSets方法

    下面就可以直接找到实现的代码重点,FastResultSetHandler 提供一个方法,来实现一行记录转成对象的功能。

     继续来看createResultObject方法



       从上面的代码,可以很明确的发现 ResultObjectProxy.createProxy是对BO对象进行的代理实现. 最后只要找到代理的回调实现(Callback),就可以分析出最终的Lazy Load的实现功能。里面的分析定位过程就不讲了,最终会找到EnhancedResultObjectProxyImpl类。其intercept方法,就是我们要分析的最终实现的代码。当BO对象的方法被调用时,就会触需要实施是否进行Lazy Load方式的加载。

    lazyLoader.size() 保存需要延迟加载属性列表的个数。

    lazyLoader.loadAll 就会触发ResultLoaderloadResult方法完成数据的加载实现。

    至此Mybatis的整个Lazy Load的功能介绍就到此了。总结一下,其实现的原理就是对BO对象,借助Cglib工具,对BO对象进行增强。然后在使用BO时,进行即时的检测,来完成数据的加载实现。
  • 相关阅读:
    Python: 什么是*args和**kwargs
    python实现获取电脑IP、主机名、Mac地址
    python操作oracle完整教程
    python连接oracle数据库报错"DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded: "解决方案
    ORACLE_BASE、ORACLE_HOME有什么区别
    Java的JAVA_HOME、Path、CLASSPATH环境变量小结,可以借助这三个的配置去理解Oracle中的那几个环境变量的配置作用
    python连接Oracle的方式以及过程中遇到的问题
    hadoop学习笔记(六):hadoop全分布式集群的环境搭建
    CentOS7安装jdk教程
    在线用户列表
  • 原文地址:https://www.cnblogs.com/duanxz/p/3824260.html
Copyright © 2011-2022 走看看