前言

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);
Logo

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

更多推荐