詳解擴(kuò)展tk.mybatis的批量更新的功能
tk.mybatis沒(méi)有帶批量更新的功能,批量更新卻是經(jīng)常使用的,所以需要自己實(shí)現(xiàn)。
批量更新網(wǎng)上主要有2種方式:case when方式、foreach方式
但是foreachzhe這種方式效率非常低下,不知道為何那多么帖子在流傳,請(qǐng)看我另一個(gè)文章。
擴(kuò)展tk.mybatis的批量更新,采用case when方式,源碼干貨如下:
首先定義下mapper接口
import org.apache.ibatis.annotations.UpdateProvider; import java.util.List; /** * 批量update * * @param <T> 不能為空 */ @tk.mybatis.mapper.annotation.RegisterMapper public interface UpdateBatchByPrimaryKeySelectiveMapper<T> { /** * 根據(jù)Example條件批量更新實(shí)體`record`包含的不是null的屬性值 * * @return */ @UpdateProvider(type = BatchExampleProvider.class, method = "dynamicSQL") int updateBatchByPrimaryKeySelective(List<? extends T> recordList); }
實(shí)現(xiàn)UpdatePriUpdateProvider,使用case when方式拼寫mapper動(dòng)態(tài)語(yǔ)句,必須id為主鍵
import org.apache.ibatis.mapping.MappedStatement; import tk.mybatis.mapper.entity.EntityColumn; import tk.mybatis.mapper.mapperhelper.EntityHelper; import tk.mybatis.mapper.mapperhelper.MapperHelper; import tk.mybatis.mapper.mapperhelper.SqlHelper; import tk.mybatis.mapper.provider.ExampleProvider; import java.util.Set; /** * 批量更新的SqlProvider * @author sunchangtan */ public class BatchExampleProvider extends ExampleProvider { public BatchExampleProvider(Class<?> mapperClass, MapperHelper mapperHelper) { super(mapperClass, mapperHelper); } /** * 拼update sql, 使用case when方式,id為主鍵 * * @param ms * @return */ public String updateBatchByPrimaryKeySelective(MappedStatement ms) { final Class<?> entityClass = getEntityClass(ms); //開(kāi)始拼sql StringBuilder sql = new StringBuilder(); sql.append(SqlHelper.updateTable(entityClass, tableName(entityClass))); sql.append("<trim prefix=\"set\" suffixOverrides=\",\">"); //獲取全部列 Set<EntityColumn> columnList = EntityHelper.getColumns(entityClass); for (EntityColumn column : columnList) { if (!column.isId() && column.isUpdatable()) { sql.append(" <trim prefix=\""+column.getColumn()+" =case\" suffix=\"end,\">"); sql.append(" <foreach collection=\"list\" item=\"i\" index=\"index\">"); sql.append(" <if test=\"i."+column.getEntityField().getName()+"!=null\">"); sql.append(" when id=#{i.id} then #{i."+column.getEntityField().getName()+"}"); sql.append(" </if>"); sql.append(" </foreach>"); sql.append(" </trim>"); } } sql.append("</trim>"); sql.append("WHERE"); sql.append(" id IN "); sql.append("<trim prefix=\"(\" suffix=\")\">"); sql.append("<foreach collection=\"list\" separator=\", \" item=\"i\" index=\"index\" >"); sql.append("#{i.id}"); sql.append("</foreach>"); sql.append("</trim>"); return sql.toString(); } }
統(tǒng)一定義批量操作接口
/** * 批量操作接口 * * @param <T> * @author sunchangtan */ @tk.mybatis.mapper.annotation.RegisterMapper public interface BatchMapper<T> extends UpdateBatchByPrimaryKeySelectiveMapper<T> { }
使用例子:
List<List<BatchTest>> splitList = ListUtils.splitList(list, 100); splitList.forEach(data -> { batchTestMapper.updateBatchByPrimaryKeySelective(data); });
到此這篇關(guān)于詳解擴(kuò)展tk.mybatis的批量更新的功能的文章就介紹到這了,更多相關(guān)tk.mybatis 批量更新內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Boot使用Hibernate-Validator校驗(yàn)參數(shù)時(shí)的長(zhǎng)度校驗(yàn)方法詳解
這篇文章主要給大家介紹了關(guān)于Spring?Boot使用Hibernate-Validator校驗(yàn)參數(shù)時(shí)的長(zhǎng)度校驗(yàn)方法的相關(guān)資料,在Spring Boot中可以使用Spring Boot Validation來(lái)對(duì)參數(shù)名稱進(jìn)行校驗(yàn),需要的朋友可以參考下2023-08-08Spring Security 實(shí)現(xiàn)多種登錄方式(常規(guī)方式外的郵件、手機(jī)驗(yàn)證碼登錄)
本文主要介紹了Spring Security 實(shí)現(xiàn)多種登錄方式(常規(guī)方式外的郵件、手機(jī)驗(yàn)證碼登錄),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01springboot使用mybatis一對(duì)多的關(guān)聯(lián)查詢問(wèn)題記錄
這篇文章主要介紹了springboot使用mybatis一對(duì)多的關(guān)聯(lián)查詢問(wèn)題記錄,剛好最近有個(gè)需求需要做到關(guān)聯(lián)的查詢,時(shí)間也算充足,所以用sql來(lái)寫,于是踩了很久坑,終于跳出來(lái)了,小小記錄一下2022-01-01SpringMVC加載控制與Postmand的使用和Rest風(fēng)格的引入及RestFul開(kāi)發(fā)全面詳解
SpringMVC是一種基于Java,實(shí)現(xiàn)了Web MVC設(shè)計(jì)模式,請(qǐng)求驅(qū)動(dòng)類型的輕量級(jí)Web框架,即使用了MVC架構(gòu)模式的思想,將Web層進(jìn)行職責(zé)解耦?;谡?qǐng)求驅(qū)動(dòng)指的就是使用請(qǐng)求-響應(yīng)模型,框架的目的就是幫助我們簡(jiǎn)化開(kāi)發(fā),SpringMVC也是要簡(jiǎn)化我們?nèi)粘eb開(kāi)發(fā)2022-10-10使用SpringJPA?直接實(shí)現(xiàn)count(*)
這篇文章主要介紹了SpringJPA?直接實(shí)現(xiàn)count(*),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11mybatis實(shí)現(xiàn)mapper配置并查詢數(shù)據(jù)的思路詳解
這篇文章主要介紹了mybatis實(shí)現(xiàn)mapper配置并查詢數(shù)據(jù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Java數(shù)組模擬優(yōu)先級(jí)隊(duì)列數(shù)據(jù)結(jié)構(gòu)的實(shí)例
這篇文章主要介紹了Java數(shù)組模擬優(yōu)先級(jí)隊(duì)列數(shù)據(jù)結(jié)構(gòu)的實(shí)例,優(yōu)先級(jí)隊(duì)列中的元素會(huì)被設(shè)置優(yōu)先權(quán),本文的例子借助了Java中的TreeSet和TreeMap,需要的朋友可以參考下2016-04-04