Mybatis plus 动态SQL 批处理 修改功能 update batch(只有思路,没有细节配置)

目录 

咳咳

在原生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  (  
?  
 , 
?  
 )


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值