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 )
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。