mybatis自动填充时间字段示例代码
前言
对于实体中的created_on和updated_on来说,它没有必要被开发人员去干预,因为它已经足够说明使用场景了,即在插入数据和更新数据时,记录当前时间,这对于mybatis来说,通过拦截器是可以实现的,记得之前说过在jpa中实现的方法,主要通过jpa的注解实现的,因为今天的mybatis需要用到java的拦截器。
下面话不多说了,来一起看看详细的介绍吧
定义两个注解
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD}) public@interfaceCreatedOnFuncation{ Stringvalue()default""; } @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD}) public@interfaceUpdatedOnFuncation{ Stringvalue()default""; }
使用这两个注解
@Getter @Builder(toBuilder=true) @ToString publicclassUserInfo{ privateLongid; privateStringname; privateStringemail; @CreatedOnFuncation privateLocalDateTimecreatedOn; @UpdatedOnFuncation privateLocalDateTimeupdatedOn; }
定义拦截器,重写赋值的语句
packagecom.lind.basic.mybatis; importcom.baomidou.mybatisplus.extension.handlers.AbstractSqlParserHandler; importjava.lang.reflect.Field; importjava.time.LocalDateTime; importjava.util.Properties; importlombok.Data; importlombok.EqualsAndHashCode; importlombok.experimental.Accessors; importorg.apache.ibatis.logging.Log; importorg.apache.ibatis.logging.LogFactory; importorg.apache.ibatis.mapping.MappedStatement; importorg.apache.ibatis.mapping.SqlCommandType; importorg.apache.ibatis.plugin.Interceptor; importorg.apache.ibatis.plugin.Intercepts; importorg.apache.ibatis.plugin.Invocation; importorg.apache.ibatis.plugin.Plugin; importorg.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})}) publicclassCreateUpdateTimeInterceptorextendsAbstractSqlParserHandlerimplementsInterceptor{ privatestaticfinalLoglogger=LogFactory.getLog(com.baomidou.mybatisplus.extension.plugins.SqlExplainInterceptor.class); privatePropertiesproperties; @Override publicObjectintercept(Invocationinvocation)throwsThrowable{ MappedStatementmappedStatement=(MappedStatement)invocation.getArgs()[0]; //获取SQL命令 SqlCommandTypesqlCommandType=mappedStatement.getSqlCommandType(); //获取参数 Objectparameter=invocation.getArgs()[1]; //获取私有成员变量 Field[]declaredFields=parameter.getClass().getDeclaredFields(); for(Fieldfield: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()); } } } returninvocation.proceed(); } @Override publicObjectplugin(Objecttarget){ if(targetinstanceoforg.apache.ibatis.executor.Executor){ returnPlugin.wrap(target,this); } returntarget; } @Override publicvoidsetProperties(Propertiesprop){ this.properties=prop; } }
添加测试用例
@Test publicvoidinsert(){ UserInfouserInfo=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 )
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。