温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么在mybatis中对时间字段进行自动填充

发布时间:2021-01-06 16:10:40 来源:亿速云 阅读:1386 作者:Leah 栏目:编程语言

怎么在mybatis中对时间字段进行自动填充?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

定义两个注解

@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 )

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI