目录 

咳咳

在原生sql语句中如何实现批量修改

在Mybatis Plus中,如何写通用的自定义批修改方法

sql语句生成效果 控制台log


咳咳

是如何编写dao层的自定义批处理修改方法,比较死板

受到网上其他解决方案启发

Mybatis中进行批量更新(updateBatch)_Jin的专栏-CSDN博客_updatebatch

可能的正道,应该是利用mybatis plus的提供的方法

MybatisPlus批量更新_雪落南城的博客-CSDN博客_mybatisplus批量更新

但是推荐使用service的

在原生sql语句中如何实现批量修改

关键工具  Switch语法

Case 

When  then 

else

End

在一条update语句中,分别在set后,和where条件后,双case主键,可以使被修改的值和所属主键对应起来

update product 
set price = 
case id   
	when id=1 then 100
	when id=2 then 200
end
,
name =
case id   
	when id=1 then 'a'
	when id=2 then 'b'
end

where id in (1,2)

在Mybatis Plus中,如何写通用的自定义批修改方法

利用String的%s占位,逐步补足

使用2个动态sql循环语句+switch语法,来完成

public class UpdateBatchMethod extends AbstractMethod {
    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        String sql = "<script>\nupdate %s %s where %s in %s %s\n</foreach>\n</script>";
        String additional = tableInfo.isWithVersion() ? tableInfo.getVersionFieldInfo().getVersionOli("item", "item.") : "" + tableInfo.getLogicDeleteSql(true, true);
        StringBuffer setSql = new StringBuffer(" set ");
        tableInfo.getFieldList().forEach(f->{
            setsql.append(",  ").append(f.getColumn())
                    .append("=\n")
                    .append("<foreach collection=\"list\" item=\"item\" index=\"index\"\n")
                    .append("separator=\" \" open=\"case ")
                    .append(tableInfo.getKeyColumn())
                    .append("\" close=\"end\">\n")
                    .append("when #{item.")
                    .append(tableInfo.getKeyColumn())
                    .append("} then #{item.")
                    .append(f.getColumn()).append("}")
                    .append("</foreach>");
        });
        setSql.replace(0,6,"set ");
        StringBuffer inSql =new StringBuffer()
                .append("<foreach collection=\"list\" index=\"index\" item=\"item\"\n")
                .append("separator=\",\" open=\"(\" close=\")\">\n")
                .append("#{item.")
                .append(tableInfo.getKeyColumn())
                .append("}");
        String sqlResult = String.format(sql,
                tableInfo.getTableName(),
                setSql,
                tableInfo.getKeyColumn(),
                inSql,
                additional);
        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlResult, modelClass);
        return this.addUpdateMappedStatement(mapperClass, modelClass, "updateBatch", sqlSource);
    }
}

sql语句生成效果 控制台log

original SQL: update product set   name=
 case id  
when ? then ?   
when ? then ? end ,  price=
 case id  
when ? then ?   
when ? then ? end ,  version=
 case id  
when ? then ?   
when ? then ? end  where id in  (  
?  
 , 
?  
 )
SQL to parse, SQL: update product set   name=
 case id  
when ? then ?   
when ? then ? end ,  price=
 case id  
when ? then ?   
when ? then ? end ,  version=
 case id  
when ? then ?   
when ? then ? end  where id in  (  
?  
 , 
?  
 )


 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐