Mybatis源码分析
一:mybatis的使用
1.mybatis的入口
package mybatis;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
/**
* @Author bluesnail95
* @Date 2020/7/19 9:01
* @Description
*/
public class TestMybatis {
public static void main(String[] args) {
String resource = "mybatis.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
Map<String,Object> objectMap = sqlSession.selectOne("mybatis.BlogMapper.selectBlog", 1);
System.out.println(objectMap);
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.配置文件的配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://193.112.47.238:3306/blog"/>
<property name="username" value="root"/>
<property name="password" value="19950821abc"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mybatis/BlogMapper.xml"/>
</mappers>
</configuration>
二:IDEA如何下载源码
1.IDEA的配置
2.Maven更新
右键mavne–>reimport
3.Download sources
Ctrl + Alt + B 可以进入一个类的源码文件,如果进入的是一个classes文件,可以点击窗口右上角的【download sources】进行下载。
三:源码分析
1.获取数据源
创建SqlSessionFactoryBuilder对象,然后调用它的build方法,入参是配置文件的输入流。再调用build的重载方法。
再调用XMLConfigBuilder的parse方法对配置文件进行解析。
调用praseConfiguration方法对<configuration></configuration>
节点下的子节点进行解析。
调用environmentsElement方法解析<environments></environments>
标签;
调用dataSourceElement方法解析<dataSource></dataSource>
标签;
调用Configuration的setEnvironment保存拿到的数据源信息。
2.获取sql
mybatis有4种加载mapper文件的方式。参看官方文档:
调用XMLConfigBuilder的mapperElement方法解析<mapper></mapper>
标签。可以看到,mybatis会优先处理<package/>
标签的资源。
再调用XMLMapperBuilder的parse方法进行解析。
调用XMLStatementBuilder的parseStatementNode方法;
调用MapperBuilderAssistant的addMappedStatement方法;
再调用Configuration的addMappedStatement保存得到的MappedStatement;
3.SQL的执行
调用DefaultSqlSessionFactory的openSession方法。
再调用openSessionFromDataSource方法。
查看Configuration的newExecutor方法可以知道,当执行器是null时,会使用Simple作为默认执行器。
mybatis有3种执行器,包括SIMPLE,REUSE,BATCH。
变量cacheEnabled表示是否开启一级缓存,默认是true。
调用DefaultSqlSession的selectOne方法。selectOne的底层是调用的selectList方法,再取list的第一个元素。
调用CachingExecutor的query方法获取结果集。
调用BaseExecutor的createCacheKey方法获取缓存Key
调用BaseExecutor的query方法,如果缓存中存在,从缓存中获取结果;如果缓存中不存在,就从数据库查询结果。
调用BaseExecutor的queryFromDatabase方法,把获取的结果集和请求的入参存在缓存中。
我们这里使用的是默认的执行器SimpleExecutor,所以调用SimpleExecutor的doQuery方法。
查看prepareStatement方法,获取了java.sql.Connection
调用PreparedStatementHandler的query方法;
调用的DefaultResultSetHandler的handleResultSets方法
查看getFirstResultSet方法;再调用new ResultSetWrapper();