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);
}
注:所有的 SQL 都是自动完成动态参数匹配。
2. 自动填充功能
在用户信息或订单管理等场景中,经常会有两个字段 create_time
和 update_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("2316533563@qq.com");
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("1231231231@qq.com");
int i = userMapper.updateById(user);
System.out.println(i);
}
执行完更新操作后,观察发现数据表的 create_time
和 update_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("2568933563@qq.com");
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("1231231265@qq.com");
user.setAge(38);
//注意:updateById 的 参数是一个对象
int i = userMapper.updateById(user);
System.out.println(i);
}
修改刚才插入记录的信息,发现记录的更新时间也发生改变。
在实际的开发中,更推荐使用这种方式完成自动填充。