要想解析源码,我们首先要知道什么是Mybatis
一、Mybatis的介绍
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
二、代码解析
他的主要的代码有四行
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlsessionfactor = new SqlSessionFactoryBuilder().build(is);
SqlSession session = sqlsessionfactor.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
咋们一行一行的看
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
这行代码的主要的作用就是将路径下的资源读取到流中
通过getResourceAsStream 读取资源文件 ,在读取的过程中 调用 classLoaderWrapper中的方法,然后通过对classLoader[]数组的遍历 ,然后进行判断 类加载器中所读的流是否为null,如果不为null 则返回InputStream对象
SqlSessionFactory sqlsessionfactor = new SqlSessionFactoryBuilder().build(is);
来啦来啦,重头戏来啦,SqlsessionFactory是mybatis的 核心对象,获取核心对象的方式
SqlsessionFactoryBuilder构建 SqlsessionFactory 实例,通过Xpath解析的方式去解析mybatis-config.xml 文件 解析的文件内容套接到configuration中 而这个configuration 相当于 mybatis-config.xml 中的配置文件所对应的类。返回DefaultSqlSessionFactory对象。
SqlSession session = sqlsessionfactor.openSession();
获取SQLsession对象
通过DefaultSqlSessionFactory对象调用它里面opensession方法返回DefaultSQLSession对象
调用的是DefaultSqlSessionFactory类中opensessionFromDataSource
该方法下有三个参数 第一个执行器的类型 第二个 事务的隔离级别 第三个 是否自动提交
声明一个事务的对象,通过配置文件去读取环境标签的信息,然后通过环境去获取事务工厂对象,通过dataSource的配置获取事务的对象,再根据事务执行器的类型 去创建事务执行器 Executor(相当于Statement)通过执行器 事务自动提交以及配置文件对象 返回 DefaultSqlSession对象。
UserMapper mapper = session.getMapper(UserMapper.class);
通过sqlsession获取相应Mapper
第一层通过调用sqlsession中getMapper方法
第二层通过调用配置中的getMapper方法
第三层通过映射的注册器中的getMapper方法来进行获取相应的Mapper对象
其中使用了MapperProxyFactory 工厂对象来获取 MapperProxy 在里面使用反射和动态代理的方式来获取最终的mapper对象。
总结:
1、根据配置文件(全局,sql映射)初始化出Configuration对象
2、创建一个DefaultSqlSession对象,
它里面包含Configuration以及Executor(根据全局配置文件中的defaultExecutorType创建出对应的Executor)
3、DefaultSqlSession.getMapper():拿到Mapper接口对应的MapperProxy;
4、MapperProxy里面有(DefaultSqlSession);
5、执行增删改查方法: