Mybatis批處理、Mysql深分頁操作
一、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)文章
Java中構(gòu)造函數(shù),set/get方法和toString方法使用及注意說明
這篇文章主要介紹了Java中構(gòu)造函數(shù),set/get方法和toString方法的使用及注意說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01SpringBoot從0到1整合銀聯(lián)無跳轉(zhuǎn)支付功能附源碼
這篇文章主要介紹了SpringBoot從0到1整合銀聯(lián)無跳轉(zhuǎn)功能支付附源碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Java使用StampedLock實(shí)現(xiàn)高效讀寫功能
StampedLock 是 Java 8 引入的高性能鎖,提供了三種鎖模式:寫鎖、悲觀讀鎖和樂觀讀鎖,與傳統(tǒng)的 ReentrantReadWriteLock 相比,StampedLock 更注重性能,特別適合讀多寫少的場景,所以本文給大家介紹了Java使用StampedLock實(shí)現(xiàn)高效讀寫功能,需要的朋友可以參考下2025-01-01淺談hibernate中對(duì)象的3種狀態(tài)_瞬時(shí)態(tài)、持久態(tài)、脫管態(tài)
下面小編就為大家?guī)硪黄獪\談hibernate中對(duì)象的3種狀態(tài)_瞬時(shí)態(tài)、持久態(tài)、脫管態(tài)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08解決使用mybatis-plus時(shí),生成的SQL大寫變小寫加下劃線問題
這篇文章主要介紹了解決使用mybatis-plus時(shí),生成的SQL大寫變小寫加下劃線問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12java模擬TCP通信實(shí)現(xiàn)客戶端上傳文件到服務(wù)器端
這篇文章主要為大家詳細(xì)介紹了java模擬TCP通信實(shí)現(xiàn)客戶端上傳文件到服務(wù)器端,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10Java實(shí)現(xiàn)經(jīng)典游戲超級(jí)瑪麗的示例代碼
在你的童年記憶里,是否有一個(gè)蹦跳、頂蘑菇的小人?本文將用java語言實(shí)現(xiàn)經(jīng)典游戲《超級(jí)瑪麗》,文中采用了swing技術(shù)進(jìn)行了界面化處理,需要的可以參考一下2022-02-02Hibernate實(shí)現(xiàn)悲觀鎖和樂觀鎖代碼介紹
這篇文章主要介紹了Hibernate實(shí)現(xiàn)悲觀鎖和樂觀鎖的有關(guān)內(nèi)容,涉及hibernate的隔離機(jī)制,以及實(shí)現(xiàn)悲觀鎖和樂觀鎖的代碼實(shí)現(xiàn),需要的朋友可以了解下。2017-09-09SpringCloud Webflux過濾器增加header傳遞方式
這篇文章主要介紹了SpringCloud Webflux過濾器增加header傳遞方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Mybatis批量插入index out of range錯(cuò)誤的解決(較偏的錯(cuò)誤)
這篇文章主要介紹了Mybatis批量插入index out of range錯(cuò)誤的解決(較偏的錯(cuò)誤),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12