我们这次来讲一下,怎么样通过mp将数据库中的一个字段更新为null。可能很多人会觉得奇怪,更新为null,直接 set field = null 不就可以了。这里大家要注意一下,一般情况,我们在使用mp的时候,他的默认策略是空不更新, 这个也是非常主流和常见的一种设置。 为什么这么说呢, 比如我们将一个 user 表中的 del_flag 设置为1,一般情况我们只需这么做就行:
User user = new User();
user.setId(1);
user.setDelFlag(1);
userService.update(user);
这个时候,其实其他的字段都是空,如果他的策略是空更新,那么执行之后,表里就只有 id 和del_flag 有值,其余的字段都是Null,很明显这不是我们想要的结果,
这就是默认的空不更新策略。
这个时候就出现了一个痛点,必须我是需要把表中的某个字段更新为空,那应该怎么做的?
一是我们将全局更新策略设置为空可以更新,二是将这个字段设置为空可以更新。这两种方式都是我极力不推荐的,大家也尽量不要使用这两种方法,真的非常危险,有可能导致别人在调用更新方法的时候不小心就把你的某些字段置为 null 了。
这里推荐一种方法,也是官网给出的,但是必须要求 mp 的版本大于3, 如果是 3 以下的版本没有这个功能,就是使用UpdateWrapper
比如,我们想把 user表中的gender设置为空:
LambdaUpadateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
wrapper.set(User::getGender(), null);
wrapper.eq(User::getId(), 1);
userService.update(wrapper);
通过 UpdateWrapper 可以设置 null
mybatis-plus
中
的updateBy
Id
方法,正常情况下,如果设置
字段
为
null
,由于默认的
字段
策略,不会操作此
字段
,不会变为
null
值
,那应该怎么做的?
第一种: 不推荐
上面我说了,默认的
字段
策略会忽略掉,所以我们可以将要设置为
null
的
字段
的策略更改下.例如;
@TableField(strategy = FieldStrategy.IGNORED)
private LocalD...
1.业务需求:
业务为 个人重大事项报告 和 单位重大事项报告 两种。业务类似于:发起办公流程-》部门领导审核-》报备给单位领导。流程发起时,两种流程时分开发起的,所以设计时设计了两张表来记录两种业务。流程发起、审核、报备,设计的是完全独立的。后来由于甲方的脑残需求,要求在单位领导查看报备报备信息时,两张业务合并在一个列表里,并且要按时间排序,要有分页。
2.解决思路:
自定义sql,利用
union
将两张业务表的公共
字段
合并成一个虚拟表
SELECT
gaf
orm
_lpt_30.fi
业务需要关联多个表查询, 并且返回内容不只是一个表(还需要另外一个表的部分
字段
), 并且需要实现分页逻辑
本来看了下
mybatis
封装的查询方式, 没看到怎么进行多表联合, 想着手写实现联合查询并分页, 后面经过同事提醒发现有更加优雅的方式
在调用mapper的时候传入一个page对象,
mybatis-plus
根据这个自动进行分页逻辑处理
新建一个vo, 集成原本的数据...
EntityWrapper 简介
1、
Mybatis
Plus 通过 EntityWrapper(简称 EW,
Mybatis
Plus 封装的一个查询条件构造器)或者 Condition(与 EW 类似) 来让用户自由的构建查询条件,简单便捷,没有额外的负担, 能够有效提高开发效率。
2、实体包装器,主要用于处理 sql 拼接,排序,实体参数查询等。
3、注意: 使用的是
数据库
字段
,不是 Java ...
mybatis
plus
更新
时,如果传入的
值
为
null
,对于update来说是不
更新
当前
字段
,此时对于原本有
值
的数据
更新
为
null
时
更新
不了
解决办法:
LambdaUpdateWrapper<Resource> wrapper =
null
;
for (ResourceToHangDto resourceToHangDto : list) {
Resource resource = new Resource();
//对于mybaits自带的
数据库
操作方法只需要将version放进要
UpdateWrapper<Entity> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("
id
", 1)
.set("field1",
null
)
.set("field2",
null
);
int rows = entityMapper.update(
null
, updateWrapper);
其
中
,`eq()` 方法用于指定
更新
条件,`set()` 方法用于设置
更新
的
字段
及其
值
,`update()` 方法用于执行
更新
操作。在上述代码
中
,`field1` 和 `field2` 的
值
都会被
更新
为
null
。
[code=java]
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
public class JsonListHandler<T> extends AbstractJsonTypeHandler<List<T>> {
@Override
protected List<T> parse(String json) {
return JSON.parseArray(json,getTypeClass());
@Override
protected String toJson(List<T> obj) {
return JSON.toJSONString(obj);
@SuppressWarnings("unchecked")
private Class<T> getTypeClass() {
Type superClass = getClass().getGenericSuperclass();
ParameterizedType parameterizedType = (ParameterizedType) superClass;
Type[] typeArguments = parameterizedType.getActualTypeArguments();
return (Class<T>) typeArguments[0];
[/code]
PostgreSQL - 数据类型 VARCHAR 编码长度问题
CSDN-Ada助手:
MyBatis-Plus - 一篇带你解决自定义 SQL 注入器失效必杀技
陆氪和他的那些代码:
MyBatis-Plus - 一篇带你解决自定义 SQL 注入器失效必杀技
qq_49210759:
程序人生 - 什么是一表二表三表四表生?杭州市公办小学录取顺序最新解读
CSDN-Ada助手: