Mybatis批处理、Mysql深分页操作
一、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深分页内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
mybatis-plus mapper中foreach循环操作代码详解(新增或修改)
这篇文章主要介绍了mybatis-plus mapper中foreach循环操作代码详解(新增或修改),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-11-11java核心编程之文件过滤类FileFilter和FilenameFilter
这篇文章主要为大家详细介绍了java文件过滤类FileFilter和FilenameFilter,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-08-08
最新评论