[这可能是最好的Spring教程!]JDBC的数据库更新

news/2025/1/10 17:06:30/文章来源:https://www.cnblogs.com/ENchantedN/p/18664302

插入

更改成相应的SQL语句就差不多了,只不过最后的不是executeQuery()​,而是executeUpdate()

示例代码如下:

try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) {try (PreparedStatement ps = conn.prepareStatement("INSERT INTO students (id, grade, name, gender) VALUES (?,?,?,?)")) {ps.setObject(1, 999); // 注意:索引从1开始ps.setObject(2, 1); // gradeps.setObject(3, "Bob"); // nameps.setObject(4, "M"); // genderint n = ps.executeUpdate(); // 1}
}

更改的地方:

  • SQL语句的更改
  • 运行使用executeUpdate()

自增主键的获取

本身有主键的数据库有主键的时候是不需要设置主键的,会自己分配。对于使用自增主键的程序,有些时候我们需要获取其自增主键,所以我们这个地方就来看如何获取。


主键:是数据库中用于唯一标识表中每一条记录的列或一组列。主键列的值必须是唯一的,且不能为 NULL​,确保表中的每一行都有一个独特的标识。
自增主键:自己可以指定一个主键,不用在每次插入数据的时候专门去单独给个主键值,他自己会设置值,并且会在每次插入新记录时自动递增,无需手动指定

try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) {try (PreparedStatement ps = conn.prepareStatement("INSERT INTO students (grade, name, gender) VALUES (?,?,?)",Statement.RETURN_GENERATED_KEYS)) {ps.setObject(1, 1); // gradeps.setObject(2, "Bob"); // nameps.setObject(3, "M"); // genderint n = ps.executeUpdate(); // 1try (ResultSet rs = ps.getGeneratedKeys()) {if (rs.next()) {long id = rs.getLong(1); // 注意:索引从1开始}}}
}

我们从中能看到的是在创建PreparedStatement​的时候,多加了一个参数:Statement.RETURN_GENERATED_KEYS​,确保在执行插入操作时,可以立即返回由数据库生成的自增主键,这个操作能解决两个问题:

  1. 若是先插入数据,再查询获取主键,这两者语句的执行时带有时间差的,如果这个时候其他的线程也对其进行了插入,那么获得的主键可能就是之后插入的,而不是之前的了
  2. 多个程序同时访问数据库时,直接依赖查询的结果可能不准确。比如,如果你查询的是最后一条记录,但并不保证是你刚刚插入的记录。

值得注意的是,这个地方没有使用SELECT LAST_INSERT_ID()​去获取主键,而是使用了getGeneratedKeys()​,这样做能够确保在并发环境下能够正确获取到当前插入记录的主键,而不会被其他并发插入操作影响。(因为LAST_INSERT_ID()​是获取最近一次插入操作生成的自增主键,一旦有并发的插入就会使得"最近"不是我们所认为的"最近")

getGeneratedKeys()​方法会返回一个 ResultSet​对象,这个对象包含了数据库自动生成的主键的值,读取该对象的每一行来获取自增主键的值。如果一次插入多条记录,那么这个ResultSet​对象就会有多行返回值。如果插入时有多列自增,那么ResultSet​对象的每一行都会对应多个自增值(自增列不一定必须是主键)。

更新与删除

更新与删除的语句与插入在语法几乎相同,只需要更改SQL语句就行,这里就不多讲了,看下示例的代码就行

更新

try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) {try (PreparedStatement ps = conn.prepareStatement("UPDATE students SET name=? WHERE id=?")) {ps.setObject(1, "Bob"); // 注意:索引从1开始ps.setObject(2, 999);int n = ps.executeUpdate(); // 返回更新的行数}
}

删除

try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) {try (PreparedStatement ps = conn.prepareStatement("DELETE FROM students WHERE id=?")) {ps.setObject(1, 999); // 注意:索引从1开始int n = ps.executeUpdate(); // 删除的行数}
}

这可能是最好的Spring教程!

感谢您看到这里 这可能是最好的Spring教程系列 更多的文章可以到这查看这可能是最好的Spring教程!即便无基础也能看懂的入门Spring,仍在持续更新。,我还在荔枝更新出最详细的Spring教程

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式截屏工具-gsnap移植 arm平台

# 目录 - [前言](#前言) - [正文](#正文)- [原理](#原理)- [环境](#环境)- [详细流程](#详细流程)- [使用](#使用) - [参考](#参考)# 正文 ## 原理 ### 前提条件: 嵌入式机器要支持`/dev/fb0`这个设备节点。不然,这个工具基本就使用不了了。### 原理: 由于 Linux 系统的 Frame…

AIME2019 I

AIME2019 I 的题目订正。√√√√ √√.√√ ...√. \(= 9\) https://artofproblemsolving.com/wiki/index.php/2019_AIME_I_Problems P4 寄啦! 唐题。分讨 substitution 的次数即可。 P5 对啦! DP。 令 \(f_{x,y}\) 为走到 \((x,y)\) 的概率。边界情况为 \(f_{4,4} = 1\)。答…

通过本地私有的镜像仓库harbor解决网络原因导致的jdk无法加载而造成的docker打包错误.v2.250110

​各种网络原因,或是docker.io无法访问,或是阿里的镜像源故障,导致java打包发布的时候报错,很影响代码发布的质量。解决思路:墙出去把jdk下载下来,代码使用本地的harbor库进行引用,一劳永逸。此解决方法也适用于国外优质不频繁变动的镜像源的本地化使用。解决方法 1. 自…

[题目记录]AGC005E Sugigma: The Showdown

一道通过自己生成思路做出的思维题 . 通过分析博弈过程发现问题其实没有那么复杂 , 然后层层分析转化问题即可 .AGC005E Sugigma: The Showdown 题意 给出两棵树 , 点的编号相同 , 连边方式不同 . 初始 A 在树 \(a\) 上的点 \(x\) , B 在树 \(b\) 上的点 \(y\) , 两人轮流走 , …

代码随想论算法训练营第3天 | 链表理论基础,203.移除链表元素,707.设计链表,206.反转链表

一、刷题部分 1.1 链表理论基础原文链接:代码随想录 题目链接:🈚️链表是由一个个节点串联而成的,节点包含数据域和指针域,数据域用来存放数据,而指针域实现了节点之间的串联。 链表中有单链表、双链表、循环链表:链表的物理空间是不连续的,通过指针存储下一节点的物理…

ABAP配置:OY01 定义国家/地区

配置:OY01 定义国家/地区 事务代码:OY01 配置路径 SPRO-ABAP平台-常规设置-设置国家-定义国家/地区 配置路径截图配置描述 国家是SAP里面一个非常重要的概念,SAP国家概念涉及公司代码、工厂、主数据、跨国银行交易,系统默认自带ISO相关的国家编码,在S/4中,一些配置转移到…

关于GTM,这些评价指标你都知道吗?

目标跟踪指标是企业实现持续增长和盈利的重要工具。通过定期监控和分析这些指标,企业可以及时发现潜在问题并采取相应的改进措施,以保持其竞争力并实现业务目标。因此,企业应该重视这些指标的应用,并不断优化其监控和分析流程,以确保其业务运营的顺利进行。Goal Tracking …

ODX诊断数据库转换工具 - DDC

INTEWORK-DDC (Diagnostic Database Convertor) 是将诊断调查问卷转换为标准ODX(2.2.0)数据库的工具。ODX是格式标准化的诊断数据库文件,我们在诊断不同的车或者不同的ECU时,只需要加载适配这个车型或ECU的ODX文件即可,而无需对诊断仪做任何改变。ODX统一了诊断文件的格式,…

异地多活架构进阶:如何解决写后立即读场景问题?【转】

在《醍醐灌顶!异地多活架构设计看这篇就够了》一文中,基于容灾需要,讨论了数据写入的架构模型。数据读取方面,重点在于解决读取请求的负载分担、路由选择的问题,对于容灾架构的选择影响不大。不过,其中的“写后立即读”场景,是个一致性范畴的问题,即写入的数据和写入后…

JAVA之面向对象

1、设计对象并使用类和对象 类(设计图):是对象共同特征的描述; 对象:是真实存在的具体实例; 在java中,必须先设计类,才能获得对象。 如何得到类的对象:类名 对象名 = new 类名(); 如何使用对象: 访问属性:对象名.成员变量 访问行为:对象名.方法…

免费手动打Windows Server补丁

免费手动打Windows Server 2008 R2补丁https://catalog.update.microsoft.com/search.aspx?q=kb4474419然后到windows上双击运行即可本文来自博客园,作者:六月OvO,转载请注明原文链接:https://www.cnblogs.com/chenlifan/p/18664077

pwn1_sctf_2016 1

打开ida反汇编看一下,是c++,无所谓,复制问一下ai先让我们输入s的数据,读取长度限制在32字节。然后replace函数会将s里面的 I 替换成 you 。最后输出s。 分析一下,s距离ebp为0x3C(60字节),且我们最多只能输入32字节的,但经过replace函数,一个字节的‘I’会被替换成三个…