MyBatis-plus框架下資料庫表中的建立時間(create_time)、修改時間(update_time)的處理

三井壽14發表於2020-12-06

我們在一般的資料庫操作中可能經常見到這種操作,表中有兩列,分別為這條資料的建立時間和修改時間,那我們該如何處理呢?在新增資料的或者修改資料的時候 new Date嗎?這樣太low了。

兩種處理方式:

一、資料庫層面的處理

一般不推薦使用,工作中不允許修改資料庫

1、表中新增create_time、update_time兩列,並設定預設值和

欄位:create_time
在這裡插入圖片描述
欄位:修改時間
在這裡插入圖片描述

2、單元測試

1、實體類

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book {
    @TableId(type = IdType.AUTO) //主鍵自增策略
    private Integer id;
    private String bookname;
    private String author;
    private Date createTime;
    private Date updateTime;
}

2、定義BookMapper介面

@Repository
public interface BookMapper extends BaseMapper<Book> {
}

3、編寫測試類進行測試並檢視結果

@RunWith(SpringRunner.class)
@SpringBootTest
public class BookTimeTest {

    @Autowired
    private BookMapper bookMapper;

    @Test
    public void insertBook(){
        Book book=new Book();
        book.setBookname("白夜行");
        book.setAuthor("東野圭吾");
        bookMapper.insert(book);
        System.out.println("新增結果:"+book);
        //1	白夜行	東野圭吾	2020-12-06 21:24:34	    2020-12-06 21:24:34
    }

    @Test
    public void updateBook(){
        Book book=new Book();
        book.setId(1);
        book.setBookname("白夜行222");
        book.setAuthor("東野圭吾");
        bookMapper.updateById(book);
        //表中資料:
        // 1  白夜行222	東野圭吾	2020-12-06 21:24:34	  2020-12-06 21:28:19
    }
   
}

結果證明我們的建立時間和修改時間都能自動完成新增與更新,完全由資料庫端執行,不需要我們人為操作。



二、程式碼側層面上的處理(推薦使用)

通過MyBatis-plus註解與執行器幫我們實現

1、表中只需建立兩個欄位create_time、update_time,不需要像上面那樣進行任何處理。

2、實體類中新增註解

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book {
    @TableId(type = IdType.AUTO) //主鍵自增策略
    private Integer id;
    private String bookname;
    private String author;

    @TableField(fill = FieldFill.INSERT) //新增時自動填充
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE) //新增或修改時自動填充
    private Date updateTime;
}

public enum FieldFill {
DEFAULT, ——預設不進行任何操作
INSERT,——新增時進行填充操作
UPDATE,——修改時進行填充操作
INSERT_UPDATE; ——新增或修改時進行填充操作
}

3、編寫處理器處理註解

@Component //一定要將處理器新增到 Ioc容器中
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override //1、重寫插入時候的填充策略
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill ...");
        //setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }

    @Override //2、重寫修改時候的填充策略
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ...");
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
    
}

4、測試結果成功

相關文章