mybatis-plus 自定义UpdateWrapper(一)实现列自增

前言

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);
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值