mybatis实现原理深度理解

先放一张图,让大家简单认识一下:

mybatis实现原理深度理解_第1张图片

1、解析xml的时候

首先,Mybatis在初始化SqlSessionFactoryBean的时候,找到mapperLocations路径去解析里面所有的XML文件

2、创建sqlsource

Mybatis会把每个SQL标签封装成SqlSource对象。然后根据SQL语句的不同,又分为动态SQL和静态SQL。其中,静态SQL包含一段String类型的sql语句;而动态SQL则是由一个个SqlNode组成

3、创建mappedStatement

XML文件中的每一个SQL标签就对应一个MappedStatement对象,这里面有两个属性很重要。
id
全限定类名+方法名组成的ID。
sqlSource
当前SQL标签对应的SqlSource对象。
创建完MappedStatement对象,将它缓存到Configuration#mappedStatements中。
Configuration对象,我们知道它就是Mybatis中的大管家,基本所有的配置信息都维护在这里。把所有的XML都
解析完成之后,Configuration就包含了所有的SQL信息。
到目前为止,XML就解析完成了。看到上面的图示,聪明如你,也许就大概知道了。当我们执行Mybatis方法的时
候,就通过全限定类名+方法名找到MappedStatement对象,然后解析里面的SQL内容,执行即可。

4、dao接口代理

你的项目是基于SpringBoot的,那么肯定也见过这种:
@MapperScan("com.xxx.dao")
它们的作用是一样的。将包路径下的所有类注册到Spring Bean中,并且将它们的beanClass设置为
MapperFactoryBean。有意思的是,MapperFactoryBean实现了FactoryBean接口,俗称工厂Bean。那么,当我
们通过@Autowired注入这个Dao接口的时候,返回的对象就是MapperFactoryBean这个工厂Bean中的
getObject()方法对象。
那么,这个方法干了些什么呢?
简单来说,它就是通过JDK动态代理,返回了一个Dao接口的代理对象,这个代理对象的处理器是MapperProxy对
象。所有,我们通过@Autowired注入Dao接口的时候,注入的就是这个代理对象,我们调用到Dao接口的方法时,
则会调用到MapperProxy对象的invoke方法。

5、执行

当我们调用Dao接口方法的时候,实际调用到代理对象的invoke方法。
在这里,实际上调用的就是SqlSession里面的东西了
public class DefaultSqlSession implements SqlSession {
   public  List selectList(String statement, Object parameter, RowBounds rowBounds) {
        try {
            MappedStatement ms = configuration.getMappedStatement(statement); 
            return executor.query(ms, 
                wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER); 
        }
    }
}

它就是通过statement全限定类型+方法名拿到MappedStatement 对象,然后通过执行器Executor去执行具体SQL并返回

 

你可能感兴趣的:(j2ee)