MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。那么,MyBatis底层源码到底时什么样的结构呢?
首先,mybatis的实现主要依赖于以下四句代码:
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
我们接下来逐句进行分析:
1.Resources资源工具类
这里我们通过Resources资源工具类,通过getResourceAsStream读取参数列表中的资源文件,在读取过程中,调classloaderWrapper,然后通过对classLoader[]数组的遍历 然后进行判断 类加载器中所读的流是否为null如果不为null 则返回InputStream对象。
2.SqlsessionFactory获取核心对象
SqlsessionFactory是mybatis的核心对象,获取核心对象的方式SqlsessionFactoryBuilder构建。SqlsessionFactory 实例通过Xpath解析的方式去解析mybatis-config.xml 文件解析的文件内容套接到configuration中 而这个configuration 相当于 mybatis-config.xml 中的配置文件所对应的类。返回DefaultSqlSessionFactory对象。
3.获取SqlSession对象
要获取SqlSession对象,通过DefaultSqlSessionFactory对象调用它里面opensession方法返回DefaultSQLSession对象,调用的是DefaultSqlSessionFactory类中opensessionFromDataSource。声明一个事务的对象,通过配置文件去读取环境标签的信息,然后通过环境去获取事务工厂对象,通过dataSource的配置获取事务的对象,再根据事务执行器的类型 去创建事务执行器 Executor(相当于Statement)通过执行器 事务自动提交以及配置文件对象 返回 DefaultSqlSession对象。
4、通过sqlsession获取相应Mapper
第一层通过调用sqlsession中getMapper方法,第二层通过调用配置中的getMapper方法,第三层通过映射的注册器中的getMapper方法来进行获取相应的Mapper对象其中使用了MapperProxyFactory 工厂对象来获取 MapperProxy 在里面使用反射和动态代理的方式来获取最终的mapper对象。