详解扩展tk.mybatis的批量更新的功能tk.mybatis没有带批量更新的功能,批量更新却是经常使⽤的,所以需要⾃⼰实现。
批量更新⽹上主要有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> {
/**
* 根据Example条件批量更新实体`record`包含的不是null的属性值
*
* @return
*/
@UpdateProvider(type = BatchExampleProvider.class, method = "dynamicSQL")
int updateBatchByPrimaryKeySelective(List<? extends T> recordList);
}
实现UpdatePriUpdateProvider,使⽤case when⽅式拼写mapper动态语句,必须id为主键
import org.apache.ibatis.mapping.MappedStatement;
ity.EntityColumn;
batis.mapper.mapperhelper.EntityHelper;
batis.mapper.mapperhelper.MapperHelper;
batis.mapper.mapperhelper.SqlHelper;
batis.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 = Columns(entityClass);
for (EntityColumn column : columnList) {
if (!column.isId() && column.isUpdatable()) {
sql.append("  <trim prefix=\""+Column()+" =case\" suffix=\"end,\">");
sql.append("    <foreach collection=\"list\" item=\"i\" index=\"index\">");
sql.append("      <if test=\"i."+EntityField().getName()+"!=null\">");
sql.append("        when id=#{i.id} then #{i."+EntityField().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>");
String();
}
}
统⼀定义批量操作接⼝
/**
批量更新sql语句* 批量操作接⼝
*
* @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 批量更新内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。