1.自定义批量更新mapper接口
import org.apache.ibatis.annotations.UpdateProvider;
import java.util.List;
/**
* 通用Mapper接口,批量更新
*/
public interface UpdateBatchMapper<T> {
/**
* 根据主键选择性批量更新
*/
@UpdateProvider(type = UpdateBatchProvider.class, method = "dynamicSQL")
int batchUpdate(List<T> recordList);
}
2.批量更新mapper接口实现类
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.MapperTemplate;
import tk.mybatis.mapper.mapperhelper.SqlHelper;
import java.util.Set;
/**
* 批量更新实现类
*/
public class UpdateBatchProvider extends MapperTemplate {
public UpdateBatchProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
super(mapperClass, mapperHelper);
}
/**
* 根据主键选择性批量更新
<foreach collection="list" item="record" separator=";">
update t_product_base
<set>
<if test="record.productSku != null and record.productSku != ''">
product_sku = #{record.productSku,jdbcType=VARCHAR},
</if>
</set>
where id = #{record.id,jdbcType=INTEGER}
</foreach>
*/
public String batchUpdate(MappedStatement ms) {
final Class<?> entityClass = getEntityClass(ms);
//开始拼sql
StringBuilder sql = new StringBuilder();
//循环开始
sql.append("<foreach collection=\"list\" item=\"record\" separator=\";\">");
//update语句
sql.append(SqlHelper.updateTable(entityClass, tableName(entityClass)));
//set语句
sql.append(SqlHelper.updateSetColumns(entityClass, "record", true, isNotEmpty()));
//where语句
sql.append("<where>");
//获取全部列
Set<EntityColumn> columnList = EntityHelper.getPKColumns(entityClass);
//当某个列有主键策略时,不需要考虑他的属性是否为空,因为如果为空,一定会根据主键策略给他生成一个值
for (EntityColumn column : columnList) {
if (column.isId() && column.isUpdatable()) {
sql.append(" and " + column.getColumnEqualsHolder("record"));
break;
}
}
sql.append("</where>");
//循环结束
sql.append("</foreach>");
return sql.toString();
}
}
3.注册批量更新mapper接口使其生效
a. 可用@RegisterMapper
注解该接口,@RegisterMapper
注解可以避免 mapper.mappers
参数配置,通用 Mapper 检测到该接口被继承时,会自动注册。
b. 也可用于让公共mapper如 MyMapper
或 表实体对应的 *Mapper
继承该接口,同样可注册生效。
备注:批量插入方法官方已支持,在 InsertListMapper
可找到,就不需要自定义了。