詳解擴展tk.mybatis的批量更新的功能
tk.mybatis沒有帶批量更新的功能,批量更新卻是經常使用的,所以需要自己實現(xiàn)。
批量更新網上主要有2種方式:case when方式、foreach方式
但是foreachzhe這種方式效率非常低下,不知道為何那多么帖子在流傳,請看我另一個文章。
擴展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條件批量更新實體`record`包含的不是null的屬性值 * * @return */ @UpdateProvider(type = BatchExampleProvider.class, method = "dynamicSQL") int updateBatchByPrimaryKeySelective(List<? extends T> recordList); }
實現(xiàn)UpdatePriUpdateProvider,使用case when方式拼寫mapper動態(tài)語句,必須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); //開始拼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); });
到此這篇關于詳解擴展tk.mybatis的批量更新的功能的文章就介紹到這了,更多相關tk.mybatis 批量更新內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring?Boot使用Hibernate-Validator校驗參數(shù)時的長度校驗方法詳解
這篇文章主要給大家介紹了關于Spring?Boot使用Hibernate-Validator校驗參數(shù)時的長度校驗方法的相關資料,在Spring Boot中可以使用Spring Boot Validation來對參數(shù)名稱進行校驗,需要的朋友可以參考下2023-08-08Spring Security 實現(xiàn)多種登錄方式(常規(guī)方式外的郵件、手機驗證碼登錄)
本文主要介紹了Spring Security 實現(xiàn)多種登錄方式(常規(guī)方式外的郵件、手機驗證碼登錄),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01springboot使用mybatis一對多的關聯(lián)查詢問題記錄
這篇文章主要介紹了springboot使用mybatis一對多的關聯(lián)查詢問題記錄,剛好最近有個需求需要做到關聯(lián)的查詢,時間也算充足,所以用sql來寫,于是踩了很久坑,終于跳出來了,小小記錄一下2022-01-01SpringMVC加載控制與Postmand的使用和Rest風格的引入及RestFul開發(fā)全面詳解
SpringMVC是一種基于Java,實現(xiàn)了Web MVC設計模式,請求驅動類型的輕量級Web框架,即使用了MVC架構模式的思想,將Web層進行職責解耦?;谡埱篁寗又傅木褪鞘褂谜埱?響應模型,框架的目的就是幫助我們簡化開發(fā),SpringMVC也是要簡化我們日常Web開發(fā)2022-10-10使用SpringJPA?直接實現(xiàn)count(*)
這篇文章主要介紹了SpringJPA?直接實現(xiàn)count(*),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11mybatis實現(xiàn)mapper配置并查詢數(shù)據(jù)的思路詳解
這篇文章主要介紹了mybatis實現(xiàn)mapper配置并查詢數(shù)據(jù),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04Java數(shù)組模擬優(yōu)先級隊列數(shù)據(jù)結構的實例
這篇文章主要介紹了Java數(shù)組模擬優(yōu)先級隊列數(shù)據(jù)結構的實例,優(yōu)先級隊列中的元素會被設置優(yōu)先權,本文的例子借助了Java中的TreeSet和TreeMap,需要的朋友可以參考下2016-04-04