mybatis-plus 自定义UpdateWrapper(

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

crud业务中难免会有列的自增、自减,如果项目中集成的是mybatis-plus的话不做任何修改大概只有两种方案

  • 使用UpdateWrapper拼接
  • 直接写原生sql到xml中

但是两种方法都不优雅,因为都需要写死列名字(如果优雅我还写啥文章。。。)
那么我就尝试能够实现自定义的LambdaUpdateWrapper

1
2
3
4
5
xml复制代码<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>

源码分析

1
2
3
4
5
6
java复制代码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

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
java复制代码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中调用代码如下

1
2
3
4
5
6
java复制代码MyLambdaUpdateWrapper<AgentInfo> updateWrapper = new MyLambdaUpdateWrapper(AgentInfo.class);

updateWrapper.incrField(AgentInfo::getRealBalance, amount);
updateWrapper.eq(AgentInfo::getId, agentId);
// 调用父类 ServiceImpl 的update(。。)
return update(updateWrapper);

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%