因个人平时使用原生mybatis, 以及通用mapper比较多,对于MybatisPlus仅仅了解,使用不多,在一次简单的更新操作时,出现了某些字段更新失败的问题,记录一下.
1 问题模拟
1 添加依赖
在spring环境添加下面依赖包,如springboot环境,则添加另一个依赖包.
spring环境
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.4.0</version>
</dependency>
springboot环境
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
2 添加实体对象
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("dev_student") // 表名
public class Student {
// 主键
@TableId
private String id;
private String score;
private String name;
private Integer age;
private Date creatTime;
private String desc;
}
3 模拟调用
@Test
public void testUpdateById(){
// 参数从前端传递,此处模拟获取
Student student = new Student();
student.setId("1111");
student.setName("小明");
student.setAge(18);
student.setCreatTime(new Date());
// 模拟前端更新 删除了备注信息
student.setDesc("");
// 模拟前端更新 将字段指为空传递
student.setScore(null);
studentMapper.updateById(student);
}
4 查询结果
SQL语句目标: 将id为1111的对应的表字段更新为我们设置的值.
执行结果: 发现id为1111的数据,其他信息都进行了修改,备注和分数字段没有被修改.不符合我们的目标要求.
2 问题分析
根据上述问题分析,怀疑是不是配置有问题,导致数据没有更新成功.
官网简介 | MyBatis-Plus (baomidou.com)
查询了一下官网信息:
在mybatis-plus 配置文件后,有个global-config 全局配置,里面配置了更新、插入策略。
全局策略有:
- IGNORED:忽略
- NOT_NULL:非 NULL,默认策略
- NOT_EMPTY:非空
关于mybatis-plus插入或更新的字段有 空字符串 或者 null 时,默认是不进行更新数据库的.
此外,还能对单个字段进行插入或更新设置.
关联的字段策略有:
- IGNORED:忽略
- NOT_NULL:非 NULL,默认策略
- NOT_EMPTY:非空
- NEVER 从不更新,不管字段是否有值,都不进行更新
- DEFAULT 追随全局配置
问题解决
1 全局设置
mybatis-plus:
global-config:
db-config:
update-strategy: IGNORED
2 字段设置
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("dev_student")
public class Student {
@TableId
private String id;
private String score;
private String name;
private Integer age;
private Date creatTime;
// 更新时 忽略 不做判空和null校验
@TableField(updateStrategy = FieldStrategy.IGNORED)
private String desc;
}
3 问题总结
关于mybatis-plus更新时部分字段失败的问题, 查看官方文档后,很容易知道问题在哪里,修改起来也很方便. 对于未知的新技术,需要多多去学习和关注官方文档,才能更好的使用它.