MyBatis-Plus 自动填充

MyBatis-Plus 自动填充

1. 更新操作

如何根据数据记录的 id 主键来修改记录的字段信息?

//更新操作
@Test
public void testUpdate(){
    
    
    User user = new User();
    //通过条件自动拼接动态sql
    user.setId(1495598121235881986L);
    user.setName("YCloud");
    user.setAge(18);

    //注意:updateById 的参数是一个对象
    //表示根据 id 修改数据信息
    int i = userMapper.updateById(user);
    //返回值i,表示改动记录的条数
    System.out.println(i);
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7mBEfU1u-1645441432437)(C:\Users\17209\AppData\Roaming\Typora\typora-user-images\image-20220221162706787.png)]

注:所有的 SQL 都是自动完成动态参数匹配。

2. 自动填充功能

在用户信息或订单管理等场景中,经常会有两个字段 create_timeupdate_time来记录数据的插入和修改时间,这些操作都是自动化完成的,不需要手动更新。

阿里巴巴开发手册:几乎所有的数据表都要配置 gmt_create、gmt_modified 两个字段,用于标记数据插入和更新的时间信息,并且需要自动化完成。

方式一:数据库级别(不推荐使用)

1、在表中新增字段 create_time, update_time,给时间字段设置默认值 CURRENT_TIMESTAMP

说明:create_time 不需要勾选【根据当前时间戳更新】,update_time 则需要勾选该项,同时需要为两个字段设置默认值 CURRENT_TIMESTAMP,这里我使用的数据库可视化工具为 Navicat。

2、将数据表字段的修改与实体类同步,再次测试测试插入方法;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    
    
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    private Integer age;
    private String email;

    //注意:这里使用驼峰命名,将create_time与createTime映射起来
    private Date createTime;
    private Date updateTime;
}

3、在测试类中测试插入与更新操作,观察测试结果;

//测试插入操作
@Test
public void testInsert(){
    
    
    User user = new User();
    user.setName("D.Zhang");
    user.setAge(35);
    user.setEmail("[email protected]");
    int res = userMapper.insert(user);
    System.out.println(res);
    System.out.println(user);
}

//更新操作
@Test
public void testUpdate(){
    
    
    User user = new User();
    user.setId(1495683732378550273L);
    //修改插入数据的年龄和邮箱
    user.setAge(38);
    user.setEmail("[email protected]");
    int i = userMapper.updateById(user);
    System.out.println(i);
}

执行完更新操作后,观察发现数据表的 create_timeupdate_time 字段值不相同。

注意:在实际工作中,是不允许开发者随意修改数据库的,所以这种方式不推荐使用。


方式二:代码级别

实体类字段属性上添加注解,@TableField 注解映射其他字段时,fill 表示自动填充,MyBatis Plus 自动给字段赋值,用于时间类型的数据

1、给表添加 create_time、update_time 字段,不提供默认值;

2、实体类中添加成员变量 createTime、updateTime;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    
    
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    private Integer age;
    private String email;

    //字段添加填充内容
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}

3、创建自动填充处理器;

package com.trainingl.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component  //一定不要忘记把处理器加到IOC容器中
public class DataHandler implements MetaObjectHandler {
    
    
    //插入时的填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
    
    
        // setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);

    }
    //更新时的填充策略
    @Override
    public void updateFill(MetaObject metaObject) {
    
    
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

4、测试插入操作;

@Test
public void testInsert(){
    
    
    User user = new User();
    user.setName("AnLiu");
    user.setAge(40);
    user.setEmail("[email protected]");
    int res = userMapper.insert(user);
    System.out.println(res);  //受影响的行数
    System.out.println(user);
}

从控制台打印的信息显示,在插入记录时,会自动获取当前系统时间,并将其作为参数动态匹配到 SQL 语句中。

5、测试更新操作;

//更新操作
@Test
public void testUpdate(){
    
    
    User user = new User();
    //通过条件自动拼接动态sql
    user.setId(1495713047027740673L);
    user.setEmail("[email protected]");
    user.setAge(38);

    //注意:updateById 的 参数是一个对象
    int i = userMapper.updateById(user);
    System.out.println(i);
}

修改刚才插入记录的信息,发现记录的更新时间也发生改变。

在实际的开发中,更推荐使用这种方式完成自动填充。

猜你喜欢

转载自blog.csdn.net/qq_41775769/article/details/123053595