前言
crud业务中难免会有列的自增、自减,如果项目中集成的是mybatis-plus的话不做任何修改大概只有两种方案
- 使用
UpdateWrapper
拼接 - 直接写原生sql到xml中
但是两种方法都不优雅,因为都需要写死列名字(如果优雅我还写啥文章。。。)
那么我就尝试能够实现自定义的LambdaUpdateWrapper
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
源码分析
public LambdaUpdateWrapper<T> set(boolean condition, SFunction<T, ?> column, Object val) {
if (condition) {
sqlSet.add(String.format("%s=%s", columnToString(column), formatSql("{0}", val)));
}
return typedThis;
}
可以看到非常简单
相当于把 SFunction
转成 数据库字段名,然后拼接字符串,比如说有个User
有个属性name
set(true, User::getName, 'new name')
转出来的sql应该是
set name = 'new name'
那么我们也可以依葫芦画瓢,直接继承LambdaUpdateWrapper
代码实现
public class MyLambdaUpdateWrapper<T> extends LambdaUpdateWrapper<T> {
public MyLambdaUpdateWrapper(Class<T> entityClass) {
super(entityClass);
}
/**
* 指定列自增
* @param columns 列引用
* @param value 增长值
*/
public MyLambdaUpdateWrapper<T> incrField(SFunction<T, ?> columns, Object value) {
String columnsToString = super.columnToString(columns);
String format = String.format("%s = %s + %s", columnsToString,columnsToString, formatSql("{0}", value));
setSql(format);
return this;
}
/**
* 指定列自减
* @param columns 列引用
* @param value 减少值
*/
public MyLambdaUpdateWrapper<T> descField(SFunction<T, ?> columns, Object value) {
String columnsToString = super.columnToString(columns);
String format = String.format("%s = %s - %s", columnsToString,columnsToString, formatSql("{0}", value));
setSql(format);
return this;
}
}
在service中调用代码如下
MyLambdaUpdateWrapper<AgentInfo> updateWrapper = new MyLambdaUpdateWrapper(AgentInfo.class);
updateWrapper.incrField(AgentInfo::getRealBalance, amount);
updateWrapper.eq(AgentInfo::getId, agentId);
// 调用父类 ServiceImpl 的update(。。)
return update(updateWrapper);