詳解擴(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-08
Spring Security 實(shí)現(xiàn)多種登錄方式(常規(guī)方式外的郵件、手機(jī)驗(yàn)證碼登錄)
本文主要介紹了Spring Security 實(shí)現(xiàn)多種登錄方式(常規(guī)方式外的郵件、手機(jī)驗(yàn)證碼登錄),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
springboot使用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-01
SpringMVC加載控制與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-11
mybatis實(shí)現(xiàn)mapper配置并查詢數(shù)據(jù)的思路詳解
這篇文章主要介紹了mybatis實(shí)現(xiàn)mapper配置并查詢數(shù)據(jù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
Java數(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

