Mybatis批处理、Mysql深分页操作

 更新时间:2023年08月09日 10:10:01   作者:Jun South  
这篇文章主要介绍了Mybatis批处理、Mysql深分页操作,Mybatis批量操作包括Foreach方式和ExecutorType.BATCH插入操作,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、Mybatis批量操作

1、Foreach方式

会拼接成:insert into table (ID, PHONE,MESSAGE) values (?,?,?), (?,?,?), (?,?,?)当数据过多时,可能生成的动态sql过大,mysql默认仅1M的sql字符串,过长可能会执行失败。在sql循环时设置batch与否其实执行时间差别不是很大,所以其实如果不是特别要求性能,可直接在sql中使用for循环即可。实践发现,当表的列数较多(超过20),以及一次性插入的行数较多(上万条)时,插入性能非常差,通常需要20分钟以上

<insert id="saveBatch" parameterType="java.util.List">
    insert into mytable (id, name, sex, age) values
    <foreach collection="list" item="item" separator=",">
        (#{item.id}, #{item.name}, #{item.sex}, #{item.age})
    </foreach>
</insert>

2、ExecutorType.BATCH插入

Mybatis内置的ExecutorType有3种,SIMPLE、REUSE、BATCH;默认的是simple,该模式下它为每个语句的执行创建一个新的预处理语句,单条提交sql;batch模式重复使用已经预处理的语句,且批量执行所有更新语句,但batch模式也有自己的问题,在Insert操作时,没提交事务前,无法获取到自增的id。

public enum ExecutorType {
  SIMPLE, //mybatis的默认执行器,它为每个语句的执行创建一个新的预处理语句
  REUSE,  //会复用预处理语句
  BATCH   //会批量执行所有更新语句,不需要对同样的SQL进行多次预编译 ArticleCategory
}
public void saveBatch(List list) {
  SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);
    try {
        MyMapper mapper = sqlSession.getMapper(MyMapper.class);
        mapper.saveBatch(list);
        sqlSession.commit();
        sqlSession.clearCache();
    } catch (Exception e) {
        sqlSession.rollback();
        e.printStackTrace();
    } finally {
        sqlSession.close();
    }
}

二、Mysql深分页

1、普通分页

select * from table order by id limit m,n;

2、先查出主键,通过主键关联,支持跨页,减少回表。

select * from table as a
inner join (select id from table order by id limit m, n) as b
on a.id = b.id order by a.id;

3、取上一页最大主键做判断,不支持跨页插叙。

select * from table where id > #max_id# order by id limit 10, 10;

4、先查出主键,通过主键做范围判断,支持跨页,减少回表。

select * from table where id > (select id from table order by id limit m, 1) limit n;

到此这篇关于Mybatis批处理、Mysql深分页操作的文章就介绍到这了,更多相关Mybatis批处理、Mysql深分页内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • ClassLoader类加载源码解析

    ClassLoader类加载源码解析

    这篇文章主要为大家详细解析了ClassLoader类加载源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • Spring解决循环依赖的方法及三级缓存机制实践案例

    Spring解决循环依赖的方法及三级缓存机制实践案例

    Spring通过三级缓存解决单例Bean循环依赖,但无法处理构造器、prototype作用域及@Async场景,建议使用setter注入、@Lazy注解和架构优化,遵循设计原则避免依赖问题,本文介绍Spring如何解决循环依赖:深入理解三级缓存机制,感兴趣的朋友一起看看吧
    2025-09-09
  • Spring boot注解@Async线程池实例详解

    Spring boot注解@Async线程池实例详解

    这篇文章主要介绍了Spring boot注解@Async线程池实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java实现经典游戏俄罗斯方块(升级版)的示例代码

    Java实现经典游戏俄罗斯方块(升级版)的示例代码

    俄罗斯方块是一款风靡全球,从一开始到现在都一直经久不衰的电脑、手机、掌上游戏机产品,是一款游戏规则简单,但又不缺乏乐趣的简单经典小游戏。本文将用Java语言实现这一经典游戏,需要的可以参考一下
    2022-09-09
  • Java内存模型之重排序的相关知识总结

    Java内存模型之重排序的相关知识总结

    重排序是指编译器和处理器为了优化性能而对指令序列进行重新排序的一种手段,文中详细介绍了Java重排序的相关知识,需要的朋友可以参考下
    2021-06-06
  • 解决mybatis-plus自定义xml的坑

    解决mybatis-plus自定义xml的坑

    这篇文章主要介绍了解决mybatis-plus自定义xml的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java中StringBuilder常用构造方法解析

    Java中StringBuilder常用构造方法解析

    这篇文章主要介绍了Java中StringBuilder常用构造方法解析,StringBuilder是一个可标的字符串类,我们可以吧它看成是一个容器这里的可变指的是StringBuilder对象中的内容是可变的,需要的朋友可以参考下
    2024-01-01
  • 举例说明Java设计模式编程中ISP接口隔离原则的使用

    举例说明Java设计模式编程中ISP接口隔离原则的使用

    这篇文章主要介绍了Java设计模式编程中ISP接口隔离原则的使用,接口隔离原则主张一个类对另外一个类的依赖性应当是建立在最小的接口上,需要的朋友可以参考下
    2016-02-02
  • java 正则表达式所有的优先级示例详解

    java 正则表达式所有的优先级示例详解

    本文给大家介绍java正则表达式所有的优先级示例,理解这些优先级规则对于编写正确的正则表达式至关重要,特别是当表达式包含多个操作符时,本文介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • springboot+dubbo+validation 进行rpc参数校验的实现方法

    springboot+dubbo+validation 进行rpc参数校验的实现方法

    这篇文章主要介绍了springboot+dubbo+validation 进行rpc参数校验的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09

最新评论