【精品】通用Mapper 批量更新bug解决方案

问题描述

环境:mysql8.x+mybatis3.5.13+tk.mybatis4.2.3

在使用tk.mybatis做批量更新时,程序会报错,说是执行的SQL语法错误,经研究源代码发现tk.mybatis在实现批量更新时是通过多次执行update语句实现的。这本身就不符合MySQL批量更新的语法,可以通过自定义Mapper的方式解决。

有关MySQL批量更新SQL语句的语法请参考:MySQL专有的SQL语句

解决方案

批量更新

  • 接口
@RegisterMapper
public interface BatchUpdateByIdMapper<T> {
   
    /**
     * 批量更新
     * @param list
     * @return
     */
    @UpdateProvider(type = BatchUpdateByIdProvider.class, method = "dynamicSQL")
    int batchUpdate(List<T> list);
}
  • provider
public class BatchUpdateByIdProvider extends MapperTemplate {
   
    public BatchUpdateByIdProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
   
        super(mapperClass, mapperHelper);
    }
    public String batchUpdate(MappedStatement statement) {
   
        //1.获取实体类对应的Class对象
        Class<?> entityClass = super.getEntityClass(statement);

        //2.获取实体类在数据库中对应的表名
        String tableName = super.tableName(entityClass);

        //3.生成update子句
        String update = SqlHelper.updateTable(entityClass, tableName);

        //4.创建StringBuilder用于拼接SQL语句的各个组成部分
        StringBuilder sb = new StringBuilder(update);

        sb.append("");

        //5.获取所有字段信息
        Set<EntityColumn> columns = EntityHelper.getColumns(entityClass);

        //获取主键
        EntityColumn pkEntityColumn = null;
        for (EntityColumn entityColumn : columns) {
   
            boolean isPrimaryKey = entityColumn.isId();
            if (isPrimaryKey) 

你可能感兴趣的:(#,MyBatis,通用Mapper,批量更新)