首页 > 编程 > Java > 正文

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

2019-11-26 09:19:46
字体:
来源:转载
供稿:网友

前言

对于实体中的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)@ToStringpublic 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)

总结

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表