详解MyBatis工作原理
一、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工作原理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!