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( ...
随机推荐
- mysql 重新整理——索引优化一个简单的案例 [十一]
前言 经过了前面的一系列理论,那么用一个例子去看一下吧. 正文 EXPLAIN SELECT t3.emp_no,t3.first_name,(select t4.last_name from tem ...
- Caused by: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveException: Could not resolve all files for configuration ':classpath'.
前言 这个错误怎么看呢? 如果你对gradle 不是很了解的话,有一个建议,就是把异常背下来,当然是看这个:ArtifactResolveException哈. 而不是后面的详情. 正文 给我们详情是 ...
- Thread.Suspend和Abort 的区别
理解: 在C#中,Thread.Suspend是一个方法,用于暂停当前线程的执行.它会导致线程停止执行并进入挂起状态,直到调用Thread.Resume方法才能继续执行. 然而,Thread.Susp ...
- leetcode插件问题
1.使用一段时间后,提交答案一直返回undefind 原因为插件缓存token有效期已过,需要重新登录 2. 重新登录
- Oracle ORA-12725 unmatched parentheses in regular expression
Oracle ORA-12725 unmatched parentheses in regular expression 简单来说就是正则表达式中的括号问题 这种一般就可以锁定使用正则的函数,例如 r ...
- 牛客网-SQL专项训练12
①SQL中属于分组查询的语句是?(C) 解析: A Where: 条件筛选B 联盟链: 非相关内容C Group By:分组D Having: 条件筛选 区块链大致可以分为公有链(Public Blo ...
- 阿里云EMAS旗下低代码平台Mobi开放定向内测
简介:[低代码深度共创]EMAS旗下低代码平台Mobi开放定向内测名额,限时限量,参与调研先到先得! Mobi是面向全端(Web.Native App.H5.全平台小程序等)场景,模型驱动的低代码开 ...
- WPF 漂亮的现代化控件 新 ModernWPF 界面库
这是一个在 GitHub 上完全开源的库,有十分漂亮的界面,整个都是 Win10 风,界面部分和默认 UWP 相近 这个库支持了 .NET Framework 4.5 和以上的版本,以及 .NET C ...
- dotnet 在 UOS 国产系统上使用 MonoDevelop 进行拖控件开发 GTK 应用
先从一个 Hello World 应用开始,试试和古老的 WinForms 一样的拖控件式开发 在创建完成一个 GTK# 2.0 应用之后,咱可以试试开始拖控件的开发,当然这个开发方式开发出来的应用界 ...
- Solution Set - 加训 CF!
加训一些 CF 题,这里写一些简要题解,可能是草稿. 暂定只做 Div.1 的题和 Div.1+Div.2 的后一半题.