一、Mybatis工作原理
Mybatis分层框架图

Mybatis工作原理图

源码分析:一般都是从helloworld入手
1、根据xml配置文件(全局配置文件mybatis-config.xml)创建一个SqlsessionFactory对象,mybatis-config.xml有数据源一些环境信息
2、sql映射文件EmployeeMapper.xml配置了每一个sql,以及sql的封装规则等。
3、将sql映射文件注册在全局配置文件中
4、写代码:
- 根据全局配置文件得到sqlsessionFactory
- 使用SqlSession工程进行crud、sqlseesion就代表和数据库进行会话,用完close
- 使用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、执行增删改查方法:
- 调用的是defaultSqlsesion的增删改查(会调用Executor的crud)
- 会创建一个statementhandler对象(同时也会创建出parameterHandler和resultSetHandler)
- 调用StatementHandler的prepareStatement()方法进行预编译handler.prepare()和参数设置handler.parameterize(stmt)
- 设置完成后调用StatementHandler的增删改查方法query()
- 参数预编译完成后使用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;
- }
到此这篇关于详解MyBatis工作原理的文章就介绍到这了,更多相关MyBatis工作原理内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!