程序笔记   发布时间:2022-07-19  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了MP update不存在的数据返回值一定为零?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_965_0@mP update不存在的数据返回值一定为零?

本文分为以下几个部分:

前言

验证过程

结论

前言

​ MP(mybatis-plus),在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生,增加了代码生成器、Iservice、BaseMapper等功能,方便我们日常 使用 (偷懒),CURD (Create、Retrieve、update、delete)是我们日常开发会碰到的,MP 的 Mapper 的 update 极大缩短了我们需要写的代码(当然也可以使用Iservice的方法)。我们知道这个 update 方法会返回一个 int 类型的值,当我们更新不存在的数据时,返回值是多少呢?

验证过程

使用SpringBoot项目,使用德鲁伊多数据源配置

MP update不存在的数据返回值一定为零?

配置了Oracle(常用)、@H_660_30@mySql(常用)、达梦(安可)分别进行测试,

在三个数据库分别建立三张表

--OracLE
create table test_OracLE(
  ID VARCHAR2(32) PRIMary KEY,
  VALUE VARCHAR2(32)
)

--MYSQL
create table test_R_810_11845@YSQL(
  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,例如

//实体类
@Tabl@R_772_8371@("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);
}

MP update不存在的数据返回值一定为零?

第一次更新了一条数据,所以更新行数为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);
}

MP update不存在的数据返回值一定为零?

@H_236_2@mysql同样,第一次更新了一条数据,所以更新行数为1,第二次更新了没有的数据,返回了 0

我们看一下源码,BaseMapper里面update代码,看不到原始的代码,但是我们可以看一下serviceImpl

MP update不存在的数据返回值一定为零?

查看serviceImpl的retBool方法,一直 ctrl+左键查看调用的方法,最后我们会看到

/**
* 判断数据库操作是否成功
*
* @param result 数据库操作返回影响条数
* @return Boolean
*/
public static Boolean retBool(Integer result) {
    return null != result && result >= 1;
}

MP update不存在的数据返回值一定为零?

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);
}

MP update不存在的数据返回值一定为零?

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

我们在用连接工具看看

MP update不存在的数据返回值一定为零?

    @H_245_135@mysql, update rows = 0

@H_607_149@

  • 达梦, update rows = -1

MP update不存在的数据返回值一定为零?

结论

所以我们在判断是否更新成功时,尽量和源码相同,采用判断返回结果 大于等于1 来判断,而不是单纯的判断是否等于0!

public static Boolean retBool(Integer result) {
    return null != result && result >= 1;
}

大佬总结

以上是大佬教程为你收集整理的MP update不存在的数据返回值一定为零?全部内容,希望文章能够帮你解决MP update不存在的数据返回值一定为零?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。