Mybatis执行流程、缓存机制、插件

这篇具有很好参考价值的文章主要介绍了Mybatis执行流程、缓存机制、插件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一.传统的JDBC连接数据库

二.Mybatis(ORM框架)

1.什么是ORM框架

2.Mybatis特性

三.MyBatis缓存机制

1.一级缓存

2.二级缓存

3.一二级缓存很鸡肋

四.Mybayis插件

插件的工作流程

多个插件的顺序

五.Mybatis执行流程

1.初始化解析配置文件

2.创建sqlSession会话

3.获取mapper代理对象

4.调用mapper中的方法


一.传统的JDBC连接数据库

流程:

  • 注册驱动
  • 获取连接创建Statement对象
  • execute方法执行SQL
  • 把结果集转换成POJO对象
  • 关闭资源

缺点:

  •  需要手动管理资源
  • 代码重复
  • 业务逻辑与数据操作的代码耦合
  • 结果集需要手动处理
public class JdbcTest {
    @Test
    public void testJdbc() throws IOException {
        Connection conn = null;
        Statement stmt = null;
        Student student = new Student();

        try {
            // 注册 JDBC 驱动
//             Class.forName("com.mysql.jdbc.Driver");

            // 打开连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/springdb", "root", "root");

            // 执行查询
            stmt = conn.createStatement();
            String sql = "SELECT id, name, age clazz_no FROM student where id = 1";
            ResultSet rs = stmt.executeQuery(sql);

            // 获取结果集
            while (rs.next()) {
                Integer id = rs.getInt("id");
                String name = rs.getString("name");
                Integer age = rs.getInt("age");
                Integer clazzNo = rs.getInt("clazz_no");
                Student.setClazzNo(clazzNo);
                Student.setId(id);
                Student.setName(name);
                Student.setAge(age);
            }
            System.out.println(student);

            rs.close();
            stmt.close();
            conn.close();
        } catch (SQLException se) {
            se.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (stmt != null) stmt.close();
            } catch (SQLException se2) {
            }
            try {
                if (conn != null) conn.close();
            } catch (SQLException se) {
                se.printStackTrace();
            }
        }
    }

二.Mybatis(ORM框架)

1.什么是ORM框架

O:对象        M:映射        R:关系型数据库

数据库中的一条数据对应Java中的一个对象

2.Mybatis特性:

  1. 使用连接池对连接进行管理
  2. SQL和代码分离,集中管理
  3. 参数映射和动态SQL
  4. 结果集映射
  5. 缓存管理
  6. 重复SQL的提取
  7. 插件机制

三.MyBatis缓存机制

一级缓存和二级缓存在主配置文件中默认都是开启的

<setting name="localCacheScope" value="SESSION"/>

在主配置文件设置一级缓存的作用域 默认就是SESION,如果value设为STATEMENT则相当于关闭了一级缓存

二级缓存有两个开关。总开关在主配置文件中,value改为false则关闭二级缓存

<setting name="cacheEnabled" value="true"/> 

第二个开关在mapper.xml中

<cache type="org.apache.ibatis.cache.impl.PerpetualCache"
       size="1024"
       eviction="LRU"
       flushInterval="120000"
       readOnly="false"/>

每个方法也有个控制的开关useCache,flushCache="true"清处二级缓存相应的数据

Mybatis执行流程、缓存机制、插件

1.一级缓存

localCache 作用域:session 也就是同一个SqlSession

Mybatis执行流程、缓存机制、插件

 一级缓存存在的问题:

当我们对数据做修改操作时,这条数据如果在一级缓存中就会被删除。

那么如果有两个SqlSession,一个是sqlSession1另一个是sqlSession2.假如在sqlSession1的一级缓存中已经存在了id=1的缓存数据,然后sqlSession2对id=1的这条数据进行修改,因为每个sqlSession有自己的Executor,所以sqlSession2的修改并不会影响sqlSession1中的缓存,所以sqlSession1的一级缓存中存放的是过时的数据,这时候二级缓存就发挥了作用

2.二级缓存

作用域:namespace也就是一同个mapper接口

如果开启了二级缓存的功能,就会给我们的Excutor加上装饰CachingExecutor

Mybatis执行流程、缓存机制、插件
二级缓存应该工作在一级缓存之前还是之后?  二级先
思考:基于作用范围,应该在什么对象中维护?

只有当事务提交后才会把数据保存到二级缓存,而且相对应的实体类要实现可序列化接口

3.一二级缓存很鸡肋

单机没有问题 但是服务都是分布式的
我们mybatis的缓存放在内存里面(如果没有引入redis的话)
但是引入redis,有点画蛇添足
redis 是db之外的缓存

四.Mybayis插件

MyBatis 允许使用插件来拦截的方法调用包括:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query)

插件的工作流程

以pageHelper为例,他会拦截我们的query()方法

Mybatis执行流程、缓存机制、插件

他会先生成Executor的代理类,然后拦截query执行代理类的invoke方法,然后会走到pageHelper实现Mybayis的Interceptor实现类(PageInterceptor)的interceptor方法 ,然后会执行PageHelper的分页逻辑,最后再执行method.invoke,也就是被代理类的方法。

多个插件的顺序

取决于我们配置在主配置文件中的插件定义顺序

Mybatis执行流程、缓存机制、插件

五.Mybatis执行流程

1.初始化解析配置文件

InputStream in = Resources.getResourceAsStream("mybatis-config.xml");

SqlSessionFactory factory =

new SqlSessionFactoryBuilder().build(in);

  1. 会先解析我们的主配置文件,XMLConfigBuild会解析标签封装成一个Configuration对象;
  2. XMLMapperBuild会解析我的mapper.xml文件,解析mapper节点,得到mapper节点的namespace赋值给currentNamespace
  3. 把mapper.xml中的sql语句解析然后封装成MapperedStatement(存放解析的select,delete.insert,update)。key是namespqce+id.
  4. 根据nameSpace拿到接口信息
  5. mapperRegistry把接口信息注册到knownMappers中,key为mapper接口的class,value为mapperProxyFactory工厂
  6. 最后new 了一个DefaultSqlSessionFactory工厂

2.创建sqlSession会话

 SqlSession sqlSession = factory.openSession();

  • 创建事务
  • 创建Executor基本类型(SIMPLE/REUSE/BATCH)
  • 二级缓存包装CachingExecutor(executor)
  • 拦截器包装Executor
  • new DefaultSqlSession

3.获取mapper代理对象

StudentDao studentMapper = sqlSession.getMapper(StudentDao.class);文章来源地址https://www.toymoban.com/news/detail-445030.html

  • configuration.getMapper(type, this);
  • mapperRegistry.getMapper(type, sqlSession);
  • knownMappers.get(type )->获取相应的mapperProxyFactory
  • mapperProxyFactory.newInstance 先new 一个mapperProxy。mapperProxy继承了InvocationHandler然后再进行了JDK动态代理

4.调用mapper中的方法

  • 会执行mapperProxy对象的invoke方法
  • 根据接口以及方法名,获取mappedStatement
  • 先找二级缓存
  • 没命中再一级缓存
  • 在没命中就JDBC执行sql操作

到了这里,关于Mybatis执行流程、缓存机制、插件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mybatis中的缓存机制(一文带你弄懂)

    缓存的作⽤:通过减少IO的⽅式,来提⾼程序的执⾏效率。 缓存就是指存在内存中的临时数据,使用缓存能够减少和数据库交互的次数,提高效率。将相同查询条件的sql语句执行一遍后得到的结果存在内存或者某种缓存介质中,当下次遇到一模一样的查询sql时候不在执行sql与

    2024年02月11日
    浏览(45)
  • MyBatis第八讲:MyBatis插件机制详解与实战

    MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能。那么拦截器拦截MyBatis中的哪些内容呢?本文是MyBatis第8讲,对MyBatis插件机制详解。

    2024年02月13日
    浏览(58)
  • MyBatis --- 缓存、逆向工程、分页插件

    一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问 使一级缓存失效的四种情况: 1、不同的SqlSession对应不同的一级缓存 2、同一个SqlSession但是查询条件不同 3、同一个SqlSession两次查询期

    2023年04月09日
    浏览(43)
  • mybatis源码学习之mybatis执行流程分析

    mybatis全局配置文件中涉及的标签如下图所示 下面我们来进行源码分析。 配置文件的解析创建SqlSessionFactory 配置文件的解析主要涉及到的类如下:XMLConfigBuilder、XPathParser、XPath、XNode,其中XPath、XNode是对 1、build方法内部首先会根据输入流等信息创建XMLConfigBuilder类的实例对象,

    2024年02月07日
    浏览(49)
  • MyBatis 执行流程分析

    上篇文章讲到 MyBatis入门 MyBatis 的基本入门案例我们实现了通过 MyBatis 去获取数据库的数据,那么他的基本流程如下: 第一步:是 从配置文件中根据配置的信息构建 SqlSessionFactory 对象 ,由于配置文件中关联了映射文件 UserMapper.xml ,所以在 SqlSessionFactory 中也存在映射文件的内

    2024年02月08日
    浏览(41)
  • 【SpringBoot + Mybatis系列】插件机制 Interceptor

    【SpringBoot + Mybatis系列】插件机制 Interceptor 在 Mybatis 中,插件机制提供了非常强大的扩展能力,在 sql 最终执行之前,提供了四个拦截点,支持不同场景的功能扩展 Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) ParameterHandler (getParameterObject, setParameters

    2024年02月16日
    浏览(43)
  • MyBatis 执行流程详解及示例代码

    MyBatis 是一个优秀的持久层框架,它简化了数据库操作的开发过程。本文将详细介绍 MyBatis 的执行流程,并提供相应的示例代码,帮助读者更好地理解和应用 MyBatis。 在 MyBatis 中,首先需要创建一个 SqlSessionFactoryBuilder 对象,并加载 MyBatis 的配置文件。这个对象用于构建 SqlS

    2024年02月11日
    浏览(45)
  • 【Mybatis源码解析】mapper实例化及执行流程源码分析

    基础环境:JDK17、SpringBoot3.0、mysql5.7 储备知识:《【Spring6源码・AOP】AOP源码解析》、《JDBC详细全解》 基于SpringBoot的Mybatis源码解析: 1.如何对mapper实例化bean 在加载BeanDefinition时,会将SqlSessionFactory、SqlSessionTemplate、MapperScannerConfigurer加载到注册表中,以供后续进行实例化。

    2024年02月01日
    浏览(41)
  • 【Java】JVM执行流程、类加载过程和垃圾回收机制

    JVM,就是Java虚拟机,Java的的程序都是运行在JVM当中。 程序在执行之前先要把java源代码转换成字节码(class文件),JVM 首先需要把字节码通过一定的方(类加载器(ClassLoader)) 把文件加载到内存中的运行时数据区(Runtime Data Area) ,而字节码文件是 JVM 的一套指令集规范,并

    2024年02月16日
    浏览(50)
  • 【JVM】JVM执行流程 && JVM类加载 && 垃圾回收机制等

    目录 🌷1、JVM是什么? 🌷2、JVM的执行流程(能够描述数据区5部分) 🌷3、JVM类加载过程 🌷4、双亲委派机制:描述类加载的过程 问题1:类加载器 问题2:什么是双亲委派模型?  问题3:双亲委派模型的优点 🌷5、垃圾回收机制(重要,针对的是堆)    问题1:判定对象

    2024年02月15日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包