Mybatis-Plus 全局Update更新策略,和insert插入查询策略

kenx
• 阅读 1931

前言

最近在使用mybatis-plus做项目的时候,发现使用updatById方法的时候,更新某个字段时候出现了问题,一般业务操作都是更新不为空的字段,结果发现更新了所有字段,这是由于mybatis-plus全局的更新策略导致的,我们可以通过相应全局配置来解决

Mybatis-Plus 全局Update更新策略,和insert插入查询策略 看官方文档可知,数据库全局配置策略有三种,分别是查询策略,更新策略,和添加策略

点击这里进入官方文档

全局数据库策略配置

  1. 配置
#全局策略
mybatis-plus.global-config.db-config.update-strategy=not_empty
mybatis-plus.global-config.db-config.insert-strategy=not_empty
mybatis-plus.global-config.db-config.select-strategy=not_empty

可选的配置值,看源码如下

package com.baomidou.mybatisplus.annotation;

public enum FieldStrategy {
    IGNORED,
    NOT_NULL,
    NOT_EMPTY,
    DEFAULT,
    NEVER;

    private FieldStrategy() {
    }
}
  1. IGNORED 忽略判断,所有字段都进行更新和插入
  2. NOT_NULL只更新和插入非NULL值
  3. NOT_EMPTY 只更新和插入非NULL值且非空字符串
  4. NEVER 永远不进行更新和插入
  5. DEFAULT 默认NOT_NULL

默认取值,看源码可知

public static class DbConfig {
        private IdType idType;
        private String tablePrefix;
        private String schema;
        private String columnFormat;
        private String propertyFormat;
        private boolean tableUnderline;
        private boolean capitalMode;
        private IKeyGenerator keyGenerator;
        private String logicDeleteField;
        private String logicDeleteValue;
        private String logicNotDeleteValue;
        private FieldStrategy insertStrategy;
        private FieldStrategy updateStrategy;
        private FieldStrategy selectStrategy;

        public DbConfig() {
            this.idType = IdType.ASSIGN_ID;
            this.tableUnderline = true;
            this.capitalMode = false;
            this.logicDeleteValue = "1";
            this.logicNotDeleteValue = "0";
            this.insertStrategy = FieldStrategy.NOT_NULL;
            this.updateStrategy = FieldStrategy.NOT_NULL;
            this.selectStrategy = FieldStrategy.NOT_NULL;
        }

默认取值配置都是NOT_NULL

更新策略配置

也就是我们在使用updateById()方法时候,在没有指定更新策略时候使用默认策略,为NOT_NULL

也就是说当对象字段是NULL的时候不会进行set更新,如果我们字段是空字符串就会进行set更新操作,

所以我们可以更改我们全局配置不为空not_empty时候才更新

mybatis-plus.global-config.db-config.update-strategy=not_empty

也可以在需要的字段中单独指定字段更新策略

/**
     * 用户类型
     */
    @TableField(value = "ADMIN_TYPE_ID",updateStrategy = FieldStrategy.NOT_EMPTY)
    private String userType;

或者可以使用UpdateWrapper方式替换updateById

Mybatis-Plus 全局Update更新策略,和insert插入查询策略

添加策略

同理我们在进行inser或者save,方法时候,在没有指定更新策略时候使用默认策略,为NOT_NULL

也就是说当对象字段是NULL的时候不会进行ins添加值,如果我们字段是空字符串就会进行添加值操作,

我们也可以指定其他策略进行添加操作

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
SQL UPDATE 语句:更新表中的记录语法及案例剖析
SQLUPDATE语句UPDATE语句用于更新表中的记录。SQLUPDATE语句UPDATE语句用于更新表中已存在的记录。SQLUPDATE语法UPDATE_table\_name_SET_column1_\_valu
Wesley13 Wesley13
2年前
MySQL使用on duplicate key update时导致主键不连续自增
使用onduplicatekeyupdate语法有时是很方便,但是会有一个影响:默认情况下,每次更新都会更新该表的自增主键ID,如果更新频率很快,会导致主键ID自增的很快,过段时间就超过数字类型的的范围了解决这个问题,有两种方式:(实际我目前使用的方式是把自增主键ID设置为bigint,也有一部分操作先查询再选择插入OR更新)方法一:拆分成两个
Stella981 Stella981
2年前
Mybatis 通用Crud
更新日志<!20161113更新start1新增批量操作数据方法:批量插入,根据条件删除,根据条件更新指定的列名字段值。2新增高级查询方法:可设置查询列,查询条件,排序,分页。3根据1、2更新接口。4更改dao接口方法实现方式,统一采用GeneralMapper.xml编写sql,弃用General
Stella981 Stella981
2年前
Kerberos无约束委派的攻击和防御
 0x00前言简介当ActiveDirectory首次与Windows2000Server一起发布时,Microsoft就提供了一种简单的机制来支持用户通过Kerberos对Web服务器进行身份验证并需要授权用户更新后端数据库服务器上的记录的方案。这通常被称为Kerberosdoublehopissue(双跃点问题),
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
MySQL 我自己常用的语句汇总
1,更新,根据一个表更新另一个表,比如批量同步外键  方法一:  update更新表set字段(select参考数据from参考表where 参考表.id 更新表.id);  updatetable\_2m setm.column(selectcolumnfromtable\_1mpwherem
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
2年前
Redis缓存穿透、缓存雪崩、并发问题分析与解决方案
(一)缓存和数据库间数据一致性问题分布式环境下(单机就不用说了)非常容易出现缓存和数据库间的数据一致性问题,针对这一点的话,只能说,如果你的项目对缓存的要求是强一致性的,那么请不要使用缓存。我们只能采取合适的策略来降低缓存和数据库间数据不一致的概率,而无法保证两者间的强一致性。合适的策略包括合适的缓存更新策略,更新数
Wesley13 Wesley13
2年前
sql 优化建议
1、查询语句,尽量避免查询全部,避免写select\fromtable,查哪个写哪个,提高效率; 更新语句,能update具体字段的,不要update所有字段,提升效率。 要尽量避免全表扫描,首先应考虑在where及orderby涉及的列上建立索引 2、一张表中添加索引太少不行,索引的添加可以让查询