mybatis批量处理

一. 今天给大家分享关于mybatis的批量处理使用和源码分析,大家都知道mybatis是对JDBC的封装,其底层使用的还是JDBC, 所以我们先一起来了解JDBC 的批处理代码如下

 public static void main(String[] args) {
        try {
            Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/gateway-test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false&allowMultiQueries=true",
                    "root", "root");
            String basicSql = "insert  into city (`name`, `type`, `value`) values (?,?,?)";
            PreparedStatement ps = connection.prepareStatement(basicSql);
            ps.setString(1,"江西");
            ps.setString(2,"v_8");
            ps.setInt(3,68);
//            int count = ps.executeUpdate();
            ps.addBatch();
            ps.setString(1,"江西");
            ps.setString(2,"v_8");
            ps.setInt(3,69);
            ps.addBatch();
            ps.setString(1,"江西");
            ps.setString(2,"v_8");
            ps.setInt(3,70);
            ps.addBatch();

            // 二
            ps.addBatch("update city set `name` = '江西_1' where `value` = 70");

            ps.addBatch("delete from city where `value` = 69 and `name` = '江西'");

            int[] count = ps.executeBatch();
            for (int i = 0; i < count.length; i++) {
                System.out.println("count: " + count[i]);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

上面就是JDBC 批量处理的代码逻辑,很多博客上面都会第一行写加载驱动类,其实根据spi 机制不写也是可以的

(Class.forName("com.mysql.cj.jdbc.Driver"))

二: 好了有了上面的基础现在我们一起来看下mybatis 的批量处理该怎么配置了

1) 首先我们来看下mybatis 的批量处理包结构

在 Executor.java 下面有一个 BatchExecutor.java 这是批量处理的核心类

里面的核心方法是  doUpdate() 和  doFlushStatements()

胖友感兴趣的可以好好读写, 其实里面的代码也很简单 如果是相同的sql 就执行 addBatch() 不同的sql 就会重新创建 Connection

, 如果胖友还有疑问可以给笔者留言,看到后笔者会回复的

2) 在SpringBoot 项目里面怎么集成呢? 在 spring-mybatis 的项目中有一个集成的类  MyBatisBatchItemWriter.java 

在项目中初始化这个类

statementId 是你调用的批量处理需要执行的sql 语句的id 如下图

在业务代码中引入 MyBatisBatchItemWriter.java 对象

执行批量处理的逻辑代码 (这里一定需要添加事务的逻辑,如果不加的话就不是批量执行是单个执行每一条语句都会创建一个Connection) 

需要加上事务注解的原因如下,如果该操作没有被事务管理 sqlSession 会在执行每条语句后会被回收,

在执行下面遍历的过程中 每update 一次就会将创建的 sqlSeeison 关闭如果没有添加spring的事务注解,添加了的话就不会执行上面的sqlSeeion.commit() 操作,

特别强调在执行批量处理的时候一定记得添加事务, 这是不是和mybatis 的一级缓存有点相同呢,在一个方法中同时执行一个sql语句如果没有加事务一级缓存是不会生效的,加了的话一级缓存才会生效。

好了今天的分享就到这,读者在阅读的时候如果碰到什么问题,可以给笔者留言,看到后会及时回复的。

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐