对于实体中的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.apache.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 )

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信