mybatis拦截器自动添加插入数据和更新数据

mybatis拦截器智能添加插入和更新数据

项目使用mybatis+springboot,每次插入和更新需要手动编写代码设置插入时间和更新时间,代码十分繁琐。MyBatis拦截器可以用于自动处理插入和更新数据,可以在拦截器中添加自定义逻辑,用于处理数据的自动赋值或修改。
注:网上大部分是mybatis-plus的方法,此项目没有使用mybatis-plus

1、定义BaseEntity类

需要定义一个BaseEntity类,用于存储公共的数据字段,例如createTime、updateTime等。


```java

/**
* Entity基类
* 
* @author kevin
*/
@Data
public class BaseEntity implements Serializable
{
  private static final long serialVersionUID = 1L;

 
  /** 创建时间 */
  @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  private Date createTime;



  /** 更新时间 */
  @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  private Date updateTime;

 

2、定义拦截器

/**
 * 功能描述
 *
 * @author: zenghaiwen
 * @date: 2023年04月25日 15:16
 */
@Intercepts(@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}))
@Component
public class MybatisInterceptor implements Interceptor {

    Logger log = LoggerFactory.getLogger(this.getClass());

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        fillField(invocation);
        return invocation.proceed();
    }
    private void fillField(Invocation invocation) {
        if (!(invocation.getTarget() instanceof Executor) || invocation.getArgs().length != 2) {
            return;
        }
        // 获取第一个参数
        MappedStatement ms = (MappedStatement) invocation.getArgs()[0];
        Object paramObj = invocation.getArgs()[1];

        if (ms.getSqlCommandType() == SqlCommandType.INSERT) {
            // 填充插入数据
            handleInsert(paramObj);
            //log.info("进入mybatis拦截器+++++++++++++++++++++++++填充插入数据");
        } else if (ms.getSqlCommandType() == SqlCommandType.UPDATE) {
            // 填充更新数据
            handleUpdate(paramObj);
            //log.info("进入mybatis拦截器+++++++++++++++++++++++++填充更新数据");
        }


    }

    private void handleInsert( Object paramObj)   {
        if (paramObj instanceof BaseEntity) {
            BaseEntity entity = (BaseEntity) paramObj;
            if(entity.getCreateTime()==null){
                entity.setCreateTime(DateUtils.getNowDate());
            }

        }
    }

    private void handleUpdate( Object paramObj)   {
        if (paramObj instanceof BaseEntity) {
            BaseEntity entity = (BaseEntity) paramObj;
            entity.setUpdateTime(DateUtils.getNowDate());
        }
    }

}

通过以上步骤,就可以实现在插入和更新数据时自动填充BaseEntity的数据。
效果如图:
在这里插入图片描述

需要注意的是,以上示例中只针对继承自BaseEntity的实体类进行处理。如果需要对其他实体类进行处理,则需要修改拦截器逻辑。

参考:
MyBatis 拦截器使用方法总结

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值