通用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

 

 

posted @ 2022-04-26 10:26  迷走神经  阅读(1917)  评论(0编辑  收藏  举报