Mybatis plus 动态SQL 批处理 修改功能 update batch(只有思路,没有细节配置)
Mybatis plus 动态SQL 批处理 修改功能 update batch
·
目录
咳咳
是如何编写dao层的自定义批处理修改方法,比较死板
受到网上其他解决方案启发
可能的正道,应该是利用mybatis plus的提供的方法
但是推荐使用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 (
?
,
?
)
更多推荐
已为社区贡献1条内容
所有评论(0)