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不存在的数据返回值一定为零?的更多相关文章

  1. java通过jdbc访问mysql,update数据返回值的思考

    java通过jdbc访问mysql,update数据返回值的思考 先不说那么多,把Java代码贴出来吧. public static void main(String[] args) throws I ...

  2. mybatis的selectOne和selectList没有数据返回时的问题

    1.使用mybatis的selectList方法,如果数据表中没有数据返回,则返回空集合[ ],而不会返回null,这是mybatis作的封装 @Override public List<Con ...

  3. mybatis Mapper 中resultType使用方法及返回值为Map的写法

    mybatis学习(七)——resultType解析 resultType是sql映射文件中定义返回值类型,返回值有基本类型,对象类型,List类型,Map类型等.现总结一下再解释 总结: resul ...

  4. http数据返回值

    HTTP 400 - 请求无效HTTP 401.1 - 未授权:登录失败HTTP 401.2 - 未授权:服务器配置问题导致登录失败HTTP 401.3 - ACL 禁止访问资源HTTP 401.4 ...

  5. sql 语句 插入数据 返回值问题

    1. 主键ID 自增 ,插入数据后返回这条数据的ID值 insert into tableName() values() select @@identity 2.主键ID 使用GUID类型值 ,插入数 ...

  6. C++ map插入(insert)数据返回值

    例子: typedef boost::unordered_map<int, int> UserOnlineMap; UserOnlineMap userOnlineMap_; std::p ...

  7. MyBatis中Mapper的返回值类型

    insert.update.delete语句的返回值类型 对数据库执行修改操作时,数据库会返回受影响的行数. 在MyBatis(使用版本3.4.6,早期版本不支持)中insert.update.del ...

  8. ResultMap和ResultType在使用中的区别、MyBatis中Mapper的返回值类型

    在使用mybatis进行数据库连接操作时对于SQL语句返回结果的处理通常有两种方式,一种就是resultType另一种就是resultMap,下面说下我对这两者的认识和理解 resultType:当使 ...

  9. mybatis的增删改查返回值小析(六)

    本文验证了通过mybatis访问数据库时的,增删改查的返回值情况. 直接看代码. 1.service层 /** *@Author: Administrator on 2020/3/12 15:15 * ...

  10. MyBatis查询结果resultType返回值类型详细介绍

    一.返回一般数据类型 比如要根据 id 属性获得数据库中的某个字段值. mapper 接口: // 根据 id 获得数据库中的 username 字段的值 String getEmpNameById( ...

随机推荐

  1. HarmonyOS 3.1版本发布,全面进入声明式开发

    原文:https://mp.weixin.qq.com/s/kyyYCjrl6E8MBxKpBSKNWg,点击链接查看更多技术内容.   开发者的脚步永不停歇,2022年我们发布了HarmonyOS ...

  2. RC4Drop加密技术:原理、实践与安全性探究

    第一章:介绍 1.1 加密技术的重要性 加密技术在当今信息社会中扮演着至关重要的角色.通过加密,我们可以保护敏感信息的机密性,防止信息被未经授权的用户访问.窃取或篡改.加密技术还可以确保数据在传输过程 ...

  3. Django框架——ORM执行SQL语句、神奇的双下划线、外键字段的创建、跨表查询、进阶操作

    ORM执行SQL语句 有时候ORM的操作效率可能偏低 我们是可以自己编写SQL的 方式一: models.User.objects.raw('select * from app01_user') 方式 ...

  4. 力扣608(MySQL)-树节点(中等)

    题目: 给定一个表 tree,id 是树节点的编号, p_id 是它父节点的 id . 树中每个节点属于以下三种类型之一: 叶子:如果这个节点没有任何孩子节点.根:如果这个节点是整棵树的根,即没有父节 ...

  5. 力扣151(java)-颠倒字符串中的单词(中等)

    题目: 给你一个字符串 s ,颠倒字符串中 单词 的顺序. 单词 是由非空格字符组成的字符串.s 中使用至少一个空格将字符串中的 单词 分隔开. 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果 ...

  6. DataX在数据迁移中的应用

    简介: DataX在数据迁移中的应用 1. DataX定义 首先简单介绍下datax是什么.DataX是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.SqlSe ...

  7. Quick BI产品核心功能大图(六)开放集成

    ​简介:企业想要拥有领先的数据分析能力,自研往往需要投入巨大的人力和财力. Quick BI作为唯一一个连续两年入选Gartner魔力象限的中国BI产品,具备强大的全链路开放集成能力,可以轻松的与企业 ...

  8. 超详攻略!Databricks 数据洞察 - 企业级全托管 Spark 大数据分析平台及案例分析

    简介: 5分钟读懂 Databricks 数据洞察 ~ 更多详细信息可登录 Databricks 数据洞察 产品链接:https://www.aliyun.com/product/bigdata/sp ...

  9. [Py] Python 字符串 str 和 字节 bytes 的互转

    字节转字符串: st = str(data, encoding = "utf8") print(st) print(type(str)) # <class 'str'> ...

  10. WPF 在 .NET Core 3.1.19 版本 触摸笔迹偏移问题

    在更新到 .NET 6 发布之前的,在 2021.11.02 的 .NET Core 版本,都会存在此问题.在 WPF 应用里面,如果在高 DPI 下,进行触摸书写,此时的笔迹将会偏移.核心原因是在这 ...