溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在mybatis中對(duì)時(shí)間字段進(jìn)行自動(dòng)填充

發(fā)布時(shí)間:2021-01-06 16:10:40 來源:億速云 閱讀:1327 作者:Leah 欄目:編程語言

怎么在mybatis中對(duì)時(shí)間字段進(jìn)行自動(dòng)填充?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

定義兩個(gè)注解

@Retention(RetentionPolicy.RUNTIME)
@Target( {ElementType.FIELD})
public @interface CreatedOnFuncation {

 String value() default "";
}
@Retention(RetentionPolicy.RUNTIME)
@Target( {ElementType.FIELD})
public @interface UpdatedOnFuncation {

 String value() default "";
}

使用這兩個(gè)注解

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

/**
 * 時(shí)間攔截器.
 */
@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();

 // 獲取參數(shù)
 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;
 }
}

添加測(cè)試用例

 @Test
 public void insert() {
 UserInfo userInfo = UserInfo.builder()
 .name("lind")
 .email("test@sina.com")
 .build();
 userInfoMapper.insert(userInfo);
 System.out.println("userinfo:" + userInfo.toString());
 }

解決是我們所預(yù)想的,created_on和updated_on被自動(dòng)賦上值了。

userinfo:UserInfo
(
id=1085780948955959297, 
name=lind, 
email=test@sina.com, 
createdOn=2019-01-17T14:08:45.665,
updatedOn=2019-01-17T14:08:45.665
)

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI