经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MyBatis » 查看文章
详解MyBatis工作原理
来源:jb51  时间:2021/5/31 13:04:45  对本文有异议

一、Mybatis工作原理

Mybatis分层框架图

在这里插入图片描述

Mybatis工作原理图

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

源码分析:一般都是从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. /**
  2. * 1、根据xml配置文件(全局配置文件mybatis-config.xml)创建一个SqlsessionFactory对象,mybatis-config.xml有数据源一些环境信息
  3. * 2、sql映射文件EmployeeMapper.xml配置了每一个sql,以及sql的封装规则等。
  4. * 3、将sql映射文件注册在全局配置文件中
  5. * 4、写代码:
  6. * 4.1.根据全局配置文件得到sqlsessionFactory
  7. * 4.2.使用SqlSession工程进行crud,sqlseesion就代表和数据库进行会话,用完close
  8. * 4.3.使用sql标识告知mybatis来执行哪个sql,sql都是保存在sql映射文件中
  9. *
  10. * @throws IOException
  11. */
  12. @Test
  13. public void test() throws IOException {
  14. String resource = "mybatis-config.xml";
  15. InputStream inputStream = Resources.getResourceAsStream(resource);
  16. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  17. //2、获取SqlSession实例,能直接执行已经映射了的sql语句,selectOne:sql唯一标识,执行sql要用到的参数
  18. SqlSession openSession = sqlSessionFactory.openSession();
  19. try {
  20. Employee employee = openSession.selectOne("com.ming.dao.EmployeeMapper.getEmpByID", 1);
  21. System.out.println(employee);
  22. } finally {
  23. openSession.close();
  24. }
  25. }

1、获取SqlsessionFactory对象

XPathParser作用:用dom解析mybatis-config.xml标签的configuration标签

  1. public Configuration parse() {
  2. if (parsed) {
  3. throw new BuilderException("Each XMLConfigBuilder can only be used once.");
  4. }
  5. parsed = true;
  6. parseConfiguration(parser.evalNode("/configuration"));
  7. return configuration;
  8. }

在这里插入图片描述

一个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、执行增删改查方法

查询流程

  1. @Test
  2. public void testInterface() throws IOException {
  3. SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
  4. SqlSession sqlSession = sqlSessionFactory.openSession();
  5. try {
  6. EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
  7. Employee employee = employeeMapper.getEmpByID(1);
  8. System.out.println(employee);
  9. Employee employee2 = employeeMapper.getEmpByID(5);
  10. System.out.println(employee2);
  11. System.out.println(employee==employee2);
  12.  
  13. }finally {
  14. sqlSession.close();
  15. }
  16. }

在这里插入图片描述
在这里插入图片描述

二、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 对象的创建

  1. StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);
  2. public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
  3. StatementHandler statementHandler = new RoutingStatementHandler(executor, mappedStatement, parameterObject, rowBounds, resultHandler, boundSql);
  4. statementHandler = (StatementHandler) interceptorChain.pluginAll(statementHandler);
  5. return statementHandler;
  6. }

到此这篇关于详解MyBatis工作原理的文章就介绍到这了,更多相关MyBatis工作原理内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号