通用mapper批量修改
一、mysql需要设置支持批量更新
jdbc url 里的 allowMultiQueries 设置成true .可以批量更新
jdbc url参数详解参考:https://blog.csdn.net/weixin_34530489/article/details/113430433
二、自定义批量更新mapper接口
package com.haici.cloud.his.service.handler.batch; import org.apache.ibatis.annotations.UpdateProvider; import tk.mybatis.mapper.annotation.RegisterMapper; import java.util.List; /** * 批量更新 * @author Green * @date 2021年12月17日 4:04 下午 */ @RegisterMapper public interface UpdateBatchMapper<T> { /** * 根据主键选择性批量更新 */ @UpdateProvider(type = UpdateBatchProvider.class, method = "dynamicSQL") int batchUpdate(List<T> recordList); }
这里通过tk.mapper 4.0之后自带的注解@RegisterMapper来注册批量更新接口
a. 可用@RegisterMapper注解该接口,@RegisterMapper 注解可以避免 mapper.mappers 参数配置,通用 Mapper 检测到该接口被继承时,会自动注册。
b. 也可用于让公共mapper如 MyMapper 或 表实体对应的 *Mapper 继承该接口,同样可注册生效。
三、批量更新mapper接口实现类
package com.haici.cloud.his.service.handler.batch; 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; /** * @author Green * @date 2021年12月17日 4:06 下午 */ 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(); } }
四、业务dao类继承自定义的UpdateBatchMapper即可
public interface DeptDao extends Mapper<DeptPo>, MySqlMapper<DeptPo>, UpdateBatchMapper<DeptPo> {
其中继承的三个接口解释如下:
tk.mybatis.mapper.common.Mapper 用于通用mapper普通的操作方法;
tk.mybatis.mapper.common.MySqlMapper 用于通用mapper批量添加方法;注意:批量插入是支持主键自增的,但是自定义主键生成策略会失效,需要手动自定义设置id,参考之前的文章;
UpdateBatchMapper 这就是这里的自定义批量更新接口,用于提供批量更新的方法;
转载:https://blog.csdn.net/LSL1618/article/details/115733470
带着疑问去思考,然后串联,进而归纳总结,不断追问自己,进行自我辩证,像侦查嫌疑案件一样看待技术问题,漆黑的街道,你我一起寻找线索,你就是技术界大侦探福尔摩斯