1、自定义批量更新mapper接口
import com.jingsheng.jruistickmes.dal.core.custom.provider.UpdateBatchProvider; import org.apache.ibatis.annotations.UpdateProvider; import tk.mybatis.mapper.annotation.RegisterMapper; import java.util.Collection; /** * 通用mapper接口 ,批量更新 * @author : huangfeilong * @time: 2023/6/6 9:16 */ @RegisterMapper public interface UpdateBatchMapper<T> { /** * 根据主键选择性批量更新 * @param entityList * @return */ @UpdateProvider(type = UpdateBatchProvider.class, method = "dynamicSQL") int updateBatchById(Collection<T> entityList); }
2、批量更新mapper接口实现类
** * 批量更新 * @author : huangfeilong * @time: 2023/6/6 9:32 */ public class UpdateBatchProvider extends MapperTemplate { public UpdateBatchProvider(Class<?> mapperClass, MapperHelper mapperHelper) { super(mapperClass, mapperHelper); } /** * 根据主键选择性批量更新 * @param ms * @return */ public String updateBatchById(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 = EntityHelper.getColumns(entityClass); for (EntityColumn column : columnList) { if (!column.isId() && column.isUpdatable()) { sql.append(" <trim prefix=\""+column.getColumn()+" =case\" suffix=\"end,\">"); sql.append(" <foreach collection=\"list\" item=\"i\" index=\"index\">"); sql.append(" <if test=\"i."+column.getEntityField().getName()+"!=null\">"); sql.append(" when id=#{i.id} then #{i."+column.getEntityField().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>"); return sql.toString(); } }
3、注册批量更新mapper接口使其生效
-
可用@RegisterMapper注解该接口
@RegisterMapper 注解可以避免 mapper.mappers 参数配置,通用 Mapper 检测到该接口被继承时,会自动注册。
@RegisterMapper public interface UpdateBatchMapper<T> { }
-
也可用于让公共mapper如 MyMapper 或 表实体对应的 *Mapper 继承该接口,同样可注册生效。
public interface BaseMapperPlus<T> extends BaseMapper<T>, UpdateBatchMapper<T> { }