最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot 集成 Mybatis Plus 自動(dòng)填充字段的實(shí)例詳解

 更新時(shí)間:2021年03月12日 10:40:45   作者:武培軒  
這篇文章主要介紹了Spring Boot 集成 Mybatis Plus 自動(dòng)填充字段,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一般在表設(shè)計(jì)的時(shí)候,都會(huì)在表中添加一些系統(tǒng)字段,比如 create_timeupdate_time等。

阿里巴巴開(kāi)發(fā)手冊(cè)中也有這樣的提示,如果對(duì)于這些公共字段可以進(jìn)行統(tǒng)一處理,不需要每次進(jìn)行插入或者更新操作的時(shí)候 set 一下,就可以提高開(kāi)發(fā)效率,解放雙手。

加入依賴(lài)

下面就通過(guò) MyBatis Plus 來(lái)完成字段自動(dòng)填充,首先加入 MyBatis Plus 依賴(lài):

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.1</version>
</dependency>

創(chuàng)建實(shí)體類(lèi),添加填充注解

創(chuàng)建一個(gè)實(shí)體類(lèi),然后在需要自動(dòng)填充的屬性上加注解 @TableField(fill = FieldFill.INSERT)、@TableField(fill = FieldFill.INSERT_UPDATE) 等注解。

@Data
@TableName("user")
public class UserEntity extends BaseEntity {
    private static final long serialVersionUID = 1L;
    /**
     * 主鍵
     */
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private Long id;
    /**
     * 姓名
     */
    @TableField("name")
    private String name;
    /**
     * 年齡
     */
    @TableField("age")
    private Integer age;
    /**
     * 郵件
     */
    @TableField("email")
    private String email;
    /**
     * 創(chuàng)建時(shí)間
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    public Date createTime;
    /**
     * 修改時(shí)間
     */
    @TableField(value = "modify_time", fill = FieldFill.INSERT_UPDATE)
    public Date modifyTime;
}

其中 fill 屬性為字段自動(dòng)填充策略,可選的參數(shù)如下所示:

public enum FieldFill {
    /**
     * 默認(rèn)不處理
     */
    DEFAULT,
    /**
     * 插入填充字段
     */
    INSERT,
    /**
     * 更新填充字段
     */
    UPDATE,
    /**
     * 插入和更新填充字段
     */
    INSERT_UPDATE
}

就直接創(chuàng)建一個(gè) Mapper,來(lái)便于測(cè)試:

@Mapper
public interface UserMapper extends BaseMapper<UserEntity> {
}

實(shí)現(xiàn)元對(duì)象處理器接口

MyBatis Plus 版本不同,實(shí)現(xiàn)方式可能會(huì)有些許不同,在 3.4.1 版本是實(shí)現(xiàn) MetaObjectHandler 接口,低版本可能是繼承 MetaObjectHandler 抽象類(lèi),來(lái)實(shí)現(xiàn)對(duì)應(yīng)的方法。

下面為實(shí)現(xiàn)插入和更新數(shù)據(jù)的字段填充邏輯,在插入對(duì)象時(shí),對(duì)創(chuàng)建時(shí)間 createTime 和修改時(shí)間 modifyTime 字段自動(dòng)填充為當(dāng)前時(shí)間,在更新對(duì)象時(shí),將修改時(shí)間 modifyTime 修改為最新時(shí)間。

@Component
public class CommonMetaObjectHandler implements MetaObjectHandler {
    /**
     * 創(chuàng)建時(shí)間
     */
    private static final String FIELD_SYS_CREATE_TIME = "createTime";
    /**
     * 修改時(shí)間
     */
    private static final String FIELD_SYS_MODIFIED_TIME = "modifyTime";
 
    /**
     * 插入元對(duì)象字段填充(用于插入時(shí)對(duì)公共字段的填充)
     *
     * @param metaObject 元對(duì)象
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        Date currentDate = new Date();
        // 插入創(chuàng)建時(shí)間
        if (metaObject.hasSetter(FIELD_SYS_CREATE_TIME)) {
            this.strictInsertFill(metaObject, FIELD_SYS_CREATE_TIME, Date.class, currentDate);
        }
        // 同時(shí)設(shè)置修改時(shí)間為當(dāng)前插入時(shí)間
        if (metaObject.hasSetter(FIELD_SYS_MODIFIED_TIME)) {
            this.strictUpdateFill(metaObject, FIELD_SYS_MODIFIED_TIME, Date.class, currentDate);
        }
    }
 
    /**
     * 更新元對(duì)象字段填充(用于更新時(shí)對(duì)公共字段的填充)
     *
     * @param metaObject 元對(duì)象
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName(FIELD_SYS_MODIFIED_TIME, new Date(), metaObject);
    }
}

其中,默認(rèn)填充策略為默認(rèn)有值不覆蓋,如果提供的值為 null 也不填充。如果默認(rèn)填充策略不滿足,可以重寫(xiě) strictFillStrategy 方法以滿足自己的需求。

測(cè)試字段自動(dòng)填充

編寫(xiě)測(cè)試類(lèi)來(lái)檢驗(yàn)是否在插入和更新操作時(shí),是否會(huì)自動(dòng)填充響應(yīng)的字段。

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class AutoFillTest {
    @Resource
    private UserMapper userMapper;
    @Test
    public void test() throws InterruptedException {
        UserEntity user = new UserEntity();
        user.setName("wupx");
        user.setAge(18);
        user.setEmail("wupx@qq.com");
        userMapper.insert(user);
        Long id = user.getId();
        UserEntity beforeUser = userMapper.selectById(id);
        log.info("before user:{}", beforeUser);
        Assert.assertNotNull(beforeUser.getCreateTime());
        Assert.assertNotNull(beforeUser.getModifyTime());
        beforeUser.setAge(19);
        Thread.sleep(1000L);
        userMapper.updateById(beforeUser);
        log.info("query user:{}", userMapper.selectById(id));
        // 清除測(cè)試數(shù)據(jù)
        userMapper.deleteById(id);
    }
}

啟動(dòng)測(cè)試類(lèi),通過(guò)日志可以看出來(lái):

before user:UserEntity(id=1346071927831134210, name=wupx, age=18, email=wupx@qq.com, createTime=Mon Jan 04 20:32:11 CST 2021, modifyTime=Mon Jan 04 20:32:11 CST 2021)
query user:UserEntity(id=1346071927831134210, name=wupx, age=19, email=wupx@qq.com, createTime=Mon Jan 04 20:32:11 CST 2021, modifyTime=Mon Jan 04 20:32:13 CST 2021)

第一次插入對(duì)象的時(shí)候,創(chuàng)建時(shí)間和修改時(shí)間都自動(dòng)填充了,當(dāng)修改對(duì)象的時(shí)候,修改時(shí)間也相應(yīng)的進(jìn)行了更新。

另外可以將公共字段封裝到公共類(lèi)中,比如 BaseEntity

@Data
public class BaseEntity {
    /**
     * 主鍵
     */
    @TableId(value = "id", type = IdType.ASSIGN_UUID)
    private Long id;
    /**
     * 創(chuàng)建時(shí)間
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private Date createTime;
    /**
     * 修改時(shí)間
     */
    @TableField(value = "modify_time", fill = FieldFill.INSERT_UPDATE)
    private Date modifyTime;
}

經(jīng)過(guò)測(cè)試,也是可以完成公共字段的自動(dòng)填充,大家也可以在項(xiàng)目中這樣搞下,可以減少每次插入或者更新時(shí)的 set 操作。

總結(jié)

本文的完整代碼在 https://github.com/wupeixuan/SpringBoot-Learnmybatis-plus-auto-fill-metainfo 目錄下。

你有沒(méi)有經(jīng)常需要去設(shè)置公共字段的煩惱呢,如果有這種情況,可以通過(guò)這種方式來(lái)解決下。

參考

https://github.com/wupeixuan/SpringBoot-Learn

https://baomidou.com/guide/auto-fill-metainfo.html

到此這篇關(guān)于Spring Boot 集成 Mybatis Plus 自動(dòng)填充字段的文章就介紹到這了,更多相關(guān)Spring Boot 集成 Mybatis Plus 填充字段內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

安溪县| 荆门市| 文昌市| 乡宁县| 武汉市| 尖扎县| 突泉县| 齐齐哈尔市| 正阳县| 平昌县| 玉屏| 枣阳市| 荥经县| 承德市| 晋城| 辽宁省| 怀来县| 临猗县| 河曲县| 玉门市| 大城县| 若羌县| 崇信县| 高尔夫| 会泽县| 通海县| 易门县| 长兴县| 准格尔旗| 石嘴山市| 榕江县| 长宁县| 平武县| 松江区| 绥德县| 湄潭县| 修文县| 崇明县| 长宁县| 翼城县| 河南省|