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的实体类进行处理。如果需要对其他实体类进行处理,则需要修改拦截器逻辑。