Mybatis源码解析

学习Mybatis源码之前,我们先了解下Mybatis是什么?

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

Mybatis框架主要由以下四段代码为主,下来我们来看一下:

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

执行流程

1.获取传入的xml文件的输入流

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

  • 先调用Resources中的单个String参数的getResuorceAsStream(String resource)方法,传入mybatis-config.xml文件。
  • 该方法里面又调用了本类中的两个参数的getResuorceAsStream(ClassLoader loader,String resource)方法。
  • 此方法里面再调用classLoaderWrapper中的getResourceAsStream(String resource, ClassLoader classLoader)方法,然后这个方法里面再调用了本类中的getResourceAsStream(String resource, ClassLoader[ ] classLoader)方法,可以看到这里传入的第二个参数是ClassLoader类加载器数组。
  • 通过对classLoader[ ]数组进行,然后进行判断,看类加载器中所读的流是否为null,如果不为null,最后则返回InputStream对象。

2.获取SqlSessionFactory对象

  • 创建完SqlSessionFactoryBuilder对象之后,调用build(InputStream inputStream)方法。
  • 再调用本类带三个参数的重载的build(InputStream inputStream, String environment, Properties properties)方法。
  • 然后创建解析器parser,通过Xpath解析的方式去解析mybatis-config.xml 文件。
  • 把配置文件的信息解析并保存在Configuration对象中,这个Configuration对象相当于 mybatis-config.xml 中的配置文件所对应的类。
  • 最后返回包含Configuration的DefaultSqlSession对象。

3.获取SqlSession对象

  • 通过之前返回的DefaultSqlSessionFactory对象,调用它的openSession()方法。
  • 再调用本类中的openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit)方法。
  • 创建事务tx,获取environment信息,通过environment构建出transactionFactory事务工厂,再通过事务工厂对事物进行设置。
  • newExecutor(),根据Executor在全局配置中的类型,创建出对应的执行器。如果有二级缓存配置开启,创建CachingExecutor(executor)。
  • 通过Executor、事务自动提交以及配置文件对象(Configuration)返回 DefaultSqlSession对象。

4.获取mapper

  • 调用DefaultSqlSession中getMapper(Class<T> type)方法。
  • 再调用Configuration中的getMapper(Class<T> type, SqlSession sqlSession)方法。
  • 再调用MapperRegistry中的getMapper(Class<T> type, SqlSession sqlSession)方法。
  • 调用mapperProxyFactory中的newInstance(SqlSession sqlSession)方法获取一个MapperProxy对象mapperProxy。
  • 根据mapperProxy调用newInstance(MapperProxy<T> mapperProxy),创建出MapperProxy的代理对象并且返回。
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页