Mybatis-Plus update不存在的数据返回值一定为零?
MP update不存在的数据返回值一定为零?
本文分为以下几个部分:
前言
MP(mybatis-plus),在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生,增加了代码生成器、IService、BaseMapper等功能,方便我们日常 使用 (偷懒),CURD (Create、Retrieve、Update、Delete)是我们日常开发会碰到的,MP 的 Mapper 的 update 极大缩短了我们需要写的代码(当然也可以使用IService的方法)。我们知道这个 update 方法会返回一个 int 类型的值,当我们更新不存在的数据时,返回值是多少呢?
验证过程
使用SpringBoot项目,使用德鲁伊多数据源配置

配置了Oracle(常用)、MySql(常用)、达梦(安可)分别进行测试,
在三个数据库分别建立三张表
--ORACLE
create table TEST_ORACLE(
ID VARCHAR2(32) PRIMARY KEY,
VALUE VARCHAR2(32)
)
--MYSQL
create table TEST_MYSQL(
ID VARCHAR(32) primary key,
VALUE VARCHAR(32)
)
--达梦
create table TEST_DM(
ID VARCHAR2(32) PRIMARY KEY,
VALUE VARCHAR2(32)
)
--分别插入 '1' '1' 数据,即 ID='1' VALUE='1'
创建三个实体类,及对应的Mapper,注意Mapper 应该extends BaseMapper,例如
//实体类
@TableName("TEST_ORACLE")
@Data
public class TestOracle {
private String id;
private String value;
}
//mapper
@Mapper
public interface TestOracleMapper extends BaseMapper<TestOracle> {
}
使用SpringBootTest来进行测试,先进行oracle的测试,第一次更新我们数据库ID='1'的数据,第二次更新不存在的数据,主要看第二次返回值
@Test
void testOracle() {
log.info(oracleMapper.selectList(null)+"");
UpdateWrapper<TestOracle> wrapper = new UpdateWrapper<>();
wrapper.set("VALUE","2");
wrapper.eq("ID","1");
int updateNum = oracleMapper.update(null, wrapper);
log.info("更新行数:"+updateNum);
log.info(oracleMapper.selectList(null)+"");
UpdateWrapper<TestOracle> wrapper2 = new UpdateWrapper<>();
wrapper2.set("VALUE","2");
wrapper2.eq("ID","BIN");
int updateNum2 = oracleMapper.update(null, wrapper2);
log.info("更新行数:"+updateNum2);
}

第一次更新了一条数据,所以更新行数为1,第二次更新了没有的数据,返回了 0 ,一条没更新,返回0感觉也很正常。
再测试一下Mysql
@Test
void testMysql() {
log.info(mysqlMapper.selectList(null)+"");
UpdateWrapper<TestMysql> wrapper = new UpdateWrapper<>();
wrapper.set("VALUE","2");
wrapper.eq("ID","1");
int updateNum = mysqlMapper.update(null, wrapper);
log.info("更新行数:"+updateNum);
log.info(mysqlMapper.selectList(null)+"");
UpdateWrapper<TestMysql> wrapper2 = new UpdateWrapper<>();
wrapper2.set("VALUE","2");
wrapper2.eq("ID","BIN");
int updateNum2 = mysqlMapper.update(null, wrapper2);
log.info("更新行数:"+updateNum2);
}

mysql同样,第一次更新了一条数据,所以更新行数为1,第二次更新了没有的数据,返回了 0。
我们看一下源码,BaseMapper里面update代码,看不到原始的代码,但是我们可以看一下ServiceImpl

查看ServiceImpl的retBool方法,一直 ctrl+左键查看调用的方法,最后我们会看到
/**
* 判断数据库操作是否成功
*
* @param result 数据库操作返回影响条数
* @return boolean
*/
public static boolean retBool(Integer result) {
return null != result && result >= 1;
}

result 就是刚才的返回值,其中有判断 大于等于1 然后判断为有更新状态,返回 true,注意这里判断的是 大于等于 1,而不是直接判断 等于0,难道还有小于 0 的?
我们刚才配置了三个数据源,现在测试一下达梦数据库
@Test
void testDm() {
log.info(dmMapper.selectList(null)+"");
UpdateWrapper<TestDm> wrapper = new UpdateWrapper<>();
wrapper.set("VALUE","2");
wrapper.eq("ID","1");
int updateNum = dmMapper.update(null, wrapper);
log.info("更新行数:"+updateNum);
log.info(dmMapper.selectList(null)+"");
UpdateWrapper<TestDm> wrapper2 = new UpdateWrapper<>();
wrapper2.set("VALUE","2");
wrapper2.eq("ID","BIN");
int updateNum2 = dmMapper.update(null, wrapper2);
log.info("更新行数:"+updateNum2);
}

我们发现,当达梦正常更新的时候,返回的是更新的行数,但是当更新不存在的数据时,返回的却是 -1,所以MP的作者用的是 大于等于1 来判断是否更新成功,而不是 ==0;
我们在用连接工具看看
- oracle, update rows = 0

- mysql, update rows = 0

- 达梦, update rows = -1

结论
所以我们在判断是否更新成功时,尽量和源码相同,采用判断返回结果 大于等于1 来判断,而不是单纯的判断是否等于0!
public static boolean retBool(Integer result) {
return null != result && result >= 1;
}
PS:同理delete操作返回值也和update一样,但是不建议用delete方法,能用逻辑删除就少使用物理删除。
Mybatis-Plus update不存在的数据返回值一定为零?的更多相关文章
- java通过jdbc访问mysql,update数据返回值的思考
java通过jdbc访问mysql,update数据返回值的思考 先不说那么多,把Java代码贴出来吧. public static void main(String[] args) throws I ...
- mybatis的selectOne和selectList没有数据返回时的问题
1.使用mybatis的selectList方法,如果数据表中没有数据返回,则返回空集合[ ],而不会返回null,这是mybatis作的封装 @Override public List<Con ...
- mybatis Mapper 中resultType使用方法及返回值为Map的写法
mybatis学习(七)——resultType解析 resultType是sql映射文件中定义返回值类型,返回值有基本类型,对象类型,List类型,Map类型等.现总结一下再解释 总结: resul ...
- http数据返回值
HTTP 400 - 请求无效HTTP 401.1 - 未授权:登录失败HTTP 401.2 - 未授权:服务器配置问题导致登录失败HTTP 401.3 - ACL 禁止访问资源HTTP 401.4 ...
- sql 语句 插入数据 返回值问题
1. 主键ID 自增 ,插入数据后返回这条数据的ID值 insert into tableName() values() select @@identity 2.主键ID 使用GUID类型值 ,插入数 ...
- C++ map插入(insert)数据返回值
例子: typedef boost::unordered_map<int, int> UserOnlineMap; UserOnlineMap userOnlineMap_; std::p ...
- MyBatis中Mapper的返回值类型
insert.update.delete语句的返回值类型 对数据库执行修改操作时,数据库会返回受影响的行数. 在MyBatis(使用版本3.4.6,早期版本不支持)中insert.update.del ...
- ResultMap和ResultType在使用中的区别、MyBatis中Mapper的返回值类型
在使用mybatis进行数据库连接操作时对于SQL语句返回结果的处理通常有两种方式,一种就是resultType另一种就是resultMap,下面说下我对这两者的认识和理解 resultType:当使 ...
- mybatis的增删改查返回值小析(六)
本文验证了通过mybatis访问数据库时的,增删改查的返回值情况. 直接看代码. 1.service层 /** *@Author: Administrator on 2020/3/12 15:15 * ...
- MyBatis查询结果resultType返回值类型详细介绍
一.返回一般数据类型 比如要根据 id 属性获得数据库中的某个字段值. mapper 接口: // 根据 id 获得数据库中的 username 字段的值 String getEmpNameById( ...
随机推荐
- How Python Handles Big Files
The Python programming language has become more and more popular in handling data analysis and proc ...
- k8s 深入篇———— 编排[八]
前言 简单整理一下编排. 正文 一个deployment 例子: apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployme ...
- nginx重新整理——————http 模块中的请求过程[十一]
前言 简单介绍一下http的一些指令. 正文 一般http的嵌套规则是这样的: http{ upstream{} split_clients {} map{} gep{} server{ if(){} ...
- JavaScript中的事件模型如何理解?
一.事件与事件流 javascript中的事件,可以理解就是在HTML文档或者浏览器中发生的一种交互操作,使得网页具备互动性, 常见的有加载事件.鼠标事件.自定义事件等 由于DOM是一个树结构,如果在 ...
- ImageJ软件使用教程(三):目标计数
目录 多点工具法 阀值分割法 二值化 填充分割 自动计数 显示结果 总结 参考资料 本文以钢筋计数为例,讲解一下如何使用ImageJ软件进行计数,这里只介绍两种方法: 多点工具法 阀值分割法 钢筋计数 ...
- 拥抱云原生,Fluid结合JindoFS :阿里云OSS加速利器
简介: Fluid 是一个开源的 Kubernetes 原生的分布式数据集编排和加速引擎,主要服务于云原生场景下的数据密集型应用.在 Fluid 上使用和部署 JindoRuntime 实现数据集的可 ...
- [Go] Go Module 私有依赖包的管理
一些自研开发的第三方包,特别是一些业务依赖包,是不允许公开下载的(私有库),并且版本库也可能不支持HTTPS协议, 因此无法使用 go get 或者 go.mod 进行下载和管理,可以通过 GOPRI ...
- 什么是 ELF 文件(文件格式)
ELF 是一种用于二进制文件.可执行文件.目标代码.共享库和核心转储格式文件. 是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI) ...
- dotnet CBB 为什么决定推送 Tag 才能打包
通过推送 Tag 才打 NuGet 包的方法的作用不仅仅是让打包方便,让打包这个动作可以完全在本地执行,无需关注其他系统的使用步骤.更重要的是可以强制每个可能被安装的 NuGet 包版本都能有一个和他 ...
- 原生js写悬浮广告效果
网上抄的,改成vue写法失败,下一篇是自己写的vue版本的 <html> <head> <meta http-equiv="Content-Type" ...