Mybatis源码分析

  • Post author:
  • Post category:其他


我们主要从下面4行代码来对Mybatis的底层源码进行分析

InputStream is=Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
SqlSession session=factory.openSession();
ClassMapper mapper=session.getMapper(ClassMapper.class);


1.获取XML文件的输入流

InputStream is=Resources.getResourceAsStream("mybatis-config.xml");

该部分流程图

(1)首先Rescources 源调用

getR


esources


(String resources)加载配置文件


(2)再调用的过程中发现调用了类的加载器getResourceAsStream


(


classLoader


loader,String


resources)


(3)在调用加载器的过程中发现调用的是classLoaderWrapper中getResourceAsStream


(String


rescource,ClassLoader


classLoader)里面的数组getResourceAsStream


(String


resource,ClassLoader


[]


classLoader


)


数组中还有ClassLoaderWrappper中成员变量默认的类加载器,当前对象的类加载器以及系统类加载器,五个类加载器

 ClassLoader[] getClassLoaders(ClassLoader classLoader) {
    return new ClassLoader[]{
        classLoader,
        defaultClassLoader,
        Thread.currentThread().getContextClassLoader(),
        getClass().getClassLoader(),
        systemClassLoader};
  }


(4)最后通过对该数组进行判断,看类加载器中所读的流是否为null,如果不为null,则返回InputStream对象



2.获取SqlSessionFactory对象

SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);

该部分流程图

(1)通过创建SqlsessionFactoryBuilder对象获取sqlsessionfactory 对象

(2)创建完之后调用 build(InputStream inputStream)方法,接着调用build(InputStream inputStream, String environment, Properties properties)方法

(3)构建parser创建Xpath解析去解析mybatis-config.xml文件

(4)解析的文件内容套接到configuration中 而这个configuration 相当于 mybatis-config.xml 中的配置文件所对应的类。

(5)最后返回DefaultSqlSessionFactory对象


3.获取SqlSession对象

SqlSession session=factory.openSession();

该部分流程图

(1) 通过DefaultSqlSessionFactory对象调用它里面opensession方法返回DefaultSQLSession对象

(2)调用的是

openSessionFromDataSource


(


ExecutorType


execType


,


TransactionIsolationLevel


level


,



boolean




autoCommit




)

该方法下有三个参数 第一个执行器的类型  第二个 事务的隔离级别 第三个 是否自动提交

(3)声明一个事务的对象,通过配置文件去读取环境标签的信息,然后通过环境去获取事务工厂对象

(4)创建相应的执行器newExcutor()

(5)返回 DefaultSqlSession对象。


4.获取mapper

ClassMapper mapper=session.getMapper(ClassMapper.class);

该部分流程图

(1)调用efauitDsqlsession中getMapper方法

(2)接着

调用


configuration





getMapper





Class<T>


type,Sqlsession


sqlSessio


n





方法


(3)再调用


MapperRegistry


中的


getMapper


(Class<T>


type,Sqlsession


sqlSession


)


方法


(4)接着通过

MapperProxyFactory 工厂对象来获取 MapperProxy 在里面使用反射和动态代理的方式来获取最终的mapper对象。



版权声明:本文为weixin_44318477原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。