首页 > 其他分享 >mybatis-执行器

mybatis-执行器

时间:2023-06-25 15:46:22浏览次数:36  
标签:执行器 语句 对象 ReuseExecutor Statement SQL mybatis 执行

MyBatis 中的 Executor 接口有三个实现类:

  1. SimpleExecutor:SimpleExecutor 是最简单的 Executor 实现。它每次执行 SQL 语句时都会创建一个新的 Statement 对象。这种实现方式的缺点是效率较低,因为每次执行 SQL 语句都需要创建一个新的 Statement 对象。

  2. ReuseExecutor:ReuseExecutor 是 MyBatis 中的默认 Executor 实现。它会在执行 SQL 语句时重用 Statement 对象。这种实现方 式可以提高效率,因为重用 Statement 对象可以减少对象创建的开销。

  3. BatchExecutor:BatchExecutor 是 MyBatis 中的批处理 Executor 实现。它可以将多个 SQL 语句一起发送到数据库,从而减少网络传输的开销。这种实现方式可以提高效率,特别是在需要执行大量 SQL 语句时。

在 MyBatis 中,Executor 是 SqlSession 的一个重要组成部分。每个 SqlSession 都有一个对应的 Executor,用于执行 SQL 语句。SqlSession 提供了一些方法,如 select、insert、update、delete 等,用于执行 SQL 语句。当调用这些方法时,SqlSession 将会委托 Executor 执行 SQL 语句,并将结果映射到 Java 对象中。

MyBatis 的 SimpleExecutor 是 MyBatis 中最简单的 Executor 实现之一。它在每次执行 SQL 语句时都会创建一个新的 Statement 对 象,然后执行 SQL 语句并将结果映射到 Java 对象中。

SimpleExecutor 的实现比较简单,主要包括以下几个步骤:

  1. 创建 Statement 对象:在执行 SQL 语句之前,SimpleExecutor 会先创建一个 Statement 对象。

  2. 设置参数:SimpleExecutor 会将 SQL 语句中的参数设置到 Statement 对象中。

  3. 执行 SQL 语句:SimpleExecutor 会执行 SQL 语句,并将结果保存到 ResultSet 对象中。

  4. 处理结果集:SimpleExecutor 会将 ResultSet 对象中的数据映射到 Java 对象中,并返回结果。

SimpleExecutor 的实现比较简单,但效率较低。因为每次执行 SQL 语句都需要创建一个新的 Statement 对象,这会增加对象创建的开 销。如果需要执行大量 SQL 语句,建议使用其他 Executor 实现,如 ReuseExecutor 或 BatchExecutor,以提高效率。

在 JDBC 中,Statement 是执行 SQL 语句的核心对象之一。根据 Statement 的不同特点,可以将其分为以下三种类型:

  1. Statement:最基本的 Statement 对象,用于执行静态 SQL 语句。每次执行 SQL 语句时,都需要将完整的 SQL 语句传递给数据库进行编译和执行。由于每次执行 SQL 语句都需要编译,因此在执行大量 SQL 语句时效率较低。

  2. PreparedStatement:继承自 Statement,用于执行预编译的 SQL 语句。在创建 PreparedStatement 对象时,会将 SQL 语句发送给 数据库进行编译,然后将编译后的 SQL 语句保存在 PreparedStatement 对象中。在执行 SQL 语句时,只需要将参数传递给 PreparedStatement 对象即可,不需要再次编译 SQL 语句,因此效率比 Statement 高。

  3. CallableStatement:继承自 PreparedStatement,用于执行存储过程。与 PreparedStatement 不同的是,CallableStatement 可以 返回多个结果集,可以使用 OUT 或 INOUT 参数来传递参数和获取返回值。

除了上述三种类型的 Statement,还有一种批处理的 Statement,即 BatchStatement。BatchStatement 可以将多个 SQL 语句一次性发 送给数据库执行,以提高效率。

在使用 Statement 时,需要注意以下几点:

  1. 避免使用 Statement 执行动态 SQL 语句,以免引发 SQL 注入攻击。

  2. 尽量使用 PreparedStatement 执行 SQL 语句,以提高效率和安全性。

  3. 在执行大量 SQL 语句时,可以使用 BatchStatement 批处理,以提高效率。

MyBatis 的 ReuseExecutor 是一种可重用的 Executor 实现,它可以重复使用 Statement 对象,以提高执行 SQL 语句的效率。

在 ReuseExecutor 中,每个 Statement 对象都会被缓存起来,以便下次执行相同的 SQL 语句时可以直接重用该 Statement 对象,而不需要重新创建。当一个 Statement 对象被缓存起来时,它的参数和结果集都会被清空,以便下次执行时可以重新设置参数和获取结果。

ReuseExecutor 的实现比较简单,主要包括以下几个步骤:

  1. 从缓存中获取 Statement 对象:在执行 SQL 语句之前,ReuseExecutor 会先从缓存中获取一个可重用的 Statement 对象。

  2. 设置参数:ReuseExecutor 会将 SQL 语句中的参数设置到 Statement 对象中。

  3. 执行 SQL 语句:ReuseExecutor 会执行 SQL 语句,并将结果保存到 ResultSet 对象中。

  4. 处理结果集:ReuseExecutor 会将 ResultSet 对象中的数据映射到 Java 对象中,并返回结果。

  5. 将 Statement 对象缓存起来:在执行完 SQL 语句之后,ReuseExecutor 会将该 Statement 对象缓存起来,以便下次执行相同的 SQL 语句时可以直接重用。

ReuseExecutor 的实现比 SimpleExecutor 更加高效,因为它可以重复使用 Statement 对象,避免了每次创建 Statement 对象的开销。但是,由于 Statement 对象是可变的,因此在多线程环境下需要进行同步处理,以避免线程安全问题。

在使用 ReuseExecutor 时,需要注意以下几点:

  1. 避免在多线程环境下使用 ReuseExecutor,或者使用同步机制保证线程安全。

  2. 避免使用 Statement 执行动态 SQL 语句,以免引发 SQL 注入攻击。

  3. 尽量使用 PreparedStatement 执行 SQL 语句,以提高效率和安全性。

标签:执行器,语句,对象,ReuseExecutor,Statement,SQL,mybatis,执行
From: https://www.cnblogs.com/shuanger/p/17503039.html

相关文章

  • Could not resolve type alias 'com.github.mybatis.helper.page.PageSqlInterceptor'
    报错信息 Couldnotresolvetypealias'com.github.mybatis.helper.page.PageSqlInterceptor'.Cause:java.lang.ClassNotFoundException:Cannotfindclass:com.github.mybatis.helper.page.PageSqlInterceptor 原因报错的位置是 mybatis-config.xml 文件中......
  • Mybatis Plus逆向工程
    MybatisPlus逆向工程连接mysql数据库选中对应的数据库表,生成逆向工程......
  • day112 - mybatis的查询与特殊sql语句
    mybatis查询与特殊语句查询普通语句/***根据id查询用户信息*@paramid*@return*/UsergetUserById(@Param("id")Integerid);​<!--UsergetUserById(@Param("id")Integerid);--><selectid="getUserById"resultType="com.......
  • 分页插件【MybatisPlus】
    //mybatisplus分页插件@BeanpublicMybatisPlusInterceptormybatisPlusInterceptor(){//1创建MybatisPlusInterceptor拦截器对象MybatisPlusInterceptormpInterceptor=newMybatisPlusInterceptor();//2添加分页拦截器......
  • 适合新手的12个Mybatis-Plus常用注解
    mybatis-plus简介MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。愿景是成为MyBatis最好的搭档!官方地址:https://baomidou.com/文档发布地址:https://baomidou.com/pages/24112f常用注解(12个)1、@MapperScan......
  • Mybatis理解
    转载自(76条消息)1、mybatis是什么?为什么要用mybatis?_chaizepeng的博客-CSDN博客,持续补充。对于初学者,如果进行mybatis的学习呢?我总结了几点,会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点;当知道了为什么的时候就开始了......
  • MyBatis-Plus公共字段填充
    在实体类的属性上加入@TableField注解,指定自动填充的策略@TableField(fill=FieldFill.INSERT)//插入时填充字段privateLocalDateTimecreateTime;@TableField(fill=FieldFill.INSERT_UPDATE)//插入和更新时填充字段privateLocalDateTimeupdateTim......
  • Mybatis 开发使用总结2023
    Mybatis一。入门1.mybatis:是一款优秀的持久化框架,用于简化JDBC的开发。2.JDBC3.数据库连接池4.lombok二。mybatis的基础增删改查操作1.驱动:com.mysql.cj.jdbc.Driver2.url:jdbc:mysql://localhost:3306/mybatis3.user:root4.password:123三。mybatis动态sql1.创建sp......
  • day111 - mybatis中的参数问题
    mybatis中的参数问题样例:根据用户名查询用户信息mybatis中获取参数值的方式有两种#{}和${}1.若mapper接口方法的参数为单个的字面量类型UsergetUserByUsername(Stringusername); <!--UsergetUserByUsername(Stringusername);--><selectid="getUserByUsername"re......
  • MyBatis-Plus 实现动态字段排序
    场景虽然前端能根据返回的数组进行对字段的排序,但也仅局限于实现当前页的排序,无法满足全部数据的排序,所以需要走接口的查询进行排序,获取最全的排序数据。业务需求思路前端需传递排序的字段,该字段是正序还是倒叙。可能存在多个,所以字段为字符串数组,可以通过逗号分开。后端拿......