mybatis自動填充時間字段
阿新 • • 發佈:2019-01-17
private mapping creat void type target hand .data rac
對於實體中的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("[email protected]")
.build();
userInfoMapper.insert(userInfo);
System.out.println("userinfo:" + userInfo.toString());
}
解決是我們所預想的,created_on和updated_on被自動賦上值了。
userinfo:UserInfo
(
id=1085780948955959297,
name=lind,
[email protected],
createdOn=2019-01-17T14:08:45.665,
updatedOn=2019-01-17T14:08:45.665
)
mybatis自動填充時間字段