Mybatis批处理、Mysql深分页

一、Mybatis批量操作

1、Foreach方式

会拼接成:insert into table (ID, PHONE,MESSAGE) values (?,?,?), (?,?,?), (?,?,?)

当数据过多时,可能生成的动态sql过大,mysql默认仅1M的sql字符串,过长可能会执行失败。

在sql循环时设置batch与否其实执行时间差别不是很大,所以其实如果不是特别要求性能,可直接在sql中使用for循环即可。

实践发现,当表的列数较多(超过20),以及一次性插入的行数较多(上万条)时,插入性能非常差,通常需要20分钟以上

XML 复制代码
<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。

java 复制代码
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、普通分页

sql 复制代码
select * from table order by id limit m,n;

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

sql 复制代码
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、取上一页最大主键做判断,不支持跨页插叙。

sql 复制代码
select * from table where id > #max_id# order by id limit 10, 10;

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

sql 复制代码
select * from table where id > (select id from table order by id limit m, 1) limit n;
相关推荐
奈斯先生Vector29 分钟前
告别工具碎片化:基于 Nano Banana 全模态 AI 聚合架构搭建“文本-图像-视频”自动化协同生产线
运维·数据库·人工智能·架构·自动化·aigc·音视频
建筑工程企业管理系统2 小时前
erp工程项目管理系统落地价值:实现工程多项目成本精细化核算与管控
大数据·数据库·人工智能
AI大模型-小华3 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
foolishlee3 小时前
Neon wal日志处理流程2
数据库
2601_965798474 小时前
Is Hygia Good for Maid & Janitorial Sites? Technical Audit
服务器·网络·数据库
Cloud云卷云舒4 小时前
海山数据库(HaishanDB)面向工业云场景技术方案
数据库·haishandb·工业云·移动云海山数据库·天工云
逃逸线LOF4 小时前
Spring配置数据源{连接池}(Druid、c3p0)
java·数据库·spring
严同学正在努力7 小时前
从备份到恢复:我用 30 分钟恢复了误删的核心业务表
android·java·数据库·ai
#六脉神剑7 小时前
myBuilder新版本(8月,Office文件预览、Oracle数据库支持)
数据库·oracle·开发平台·数字化工具·mybuilder
花青泽7 小时前
5-数据库-SQL注入-联合查询-AND/OR绕过-day13
数据库·sql