文章目錄
- Mybatis-plus實現自動注入
- 定義 MetaObjectHandler
- 配置 MyBatis-Plus 使用 MetaObjectHandler
- 實體類字段注解
- 使用服務類進行操作測試
- Jpa啟用審計功能實現自動注入
- 添加依賴
- 啟動類啟用審計功能
- 實現AuditorAware接口
- 實體類中使用審計注解
- 總結
自動注入創建人、創建時間、修改人、修改時間需要根據使用的技術棧進行區別處理,本文介紹Jpa和Mybatis-plus兩種方式進行自動注入
Mybatis-plus實現自動注入
在使用 MyBatis-Plus 進行數據庫操作時,我們經常需要自動處理一些字段,比如創建人、創建時間、修改人、修改時間等。MyBatis-Plus 提供了多種方式來自動填充這些字段,主要通過 MetaObjectHandler 接口實現。
定義 MetaObjectHandler
首先,你需要定義一個實現了 MetaObjectHandler 接口的類,并重寫 insertFill 和 updateFill 方法,用于設置默認的創建人和修改人、創建時間和修改時間。
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.util.Date;@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {// 創建人this.setFieldValByName("createBy", "admin", metaObject);// 創建時間this.setFieldValByName("createTime", new Date(), metaObject);// 修改人this.setFieldValByName("updateBy", "admin", metaObject);// 修改時間this.setFieldValByName("updateTime", new Date(), metaObject);}@Overridepublic void updateFill(MetaObject metaObject) {// 修改人this.setFieldValByName("updateBy", "admin", metaObject);// 修改時間this.setFieldValByName("updateTime", new Date(), metaObject);}
}
配置 MyBatis-Plus 使用 MetaObjectHandler
確保你的 Spring Boot 應用中已經包含了 MyBatis-Plus 的自動配置,通常在你的 Spring Boot 啟動類或者配置類中添加如下配置:
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.yourpackage.mapper") // 確保掃描到你的 Mapper 接口包路徑
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
實體類字段注解
在你的實體類中,使用 @TableField 注解標記需要自動填充的字段。例如:
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.util.Date;@TableName("your_table")
public class YourEntity {@TableIdprivate Long id;private String name;@TableField(fill = FieldFill.INSERT) // 僅在插入時填充private String createBy;@TableField(fill = FieldFill.INSERT) // 僅在插入時填充private Date createTime;@TableField(fill = FieldFill.INSERT_UPDATE) // 在插入和更新時填充private String updateBy;@TableField(fill = FieldFill.INSERT_UPDATE) // 在插入和更新時填充private Date updateTime;// getters and setters...
}
使用服務類進行操作測試
現在,當你使用 MyBatis-Plus 的 Service 類進行數據的插入或更新操作時,MyMetaObjectHandler 中的邏輯會自動觸發,填充相應的字段。例如:
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import com.yourpackage.mapper.YourEntityMapper; // 確保這是你的 Mapper 接口全名路徑
import com.yourpackage.entity.YourEntity; // 確保這是你的實體類全名路徑
import org.springframework.transaction.annotation.Transactional;@Service
public class YourEntityService extends ServiceImpl<YourEntityMapper, YourEntity> {@Transactional // 確保操作在事務中執行,以便自動填充字段正確工作。public void createEntity(YourEntity entity) {this.save(entity); }
Jpa啟用審計功能實現自動注入
添加依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>
啟動類啟用審計功能
@SpringBootApplication
@EnableJpaAuditing
public class ManageApplication {public static void main(String[] args) {SpringApplication.run(ManageApplication.class, args);}}
實現AuditorAware接口
@Component
public class SpringSecurityAuditorAware implements AuditorAware<String> {@Overridepublic Optional<String> getCurrentAuditor() {Authentication authentication = SecurityContextHolder.getContext().getAuthentication();if (authentication != null && authentication.isAuthenticated()) {// 獲取當前登錄用戶名String username = authentication.getName();return Optional.of(username);}return Optional.of(authentication.getPrincipal().toString());}
}
實體類中使用審計注解
使用 @CreatedBy、@CreatedDate、@LastModifiedBy 和 @LastModifiedDate 注解來自動記錄和更新創建和修改信息。
public class BaseEntity {@TableId(type = IdType.ASSIGN_ID)String id;@CreatedByString createId;@CreatedDate@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")Date createDate;@LastModifiedByString modifyId;@LastModifiedDate@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")Date modifyDate;}
總結
Mybatis-plus經過驗證可以實現自動注入,Jpa審計功能暫時未進行驗證。