车家互联 小程序在智能汽车时代的创新与发展潜力
1757
2022-11-18
详解扩展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
*/
@tk.mybatis.mapper.annotation.RegisterMapper
public interface UpdateBatchByPrimaryKeySelectiveMapper
/**
* 根据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;
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("
//获取全部列
Set
for (EntityColumn column : columnList) {
if (!column.isId() && column.isUpdatable()) {
sql.append("
sql.append("
sql.append("
sql.append(" when id=#{i.id} then #{i."+column.getEntityField().getName()+"}");
sql.append(" ");
sql.append(" ");
sql.append(" ");
}
}
sql.append("");
sql.append("WHERE");
sql.append(" id IN ");
sql.append("
sql.append("
sql.append("#{i.id}");
sql.append("");
sql.append("");
return sql.toString();
}
}
统一定义批量操作接口
http://
/**
* 批量操作接口
*
* @param
* @author sunchangtan
*/
@tk.mybatis.mapper.annotation.RegisterMapper
public interface BatchMapper
UpdateBatchByPrimaryKeySelectiveMapper
}
使用例子:
List> splitList = ListUtils.splitList(list, 100);
splitList.forEach(data -> {
batchTestMapper.updateBatchByPrimaryKeySelective(data);
});
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~