前提:数据库表对应字段允许为null
使用Mybatis-plus操作数据库时,如果未自己写sql而是采用Mybatis-plus的方法设置sql的情况下,默认Mybatis-plus生成sql时会将设置为null的字段忽略掉(不更新该字段);所以默认情况下,使用Mybatis-plus的方法操作数据库时没办法设置一个字段的值为null(除非该字段数据库表设置默认值就为null)。
Mybatis-plus设计如此很好理解,比如现在我们的系统中一般都是做逻辑删除即修改删除标记的字段为删除状态的值,此时执行update语句时,一般根据id作为条件只设置删除标记字段的值就行,其他字段值不做设置也就是为null,如果Mybatis-plus也将这些字段进行更新的话,那么其他字段全是null,这样会造成数据丢失,问题很大;如果每个字段全部设置成之前的值,需要先进行一次查询操作,以及设置每个字段的值的操作,比较麻烦一些,很明显没有必要;所以Mybatis-plus默认忽略字段值为null的字段不做更新。
处理方法:
1、自己写sql
在mapper.xml中写对应的sql语句(insert语句/update语句/where条件中设置对应字段的值为null即可)
但是如果一张表的字段太多,仅仅只是某几个字段需要设置为null的话,简便处理方式可以采用下面的第二种和第四种(这两种使用不当有数据丢失风险,慎用)。
2、实体类对应字段添加注解
@TableField(insertStrategy = FieldStrategy.IGNORED) 添加该注解值的字段在Mybatis-plus生成insert sql时会忽略该字段值的判断
@TableField(updateStrategy = FieldStrategy.IGNORED) 添加该注解值的字段在Mybatis-plus生成update sql时会忽略该字段值的判断
@TableField(whereStrategy = FieldStrategy.IGNORED) 添加该注解值的字段在Mybatis-plus生成sql时的where条件中会忽略该字段值的判断
@TableField(insertStrategy = FieldStrategy.IGNORED,updateStrategy = FieldStrategy.IGNORED,whereStrategy = FieldStrategy.IGNORED)
前面三个的聚合
加上该注解之后,Mybatis-plus会在对应的情况下生成sql时忽略掉该字段值的判断;即该字段值不论是什么都会生成在sql中,就可以设置字段值为null了;但是这个是针对该字段生效,如果有些地方的操作,忘记设置该字段的值因为这个注解的原因,那么可能就会导致更新后,该字段为的值null,所以这种方式不推荐,推荐使用第一种自己写sql和第三种Mybatis-plus 3.x提供的新方法。
说明 FieldStrategy 的可选值:
FieldStrategy.NOT_NULL:不为null则更新,也就是字段值为null则不生成到sql中不更新该字段,如果字段值为""(空字符串)也是会更新的
FieldStrategy.NOT_EMPTY:不为空则更新,也就是该字段值为null或为""(空字符串)都不会更新
FieldStrategy.DEFAULT:默认值,和全局配置保持一致,也就是和下面的第四种方式中的配置保持一致
FieldStrategy.IGNORED:忽略判断,该字段值不论是什么,都进行更新
FieldStrategy.NEVER:不做更新操作,该字段值不论是什么,都不进行更新
3、使用Mybatis-plus 3.x版本提供的新方法
UpdateWrapper<TestIdcardEntity> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("name",null);
updateWrapper.eq("id",id);
testIdcardService.update(updateWrapper);
4、Mybatis-plus 全局参数配置(yaml方式配置如下)
全局配置的值可选项和第二种方式 FieldStrategy 的可选项一致,全局配置默认值为 not_null
mybatis-plus:
global-config:
db-config:
insert-strategy: ignored
update-strategy: ignored
select-strategy: ignored
这种方式和第二种一样可能会使用不当导致字段值为null,数据丢失;并且该方式是全局配置,对所有表的实体类所有字段都生效,危害会更严重;如果同时配置了第二种,那么优先第二种生效。
总结:
第二种和第四种使用不当会有数据丢失的风险不建议使用,第一种和第三种推荐使用。
前提:数据库表对应字段允许为null使用Mybatis-plus操作数据库时,如果未自己写sql而是采用Mybatis-plus的方法设置sql的情况下,默认Mybatis-plus生成sql时会将设置为null的字段忽略掉(不更新该字段);所以默认情况下,使用Mybatis-plus的方法操作数据库时没办法设置一个字段的值为null(除非该字段数据库表设置默认值就为null)。Mybatis-plus设计如此很好理解,比如现在我们的系统中一般都是做逻辑删除即修改删除标记的字段为删除状态的值,此时执行upd
在做数据库练习的时候,遇到一个问题,是以前从未接触但是看过人家实现的问题:
描述1:学号总共 12 位,由字母 XH+年+6 位数字编号组成(如 XH2014000001), 必须, 在新增时自动生成,数字编号自动增长
问题:数据库中自增的都是int型,变成字符串该怎么办呢?因为在数据库端实现自增,不能在软件端处理了。在不考虑
几个函数的解释:
Right(str,len)-
字段
返回右边的len个字符的字符串str
MAX()-
字段
中大的值
Is
Null
() 如为空为空
首先这是个自定义函数
前面的XH固定
年为YEAR(GE
mybatis
在持久层框架中还是比较火的,一般项目都是基于ssm。虽然
mybatis
可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。
mybatis-plus
就很好的解决了这个问题。
MyBatis
Plus是一个
Mybatis
的增强工具,在
Mybatis
的基础上只做增强不做改变,为简化开发、提高效率而生。它主要通过启动时自动注入基本CURD,达到简化操作的目的。
关于
mybatis-plus
的更多介绍及特性,可以参考本文档,详细的介绍了从入门到提高的一个过程,感兴趣的可以下载了解。
MyBatis-Plus
(简称 MP)是一个
MyBatis
的增强工具,在
MyBatis
的基础上只做增 强不做改变,为简化开发、提高效率而生。
特性:无侵入、损耗小、强大的CRUD操作,支持lambda 形势调用、支持多种数据库,支持主键自动生成、支持ActiveRecord模式,支持自定义全局通用操作、支持关键词自动转义,内置代码生成器、内置分页插件、内置性能分析插件,内置全局拦截插件、内置sql注入剥离器
《
MyBatis-Plus
入门文档》主要介绍了
MyBatis-Plus
入门使用,以及关于
mybatis-plus
的更多介绍及特性,感兴趣的可以下载学习一下
在用asp.net mvc 4.0做项目的时候遇到的这种情况:
情况分析:
“在填写表单的时候,有一些表单没有填写,留空,然后直接post 提交表单,action中用UpdateModel 来更新model,结果发现那些没有填写的表单
字段
全部变成
null
。”
原因分析:
项目中做了判断
null
不能提交更新到数据库中,所以导致一直提交不上去
后来网上查了一下找到了解决办法,我在这里分享一下,方便以后遇到这种情况的朋友可以方便解决
解决方法:
新建一个类继承DefaultModelBinder
using System.ComponentModel;
using System.Web.Mvc;
mybatis-plus
以下简称mp,目前应该也算是主流的一款数据访问层应用框架。源于其对
mybatis
的近乎完美的封装,让我们在使用的时候无比的顺滑, 几乎提供了所有单表操作的方法,大大提升了效率。并且这款框架还是国产的哦,没了解过的可以去了解一下。
回归正题,我们这次来讲一下,怎么样通过mp将数据库中的一个
字段
更新为
null
. 可能很多人会觉得奇怪,更新为
null
, 直接set field =
null
不就可以了。这里大家要注意一下,一般情况,我们在使用mp的时候,他的默认策略是空不更新, 这.
在用
mybatis-plus
封装的updateById方法来更新数据时,想把一个
字段
设置
为
null
值,但是发现更新后数据没有为
null
还是原来的值,这是因为
mybatis-plus
在更新的时候做了
null
判断,默认不更新为
null
的传参。
2 解决方法
在实体类对应的
字段
上加注解@TableField(strategy=FieldStrategy.IGNORED),忽略
null
值的...
百度了一下 很多都是说这样
alter table hr_eff_pfmce_planeecpt modify (hr_eff_pplan_cycle_id_
null
); 这样是会报错的
下面的才是对的,同时如果
设置
为 非
null
也是 一样的
alter table hr_eff_p...
之前一直使用
mysql
,然后执行sql语句时,如果插入的
字段
是
Null
, 可以正常执行(没有
设置
约束),但换成oracle之后,同样的语句执行却会出现报错的情况,后来发现是
MyBatis
对于默认值处理的问题;
在
mybatis
的文档中有以下介绍:
就是当你的sql语句中赋值的某个
字段
为
NULL
空值时,则
MyBatis
默认
值为
OTHER,但是
mysql
能处理OTHER当成
NULL
,所以mysq...
在做项目的时候,数据库中的所有
字段
被
设置
为全都不能为
null
,但是在我们开发过程中,插入一些记录的时候,实体类中的一些
字段
如果页面没有传入,则默认就会被
设置
为
null
,这样的话,在执行插入语句的时候,数据库就会报错,说指定的列不能为
null
,这样数据就无法插入。
在网上找了一下,都没有这种处理的方式,但是找到了
mybatis
的类型转换,说的是在
java
中的类型和数据库中的类型不一致的时候,需要自
问题:
Mybatis
在做数据插入时,我们插入的数据常常不是完整的,有些
字段
是要允许为空插入的,那么在Mybtis中如何
设置
呢?
insert into table_name(_id,username) values(_id = #{_id,jdbcType=INTEGER},username=#{username,jdbcType=VARCHAR})
加上jdbcType=”数据类
```
java
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("id", userId).set("status", newStatus);
userMapper.update(
null
, wrapper);
其中,userId 为要更新的用户的 ID,newStatus 为要
设置
的新状态值。这段代码会将用户表中 ID 为 userId 的记录的 status
字段
设置
为 newStatus。
注意,这里使用了 update(
null
, wrapper) 方法来执行更新操作,第一个参数传入
null
表示更新所有记录(因为已经在 UpdateWrapper 中指定了要更新的记录),第二个参数传入 UpdateWrapper 对象。