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

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

时间:2025-01-10 17:11:59浏览次数:1  
标签:ps 教程 JDBC setObject Spring try 插入 主键

插入

更改成相应的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); // grade
        ps.setObject(3, "Bob"); // name
        ps.setObject(4, "M"); // gender
        int 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); // grade
        ps.setObject(2, "Bob"); // name
        ps.setObject(3, "M"); // gender
        int n = ps.executeUpdate(); // 1
        try (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教程

标签:ps,教程,JDBC,setObject,Spring,try,插入,主键
From: https://www.cnblogs.com/ENchantedN/p/18664302

相关文章

  • springboot毕设 婚纱影楼管理系统 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着婚纱摄影行业的蓬勃发展,婚纱影楼作为记录人生重要时刻的场所,其管理效率和服务质量直接影响到客户的满意度与忠诚度。传统的人工管理模式已难以满......
  • springboot毕设 基建项目管理系统 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着国家基础设施建设的快速发展,基建项目数量与规模日益扩大,项目管理的复杂性和重要性也随之提升。传统的项目管理方式往往依赖于纸质文档和人工协调,......
  • nifi数据采集使用教程
    1.启动NIFINIFI启动比较慢我们要耐心等待[root@masterbin]#/usr/local/soft/nifi-1.13.2/bin/nifi.shstartJavahome:/usr/local/soft/jdk1.8.0_171NiFihome:/usr/local/soft/nifi-1.13.2BootstrapConfigFile:/usr/local/soft/nifi-1.13.2/conf/bootstrap.c......
  • springboot软件工程课程辅助学习网站源码毕设+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和互联网的广泛普及,教育领域正经历着深刻的变革。软件工程作为计算机科学与技术的重要分支,其课程内容复杂且实践性强,对学生的......
  • SpringBoot少数民族饰品销售系统nu08t(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,饰品信息,饰品入库,饰品订单,饰品退货开题报告内容一、项目背景与意义在全球化和文化多样性日益受到重视的背景下,少数民族文化作为中华文化宝库中的重要组......
  • SpringBoot少儿编程管理系统m9593(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表家长,学生,课程分类,课程信息,课程购买开题报告内容一、研究背景随着社会经济的发展和人们对教育培训需求的增加,少儿编程教育逐渐成为了家长和学生选择的重要教......
  • 基于SpringBoot+Vue+uniapp的民宿在线预定平台毕业设计的详细设计和实现(源码+lw+部署
    前言......
  • SpringBoot外置Servlet容器
    文章目录1.使用外置的Servlet容器2.先创建出SpringBoot项目2.1创建一个普通的mavenjava项目2.2在pom.xml中,设置打包方式为war包,引入父工程模板,左侧设置三级包结构2.3引入springboot的stater、web的starter、thymeleaf的模板引擎2.4创建启动类`SpringBootTomcatApplicatio......
  • Python LangChain入门教程 1-使用LangChain和AI对话
    LangChain 是一个用于开发由大型语言模型(LLMs)驱动的应用程序的框架。在使用LangChain框架前,先导入LangChain#这里根据你使用的AI进行引入,我使用的是智谱清言的AIfromlangchain_community.chat_modelsimportChatZhipuAI#这里导入的是消息类型fromlangchain_co......
  • 【c# Unity-Shader版本贪吃蛇教程】一张Plane渲染的Shader贪吃蛇
    前言    开局一张plane,其余靠shader编。本游戏为shader绘制贪吃蛇,没有3D模型,想了解3D版本的开发,可以跳转到【c#Unity贪吃蛇教程】    已经是第五期C#不同平台制作贪吃蛇了,前三期分别是【c#控制台贪吃蛇教程】、【c#winform贪吃蛇教程】、【c#WPF贪吃蛇教......