【技术应用】mybatis数据库操作(insert、update、delete)返回值为0的场景

news2024/11/25 22:24:17

【技术应用】mybatis数据库操作insert、update、delete返回值为0的场景

    • 一、前言
    • 二、数据库异常处理
    • 三、insert操作返回值为: 0
    • 四、update操作返回值为: 0
    • 五、delete操作返回值为: 0
    • 六、总结

一、前言

最近在review项目组成员代码时,发现代码中有很多mybatis执行数据库操作(insert、update、delete)的返回值没有做任何处理,在一些业务场景下可能是存在的潜在bug,产生垃圾数据或者导致数据不一致的问题,所在今天特意总结一下;

mybatis对数据库操作返回值得理解:
insert: **插入n条记录,返回影响行数n。(n>=1,n为0时实际为插入失败)
update:更新n条记录,返回影响行数n。(n>=0
delete: 删除n条记录,返回影响行数n。(n>=0

我们比较容易理解返回值 n>0的情况,但是在什么场景下mybatis操作(insert、update、delete)数据库时,返回值 n =0,这是我们今天总结的主要目的

二、数据库异常处理

在操作数据库时经常遇到异常情况,操作数据库连接conn抛出的异常我们可以直接try{}catch(){}捕获异常,这种情况时没有返回值的,直接对捕获的异常进行事务回滚或者其它处理,这里是没有太大异议的;

我们在写存储过程的时候,可能会出现下列一些情况:

  • 插入的数据违反唯一约束,导致插入失败
  • 插入或者更新数据超过字段最大长度,导致操作失败
  • update 影响行数和期望结果不一致

遇到上面各种异常情况的时,可能需要我们能够捕获,然后可能需要回滚当前事务。

三、insert操作返回值为: 0

在mybatis中insert操作返回值为0的场景不多见,大多数的操作失败都是以异常的形式抛出,我们可以通过try{}catch(){}捕获;

针对insert主要介绍几种可能返回0或者其它返回值的操作命令,也是比较容易出错的地方

1、insert ignore into

mysq 支持 insert ignore into
insert into 表示插入数据,数据库会检查主键(PrimaryKey),如果出现重复会报错;
insert ignore表示,如果中已经存在相同的记录,则忽略当前新数据;

1) sql示例:

INSERT IGNORE INTO tbl_user(id,NAME,age,pass_time)VALUES(9,'哈哈哈',18,11111111);

执行结果:

1 queries executed, 1 success, 0 errors, 1 warnings

查询:INSERT IGNORE INTO tbl_user(id,NAME,age,pass_time)VALUES(9,'哈哈哈',18,11111111)0 行受到影响, 1 个警告

执行耗时   : 0.001 sec
传送时间   : 0.001 sec
总耗时      : 0.002 sec

2) mybatis示例:

mapper方法:

@Insert(value = "INSERT IGNORE INTO tbl_user (id,name,age,pass_time) VALUES (${user.id},'${user.name}',${user.age},${user.pass_time})")
Integer add(@Param(value = "user") User user);

Service类:

@Override
public Integer add(User user) {
  Integer insert = userMapper.add(user);
  System.out.println("insert 执行结果: "+insert);
  return insert;
}

请求:
id=9数据已在数据库表tbl_user中已存在
在这里插入图片描述

执行结果:

2022-12-15 19:45:17.972  INFO 14868 --- [nio-8079-exec-2] o.s.web.servlet.DispatcherServlet        : Completed initialization in 0 ms
insert 执行结果: 0

2、replace into

replace into表示插入替换数据,需求表中有PrimaryKey,或者unique索引的话,如果数据库已经存在数据,则用新数据替换(先删除旧数据,再插入新数据),如果没有数据效果则和insert into一样;

replace语句会返回一个数,来指示受影响的行的数目;

  • 如果数据已存在,返回数为:变更数据行数+执行数据行数;
  • 如果数据不存在,返回数为:执行数据行数;

mysql数据库执行的返回值,即为mybatis操作返回值,为了方便我们接下来会在数据库中操作;

1) replace into 示例:

REPLACE INTO tbl_user(id,NAME,age,pass_time)VALUES(10,'小四',10,10000000000);
REPLACE INTO tbl_user(id,NAME,age,pass_time)VALUES(10,'小四',10,100000001000);

执行结果:

2 queries executed, 2 success, 0 errors, 0 warnings

查询:replace into tbl_user(id,name,age,pass_time)values(10,'小四',10,10000000000)1 行受到影响

执行耗时   : 0.026 sec
传送时间   : 0 sec
总耗时      : 0.026 sec
-----------------------------------------------------------

查询:REPLACE INTO tbl_user(id,NAME,age,pass_time)VALUES(10,'小四',10,100000001000)2 行受到影响

执行耗时   : 0.042 sec
传送时间   : 0 sec
总耗时      : 0.042 sec

2) mybatis示例:

@Override
    public Integer test() {
        User user = new User();
        user.setId(10);
        user.setName("小四");
        user.setAge(10);
        user.setPass_time(10000000002L);
        Integer insert = userMapper.add2(user);
        System.out.println("insert 执行结果: "+insert);
        return insert;
    }

执行结果:

2022-12-15 20:54:08.698  INFO 17236 --- [  restartedMain] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} inited
insert 执行结果: 2

3、on duplicate key update

概念INSERT ... ON DUPLICATE KEY UPDATE 用于解决重复性问题。首先判断记录是否存在,存在时更新,不存在时插入。因此重点在于判断记录是否存在。
判断标准是如果插入的记录导致一个唯一索引或主键重复,就认为该记录已存在。

根据受影响行数可以区分该语句实际上执行的是插入还是更新:

  • 受影响行数为1,表明行作为新纪录插入;
  • 受影响行数为2,表明行重复,原有记录被更新;
  • 受影响行数为0,表明更新的数据与原数据一样,实际上未更新。

1) sql示例:

INSERT INTO tbl_user(id,NAME,age,pass_time)VALUES(12,'小六',10,10000000000) ON DUPLICATE KEY UPDATE NAME=VALUES(NAME),age=VALUES(age),pass_time=VALUES(pass_time);
INSERT INTO tbl_user(id,NAME,age,pass_time)VALUES(12,'小六',11,10000000000) ON DUPLICATE KEY UPDATE NAME=VALUES(NAME),age=VALUES(age),pass_time=VALUES(pass_time);
INSERT INTO tbl_user(id,NAME,age,pass_time)VALUES(12,'小六',11,10000000000) ON DUPLICATE KEY UPDATE NAME=VALUES(NAME),age=VALUES(age),pass_time=VALUES(pass_time);

执行结果:

3 queries executed, 3 success, 0 errors, 3 warnings

查询:INSERt INTO tbl_user(id,NAME,age,pass_time)VALUES(12,'小六',10,10000000000) on duplicate key update NAME=VALUES(NAME),age=VALU...1 行受到影响, 3 个警告

执行耗时   : 0.057 sec
传送时间   : 0.001 sec
总耗时      : 0.058 sec

注意:要查看所有警告的完整列表,请启用 工具 -> 首选项 -> 常规 -> 在信息选项卡下显示警告
-----------------------------------------------------------

查询:INSERT INTO tbl_user(id,NAME,age,pass_time)VALUES(12,'小六',11,10000000000) ON DUPLICATE KEY UPDATE NAME=VALUES(NAME),age=VALU...2 行受到影响, 3 个警告

执行耗时   : 0.063 sec
传送时间   : 0 sec
总耗时      : 0.063 sec

注意:要查看所有警告的完整列表,请启用 工具 -> 首选项 -> 常规 -> 在信息选项卡下显示警告
-----------------------------------------------------------

查询:INSERT INTO tbl_user(id,NAME,age,pass_time)VALUES(12,'小六',11,10000000000) ON DUPLICATE KEY UPDATE NAME=VALUES(NAME),age=VALU...0 行受到影响, 3 个警告

执行耗时   : 0.001 sec
传送时间   : 0 sec
总耗时      : 0.001 sec

注意:要查看所有警告的完整列表,请启用 工具 -> 首选项 -> 常规 -> 在信息选项卡下显示警告

2) mybatis示例:

@Override
    public Integer test() {

        //  12,'小六',11,10000000000

        User user = new User();
        user.setId(15);
        user.setName("小六");
        user.setAge(11);
        user.setPass_time(10000000010L);
        Integer insert = userMapper.add3(user);
        System.out.println("insert 执行结果: "+insert);
        return insert;
    }

执行结果:

2022-12-15 21:01:41.720  INFO 12340 --- [  restartedMain] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} inited
insert 执行结果: 1

注:在insert数据没有变更时,在mysql客户端执行返回的影响行数为0,但是在mybatis执行返回值为1,这里的原因还有待分析;

四、update操作返回值为: 0

update操作返回值为0比较常见的一种情况为:根据主键更新数据库表中的数据时,如果数据库表tbl_user中没有id=13的数据,返回影响行数:0

1) sql示例:

UPDATE tbl_user SET NAME='小七' , age=18, pass_time=10000000000 WHERE ID=13

执行结果:

<n>查询:UPDATE tbl_user SET name='小七' , age=18, pass_time=10000000000 WHERE ID=130 行受到影响

执行耗时   : 0.001 sec
传送时间   : 0 sec
总耗时      : 0.001 sec

2) mybatis示例:

@Override
    public Integer test() {

        //  12,'小六',11,10000000000

        User user = new User();
        user.setId(13);
        user.setName("小七");
        user.setAge(18);
        user.setPass_time(10000000010L);
        Integer insert = userMapper.update(user);
        System.out.println("insert 执行结果: "+insert);
        return insert;
    }

执行结果:

2022-12-15 21:04:41.245  INFO 7896 --- [  restartedMain] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} inited
insert 执行结果: 0

五、delete操作返回值为: 0

delete操作返回值为0比较常见的一种情况为:根据某个属性(示例为id=13)删除数据库表中的数据时,如果数据库表tbl_user中没有id=13的数据,返回影响行数:0

1) sql示例:

DELETE FROM tbl_user WHERE ID = 13;

执行结果:

1 queries executed, 1 success, 0 errors, 0 warnings

查询:DELETE FROM tbl_user WHERE ID = 130 行受到影响

执行耗时   : 0.001 sec
传送时间   : 0.001 sec
总耗时      : 0.002 sec

2) mybatis示例:

@Override
    public Integer test() {

        //  12,'小六',11,10000000000

        /*User user = new User();
        user.setId(13);
        user.setName("小七");
        user.setAge(18);
        user.setPass_time(10000000010L);*/
        Integer delete = userMapper.delete(13);
        System.out.println("insert 执行结果: "+delete);
        return delete;
    }

执行结果:

2022-12-15 21:06:17.742  INFO 12644 --- [  restartedMain] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} inited
insert 执行结果: 0

六、总结

在使用mybatis操作数据库时,返回值一定要结合不同的使用场景进行业务处理,避免潜在的bug,也是代码规范性的体现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/92707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

涉及准考证相关需要关注的一系列问题,涉及防疫、考点信息、计算器等内容

12月14日起可以打印准考证&#xff01;这是一件操作并不复杂的工作&#xff0c;但打印下来以后可能会遇到一些细节问题&#xff0c;对此我们梳理出来供大家参考&#xff0c;有则改之&#xff0c;无则更好&#xff01; 1.有关省份个人健康申报表等如何填写&#xff1f;如您报考点…

web网页设计期末课程大作业:美食餐饮文化主题网站设计——美食汇5页HTML+CSS+JavaScript

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

事业编招聘:南方科技大学附属实验学校2022年·面向应届毕业生招聘在编教师公告

南方科技大学是在中国高等教育改革发展背景下创建的一所高起点公办创新型大学&#xff0c;2022年2月14日&#xff0c;教育部等三部委公布第二轮“双一流”建设高校及建设学科名单&#xff0c;南方科技大学入选“双一流”建设高校名单。 南方科技大学附属实验学校&#xff0c;地…

部署了一个个人博客(好歹服务器不是闲着了)

界面前台界面展示&#xff08;给到浏览用户&#xff09;后台界面展示&#xff08;简单介绍&#xff09;技术说明前台界面展示&#xff08;给到浏览用户&#xff09; 肯定首先将界面展示一下。声明一下这个不是我原创的界面&#xff0c;当然这个是可以改造的。这个在安全上还有…

血氧仪的分类与价格区别

有没有发现最近血氧仪、额温枪、壁挂式测温仪又开始火了&#xff1f;并且市场活跃度越来越高。而作为我们血氧仪方案提供商或者生产企业来说&#xff0c;您是不是和优优一样会时常听到客户发出如下反馈&#xff1a; “我刚问了另外一家&#xff0c;和你这个样子差不多的&#…

VC++2010中使用MSDN library 200X版本

前言 以前一直用VS2005 ,帮助文档调用很方便&#xff0c;现在要使用VS2010版本来写程序&#xff0c;这个帮助文档真是不方…… 自己写了一个F1的按键助手&#xff0c;这下我可 以使用VS2008中的帮助文档了&#xff0c;虽然帮助低一个版本&#xff0c;但是写C程序&#xff0c;…

七个步骤覆盖 API 接口测试

接口测试作为最常用的集成测试方法的一部分&#xff0c;通过直接调用被测试的接口来确定系统在功能性、可靠性、安全性和性能方面是否能达到预期&#xff0c;有些情况是功能测试无法覆盖的&#xff0c;所以接口测试是非常必要的。首先需要对接口测试的基本信息做一些了解&#…

阿里面试题库被“泄露“导致多人进大厂,惨遭多家大厂威胁下架

我有一个玩得特别好的朋友找我帮忙&#xff0c;说他儿子去大厂面试几次没刷下来&#xff0c;要求我帮他儿子出出主意&#xff0c;大概了解他儿子的情况后&#xff0c;我就给他推荐了这本软件测试10万总结&#xff0c;大概过了几个月他就给我发信息了&#xff0c;说他已经靠这份…

(一) Oriented R-CNN

文章目录0.基础介绍1.旋转框的中点偏移表示法2.Oriented R-CNN架构2.1 Oriented RPN2.2 Rotated RoI Alignment参考资料欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; 论文&#xff1a;Oriented R-CNN for Object Detection 代码&#xf…

Erlang - 入门之一日志系统如何打印输出使用lager框架

在合适的地方插入一句代码即可&#xff1a; lager:error("Some Message"), 就这样&#xff0c;谢谢阅读 。。。。。。。 。。。。。。。。。 。。。。。。。。。。。 。。。。。。。。。。。。。。 。。。。。。。。。。。。。。。。。 没有什么比从直接“”…

web前端网页课程设计大作业 html+css+javascript天津旅游(11页) dw静态旅游网页设计实例 企业网站制作

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

草料二维码如何在多行业实现管理和自动化工作

二维码&#xff0c;在我们的日常生活中随处可见&#xff0c;不管是我们常用的微信支付&#xff0c;还是日常出入的场所码&#xff0c;已经渗透在我们生活的点点滴滴中。 如果我们自己也希望通过二维码&#xff0c;来传达文字、数据等信息&#xff0c;那么很多人都肯定给你推荐…

NS3笔记

NS3笔记1 Docker环境配置1.1 Docker安装1.2 镜像安装1.3 安装其他软件1.4 安装ns31 Docker环境配置 1.1 Docker安装 俺是macOS&#xff0c;直接参考这个网址。 1.2 镜像安装 俺打算安装Ubuntu18.04&#xff0c;镜像版本可以Ubuntu 镜像库 # 拉取镜像 docker pull ubuntu:18…

深入理解可升级智能合约

准备 为了理解可升级合约&#xff0c;必须理解proxy机制&#xff0c;要理解proxy机制&#xff0c;必须理解solidity的sstore和sload,以及关于以太坊架构和存储结构&#xff08;数据结构&#xff09;。 关于Solidity中的sstore和sload深入理解&#xff1a; 非常好的一篇剖析&…

SAP ABAP 散装笔记20220825

SAP ABAP 散装笔记20220825 引言&#xff1a; 散装笔记的标题系列中记录了我常用、备忘、易错的知识点。 关键字&#xff1a;SAP ABAP 散装笔记 知识点 文章目录SAP ABAP 散装笔记202208251. 获取域值和域值描述的两种方式2. 打开新的会话窗口&#xff08;并执行可能的事务码…

西妥昔单抗丨艾美捷西妥昔单抗Cetuximab方案

西妥昔单抗Cetuximab是针对人表皮生长因子受体的一种单克隆抗体&#xff0c;主要作用就是与表皮生长因子受体结合&#xff0c;阻断表皮生长因子受体与其它配体的结合而达到抗肿瘤的目的。各种恶性肿瘤细胞&#xff0c;例如直肠癌细胞、胃癌细胞&#xff0c;表面都高表达表皮生长…

WebStorm pull(拉取)项目commit(提交)、push(推送)代码

1.打开WebStrom&#xff0c;找到Git---克隆... 2.输入需要克隆的项目地址&#xff0c;将其项目克隆下来 3.pull&#xff08;拉取&#xff09;、commit&#xff08;提交&#xff09;、push&#xff08;推送&#xff09; 4.在你本地新建一个和你git分支一样名字的分支 5.改完代码…

Eslint

1. 配置文件 配置文件由很多种写法&#xff1a; .eslintrc.*&#xff1a;新建文件&#xff0c;位于项目根目录 .eslintrc.eslintrc.js.eslintrc.json区别在于配置格式不一样package.json 中 eslintConfig&#xff1a;不需要创建文件&#xff0c;在原有文件基础上写。 2. 具体…

什么是Python?Python有什么特性?

什么是Python&#xff0c;相信第一次接触Python的同学会有一些疑问。我们通过百度百科得到Python的定义为&#xff1a;   Python是一种跨平台的计算机程序设计语言。是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本&#xff…

UDS入门至精通系列:诊断时间参数

文章目录 前言一、诊断时间参数 P2二、诊断时间参数 P2*三、诊断时间参数 S3四、上述参数在应用中的汇总总结前言 在职场中,对于自己领导吩咐的事情,事事有响应,是你在领导面前彰显自己能力的机会。并且这其中的响应时间就是你职业能力的时刻。 同样在汽车电子诊断领域,因…