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)]](https://i-blog.csdnimg.cn/blog_migrate/d2f60e794555942744ad9efd3258036f.png)
注:所有的 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);
}
修改刚才插入记录的信息,发现记录的更新时间也发生改变。

在实际的开发中,更推荐使用这种方式完成自动填充。
本文详细介绍了如何在MyBatis-Plus中利用自动填充功能,实现数据库级和代码级别的更新操作,包括updateById的使用以及如何为create_time和update_time字段设置自动填充策略。两种方式对比,推荐代码级别注解实现,以保持数据库结构简洁和一致性。
2037

被折叠的 条评论
为什么被折叠?



