详解MyBatis工作原理

 更新时间:2021年05月31日 11:36:45   作者:明了LM  
近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,本文就详细总结了MyBatis工作原理,,需要的朋友可以参考下

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

相关文章

  • SpringBoot实现图片识别文字的四种方式小结

    SpringBoot实现图片识别文字的四种方式小结

    本文主要介绍了SpringBoot实现图片识别文字的四种方式,包括Tess4J,百度智能云,阿里云,腾讯云这四种,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Action访问Servlet的API的简单实例

    Action访问Servlet的API的简单实例

    下面小编就为大家带来一篇Action访问Servlet的API的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • java报错Cause: java.sql.SQLException问题解决

    java报错Cause: java.sql.SQLException问题解决

    本文主要介绍了java报错Cause: java.sql.SQLException问题解决,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • Java虚拟机运行时数据区域汇总

    Java虚拟机运行时数据区域汇总

    这篇文章主要给大家介绍了关于Java虚拟机运行时数据区域的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • nacos中的配置使用@Value注解获取不到值的原因及解决方案

    nacos中的配置使用@Value注解获取不到值的原因及解决方案

    这篇文章主要介绍了nacos中的配置使用@Value注解获取不到值的原因分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • SpringBoot整合Apache Pulsar教程示例

    SpringBoot整合Apache Pulsar教程示例

    这篇文章主要为大家介绍了SpringBoot整合Apache Pulsar教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Spring技巧之如何动态读取配置文件

    Spring技巧之如何动态读取配置文件

    这篇文章主要介绍了Spring技巧之如何动态读取配置文件的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • java8 stream排序以及自定义比较器方式

    java8 stream排序以及自定义比较器方式

    这篇文章主要介绍了java8 stream排序以及自定义比较器方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • myBatis使用@GeneratedValue(generator = “...“, strategy = ...)注解

    myBatis使用@GeneratedValue(generator = “...“, strategy = 

    这篇文章主要介绍了myBatis使用@GeneratedValue(generator = “...“, strategy = ...)注解问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 利用SpringMVC和Ajax实现文件上传功能

    利用SpringMVC和Ajax实现文件上传功能

    这篇文章主要为大家详细介绍了利用SpringMVC和Ajax实现文件上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08

最新评论