zoukankan      html  css  js  c++  java
  • Mybatis Plus 自动填充

    一、代码实战

    1、注解填充字段

    @TableField(.. fill = FieldFill.INSERT) 生成器策略部分也可以配置!

    //创建时间
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    //更新时间
    @TableField(fill = FieldFill.UPDATE)
    private Date updateTime;

    2、自定义实现类 MyMetaObjectHandler

    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler {
    
        @Override
        public void insertFill(MetaObject metaObject) {
            System.out.println("start insert fill ....");
            setInsertFieldValByName("createTime", new Date(), metaObject);
        }
    
        @Override
        public void updateFill(MetaObject metaObject) {
            System.out.println("start update fill ....");
            setUpdateFieldValByName("updateTime", new Date(), metaObject);
        }
    }

    注意官网最新的示例修改了方法

    @Slf4j
    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler {
    
        @Override
        public void insertFill(MetaObject metaObject) {
            log.info("start insert fill ....");
            this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
            // 或者
            this.strictUpdateFill(metaObject, "createTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
            // 或者
            this.fillStrategy(metaObject, "createTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)
        }
    
        @Override
        public void updateFill(MetaObject metaObject) {
            log.info("start update fill ....");
            this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐)
            // 或者
            this.strictUpdateFill(metaObject, "updateTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
            // 或者
            this.fillStrategy(metaObject, "updateTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)
        }
    }

    3、测试代码

    @Test
    public void insert() {
        User user = new User();
        user.setName("张山");
        user.setAge(48);
        user.setEmail("zhangshan@baomidou.com");
        user.setManagerId(1087982257332887553L);
        int rows = userMapper.insert(user);
        System.out.println("rows===" + rows);
    }
    
    @Test
    public void update() {
        User user = new User();
        user.setId(1088248166370832385L);
        user.setAge(27);
        int rows = userMapper.updateById(user);
        System.out.println("rows===" + rows);
    }

    日志输出

    start insert fill ....
    DEBUG==>  Preparing: INSERT INTO user ( id, name, age, email, manager_id, create_time ) VALUES ( ?, ?, ?, ?, ?, ? ) 
    DEBUG==> Parameters: 1371302252912959490(Long), 张山(String), 48(Integer), zhangshan@baomidou.com(String), 1087982257332887553(Long), 2021-03-15 11:28:29.316(Timestamp)
    DEBUG<==    Updates: 1
    rows===1
    
    
    start update fill ....
    DEBUG==>  Preparing: UPDATE user SET age=?, update_time=? WHERE id=? AND deleted='0' 
    DEBUG==> Parameters: 27(Integer), 2021-03-15 11:32:41.799(Timestamp), 1088248166370832385(Long)
    DEBUG<==    Updates: 1
    rows===1

    二、自动填充优化

    这个自定义实现类是针对所有类的增改操作,但并不是所有表都有对应的字段,也不是所有对应的字段都需要MP赋值,有些需要程序处理后赋值。这就需要对 MyMetaObjectHandler 进行改造。

    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler {
    
        @Override
        public void insertFill(MetaObject metaObject) {
            // 判断是否有此属性,如果有再进行处理
            boolean hasSetter = metaObject.hasSetter("createTime");
            if (hasSetter) {
                System.out.println("start insert fill ....");
                setInsertFieldValByName("createTime", new Date(), metaObject);
            }
        }
    
        @Override
        public void updateFill(MetaObject metaObject) {
            // 判断属性是否为空,如果为空则进行处理
            Object object = getFieldValByName("updateTime", metaObject);
            if (object == null) {
                System.out.println("start update fill ....");
                setUpdateFieldValByName("updateTime", new Date(), metaObject);
            }
        }
    }
  • 相关阅读:
    Git使用
    A star算法
    禅语人生
    android中GridView
    关于Android资源学习
    买了胡百敬老师的<SQL SERVER 2008 管理实战>
    人生七苦
    SQL Server 2008实现"编辑所有行"和"返回所有行"的方法
    陈慧娴《永远是你的朋友》专辑歌词
    SQL Server 2008 Service Pack 1 简体中文补丁包下载
  • 原文地址:https://www.cnblogs.com/jwen1994/p/14536631.html
Copyright © 2011-2022 走看看