mybatis自动填充时间字段示例代码

网友投稿 401 2023-01-14


mybatis自动填充时间字段示例代码

前言

对于实体中的created_on和updated_on来说,它没有必要被开发人员去干预,因为它已经足够说明使用场景了,即在插入数据和更新数据时,记录当前时间,这对于mybatis来说,通过拦截器是可以实现的,记得之前说过在jpa中实现的方法,主要通过jpa的注解实现的,因为今天的mybatis需要用到java的拦截器。

下面话不多说了,来一起看看详细的介绍吧

定义两个注解

@Retention(RetentionPolicy.RUNTIME)

@Target( {ElementType.FIELD})

public @interface CreatedOnFuncation {

String value() default "";

}

@Retention(RetentionPolicy.RUNTIME)

@Target( {ElementType.FIELD})

public @interface UpdatedOnFuncation {

String value() default "";

}

使用这两个注解

@Getter

@Builder(toBuilder = true)

@ToString

public class UserInfo {

private Long id;

private String name;

private String email;

@CreatedOnFuncation

private LocalDateTime createdOn;

@UpdatedOnFuncation

private LocalDateTime updatedOn;

}

定义拦截器,重写赋值的语句

package com.lind.basic.mybatis;

import com.baomidou.mybatisplus.extension.handlers.AbstractSqlParserHandler;

import java.lang.reflect.Field;

import java.time.LocalDateTime;

import java.util.Properties;

import lombok.Data;

import lombok.EqualsAndHashCode;

import lombok.experimental.Accessors;

import org.apache.ibatis.logging.Log;

import org.apache.ibatis.logging.LogFactory;

import org.apache.ibatis.mapping.MappedStatement;

import org.apachemjcKQz.ibatis.mapping.SqlCommandType;

import org.apache.ibatis.plugin.Interceptor;

import org.apache.ibatis.plugin.Intercepts;

import org.apache.ibatis.plugin.Invocation;

import org.apache.ibatis.plugin.Plugin;

import org.apache.ibatis.plugin.Signature;

/**

* 时间拦截器.

*/

@EqualsAndHashCode(callSuper = true)

@Data

@Accessors(chain = true)

@Intercepts( {

@Signature(

type = org.apache.ibatis.executor.Executor.class,

method = "update",

args = {MappedStatement.class, Object.class})})

public class CreateUpdateTimeInterceptor extends AbstractSqlParserHandler implements Interceptor {

private static final Log logger = LogFactory.getLog(com.baomidou.mybatisplus.extension.plugins.SqlExplainInterceptor.class);

private Properties properties;

@Override

public Object intercept(Invocation invocation) throws Throwable {

MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];

// 获取 SQL 命令

SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();

// 获取参数

Object parameter = invocation.getArgs()[1];

// 获取私有成员变量

Field[] declaredFields = parameter.getClass().getDeclaredFields();

for (Field field : declaredFields) {

if (field.getAnnotation(CreatedOnFuncation.class) != null) {

if (SqlCommandType.INSERT.equals(sqlCommandType)) { // insert 语句插入 createTime

field.setAccessible(true);

field.set(parameter, LocalDateTime.now());

}

}

if (field.getAnnotation(UpdatedOnFuncation.class) != null) { // insert 或 update 语句插入 updateTime

if (SqlCommandType.INSERT.equals(sqlCommandType) || SqlCommandType.UPDATE.equals(sqlCommandType)) {

field.setAccessible(true);

field.set(parameter, LocalDateTime.now());

}

}

}

return invocation.proceed();

}

@Override

public Object plugin(Object target) {

if (target instanceof org.apache.ibatis.executor.Executor) {

return Plugin.wrap(target, this);

}

return target;

}

@Override

public void setProperties(Properties prop) {

this.properties = prop;

}

}

添加测试用例

@Test

public void insert() {

UserInfo userInfo = UserInfo.builder()

.name("lind")

.email("test@sina.com")

.build();

userInfoMapper.insert(userInfo);

System.out.println("userinfo:" + userInfo.toString());

}

解决是我们所预想的,created_on和updated_on被自动赋上值了。

userinfo:UserInfo

(

id=1085780948955959297,

name=lind,

email=test@sina.com,

createdOn=2019-01-17T14:08:45.665,

updatedOn=2019-01-17T14:08:45.665

)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java查找图中两点之间所有路径
下一篇:vue验证码组件应用实例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~