一、Mybatis工作原理
Mybatis分层框架图
Mybatis工作原理图
源码分析:一般都是从helloworld入手
1、根据xml配置文件(全局配置文件mybatis-config.xml)创建一个SqlsessionFactory对象,mybatis-config.xml有数据源一些环境信息
2、sql映射文件EmployeeMapper.xml配置了每一个sql,以及sql的封装规则等。
3、将sql映射文件注册在全局配置文件中
4、写代码:
4.1.根据全局配置文件得到sqlsessionFactory
4.2.使用SqlSession工程进行crud、sqlseesion就代表和数据库进行会话,用完close
4.3.使用sql标识告知mybatis来执行哪个sql,sql都是保存在sql映射文件中
测试类SqlSessionFactoryBuilder处打断点
/**
* 1、根据xml配置文件(全局配置文件mybatis-config.xml)创建一个SqlsessionFactory对象,mybatis-config.xml有数据源一些环境信息
* 2、sql映射文件EmployeeMapper.xml配置了每一个sql,以及sql的封装规则等。
* 3、将sql映射文件注册在全局配置文件中
* 4、写代码:
* 4.1.根据全局配置文件得到sqlsessionFactory
* 4.2.使用SqlSession工程进行crud,sqlseesion就代表和数据库进行会话,用完close
* 4.3.使用sql标识告知mybatis来执行哪个sql,sql都是保存在sql映射文件中
*
* @throws IOException
*/
@Test
public void test() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2、获取SqlSession实例,能直接执行已经映射了的sql语句,selectOne:sql唯一标识,执行sql要用到的参数
SqlSession openSession = sqlSessionFactory.openSession();
try {
Employee employee = openSession.selectOne("com.ming.dao.EmployeeMapper.getEmpByID", 1);
System.out.println(employee);
} finally {
openSession.close();
}
}
1、获取SqlsessionFactory对象
XPathParser作用:用dom解析mybatis-config.xml标签的configuration标签
public Configuration parse() {
if (parsed) {
throw new BuilderException("Each XMLConfigBuilder can only be used once.");
}
parsed = true;
parseConfiguration(parser.evalNode("/configuration"));
return configuration;
}
一个MappedStatement对象代表一个增删改查标签的详细信息(id sqlResource等)
全局configuation的一个重要属性MappedStatement
KonwnMappers生成一个Mapper接口的代理工厂
总结:
第一步:根据mybatis-config.xml全局配置文件创建SqlSessionFactory对象、就是把配置文件的详细信息解析保存在了configuration对象中,返回包含了configuration的defaultSqsessionFactory对象
注意:mappedSatement对象代表一个增删改查的详细标签
2、获取sqlsession对象
mybatis-openSession
总结:返回sqlsession的实现类defaultSqlsession对象,defaultSqlsession对象包含了executor和configuration,Executor(四大对象)对象会在这一步被创建
3、获取Mapper接口代理对象(MapperProxy)
返回getMapper接口的代理对象、包含了SqlSession对象
4、执行增删改查方法
查询流程
@Test
public void testInterface() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
Employee employee = employeeMapper.getEmpByID(1);
System.out.println(employee);
Employee employee2 = employeeMapper.getEmpByID(5);
System.out.println(employee2);
System.out.println(employee==employee2);
}finally {
sqlSession.close();
}
}
二、Mybatis运行原理总结
1、根据配置文件(全局、SQL映射文件)初始化出configuration对象
2、创建一个defaultSqlSession对象,它里面包含configuration和executor(根据配置文件中的defaultEXecutorType创建出对应的Executor)
3、defaultSqlSession.getMapper()获取Mapper接口对应的MapperProxy
4、MapperProxy里面有defaultSqlSession
5、执行增删改查方法:
1、调用的是defaultSqlsesion的增删改查(会调用Executor的crud)
2、会创建一个statementhandler对象(同时也会创建出parameterHandler和resultSetHandler)
3、调用StatementHandler的prepareStatement()方法进行预编译handler.prepare()和参数设置handler.parameterize(stmt)
4、设置完成后调用StatementHandler的增删改查方法query()
5、参数预编译完成后使用resultSetHandler封装结果集
注意:四大对象每个创建的时候都有一个interceptorChain.pluginAll()方法
例如StatementHandler 对象的创建
StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);
public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
StatementHandler statementHandler = new RoutingStatementHandler(executor, mappedStatement, parameterObject, rowBounds, resultHandler, boundSql);
statementHandler = (StatementHandler) interceptorChain.pluginAll(statementHandler);
return statementHandler;
}
转载:https://blog.csdn.net/qq_29445811/article/details/117286842