欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mybatis批處理、Mysql深分頁操作

 更新時(shí)間:2023年08月09日 10:10:01   作者:Jun South  
這篇文章主要介紹了Mybatis批處理、Mysql深分頁操作,Mybatis批量操作包括Foreach方式和ExecutorType.BATCH插入操作,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、Mybatis批量操作

1、Foreach方式

會(huì)拼接成:insert into table (ID, PHONE,MESSAGE) values (?,?,?), (?,?,?), (?,?,?)當(dāng)數(shù)據(jù)過多時(shí),可能生成的動(dòng)態(tài)sql過大,mysql默認(rèn)僅1M的sql字符串,過長可能會(huì)執(zhí)行失敗。在sql循環(huán)時(shí)設(shè)置batch與否其實(shí)執(zhí)行時(shí)間差別不是很大,所以其實(shí)如果不是特別要求性能,可直接在sql中使用for循環(huán)即可。實(shí)踐發(fā)現(xiàn),當(dāng)表的列數(shù)較多(超過20),以及一次性插入的行數(shù)較多(上萬條)時(shí),插入性能非常差,通常需要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內(nèi)置的ExecutorType有3種,SIMPLE、REUSE、BATCH;默認(rèn)的是simple,該模式下它為每個(gè)語句的執(zhí)行創(chuàng)建一個(gè)新的預(yù)處理語句,單條提交sql;batch模式重復(fù)使用已經(jīng)預(yù)處理的語句,且批量執(zhí)行所有更新語句,但batch模式也有自己的問題,在Insert操作時(shí),沒提交事務(wù)前,無法獲取到自增的id。

public enum ExecutorType {
  SIMPLE, //mybatis的默認(rèn)執(zhí)行器,它為每個(gè)語句的執(zhí)行創(chuàng)建一個(gè)新的預(yù)處理語句
  REUSE,  //會(huì)復(fù)用預(yù)處理語句
  BATCH   //會(huì)批量執(zhí)行所有更新語句,不需要對(duì)同樣的SQL進(jìn)行多次預(yù)編譯 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、先查出主鍵,通過主鍵關(guān)聯(lián),支持跨頁,減少回表。

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;

到此這篇關(guān)于Mybatis批處理、Mysql深分頁操作的文章就介紹到這了,更多相關(guān)Mybatis批處理、Mysql深分頁內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論