当前位置: 首页 > news >正文

Java学习教程,从入门到精通,JDBC插入记录语法及案例(104)

JDBC插入记录语法及案例

一、JDBC插入记录语法

在JDBC中,插入记录主要通过执行SQL的INSERT语句来实现。其基本语法如下:

INSERT INTO 表名 (1,2, ..., 列n) VALUES (1,2, ..., 值n);
  • 表名:需要插入记录的表的名称。
  • 列1, 列2, …, 列n:指定要插入数据的列名。如果插入的数据包含表中所有列的值,并且顺序与表中列的顺序一致,那么列名可以省略。
  • 值1, 值2, …, 值n:对应于各列要插入的具体值。数据类型需要与列的数据类型相匹配。

二、案例代码

以下是一个使用JDBC插入记录的Java案例代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class JdbcInsertExample {public static void main(String[] args) {// 数据库连接信息String url = "jdbc:mysql://localhost:3306/testdb";  // 数据库URL,testdb为数据库名String username = "root";  // 数据库用户名String password = "123456";  // 数据库密码// 要插入的数据String name = "张三";int age = 25;String email = "zhangsan@example.com";// SQL插入语句String sql = "INSERT INTO users (name, age, email) VALUES (?, ?, ?)";// 加载数据库驱动try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();System.out.println("数据库驱动加载失败!");return;}// 建立数据库连接try (Connection conn = DriverManager.getConnection(url, username, password);// 使用PreparedStatement来执行SQL语句,提高安全性和效率PreparedStatement pstmt = conn.prepareStatement(sql)) {// 设置SQL语句中的参数pstmt.setString(1, name);pstmt.setInt(2, age);pstmt.setString(3, email);// 执行插入操作int affectedRows = pstmt.executeUpdate();if (affectedRows > 0) {System.out.println("记录插入成功!");} else {System.out.println("记录插入失败!");}} catch (SQLException e) {e.printStackTrace();System.out.println("数据库操作异常!");}}
}

代码说明:

  1. 导入相关包:导入了java.sql包下的ConnectionDriverManagerPreparedStatementSQLException等类,这些是JDBC编程中常用的类。
  2. 数据库连接信息:定义了数据库的URL、用户名和密码,用于建立数据库连接。
  3. 要插入的数据:定义了要插入的用户信息,包括姓名、年龄和邮箱。
  4. SQL插入语句:定义了插入记录的SQL语句,使用了占位符?来代替具体的值,这是为了使用PreparedStatement来设置参数,提高安全性和效率。
  5. 加载数据库驱动:通过Class.forName方法加载MySQL的JDBC驱动,如果驱动加载失败会捕获异常并输出错误信息。
  6. 建立数据库连接:使用DriverManager.getConnection方法建立数据库连接,并通过try-with-resources语句来自动关闭连接和PreparedStatement,避免资源泄露。
  7. 设置SQL语句中的参数:通过PreparedStatementsetXxx方法(如setStringsetInt等)来设置SQL语句中的参数,将具体的值赋给占位符。
  8. 执行插入操作:调用PreparedStatementexecuteUpdate方法来执行插入操作,该方法返回一个整数,表示受影响的行数。如果受影响的行数大于0,说明记录插入成功,否则插入失败,并输出相应的提示信息。
  9. 异常处理:捕获SQLException异常,如果数据库操作过程中出现异常,会输出异常信息和错误提示。

通过以上代码,你可以实现将一条记录插入到数据库的users表中。在实际使用中,需要根据具体的数据库环境和表结构进行相应的调整。

当然可以。以下是一些具体的不同场景下的JDBC插入记录案例。

案例一:插入单条记录到学生表

假设有一个学生表students,表结构如下:

字段名数据类型
idint
namevarchar
gendervarchar
scoreint

SQL表创建语句

CREATE TABLE students (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50),gender VARCHAR(10),score INT
);

Java代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class InsertStudent {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/testdb";String username = "root";String password = "123456";String sql = "INSERT INTO students (name, gender, score) VALUES (?, ?, ?)";try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();System.out.println("数据库驱动加载失败!");return;}try (Connection conn = DriverManager.getConnection(url, username, password);PreparedStatement pstmt = conn.prepareStatement(sql)) {pstmt.setString(1, "李四");pstmt.setString(2, "男");pstmt.setInt(3, 85);int affectedRows = pstmt.executeUpdate();if (affectedRows > 0) {System.out.println("学生记录插入成功!");} else {System.out.println("学生记录插入失败!");}} catch (SQLException e) {e.printStackTrace();System.out.println("数据库操作异常!");}}
}

案例二:批量插入多条记录到商品表

假设有一个商品表products,表结构如下:

字段名数据类型
idint
namevarchar
pricedouble
stockint

SQL表创建语句

CREATE TABLE products (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100),price DOUBLE,stock INT
);

Java代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class BatchInsertProducts {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/testdb";String username = "root";String password = "123456";String sql = "INSERT INTO products (name, price, stock) VALUES (?, ?, ?)";try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();System.out.println("数据库驱动加载失败!");return;}try (Connection conn = DriverManager.getConnection(url, username, password);PreparedStatement pstmt = conn.prepareStatement(sql)) {// 批量添加数据pstmt.setString(1, "苹果");pstmt.setDouble(2, 5.5);pstmt.setInt(3, 100);pstmt.addBatch();pstmt.setString(1, "香蕉");pstmt.setDouble(2, 3.0);pstmt.setInt(3, 150);pstmt.addBatch();pstmt.setString(1, "橙子");pstmt.setDouble(2, 4.0);pstmt.setInt(3, 80);pstmt.addBatch();// 执行批量插入int[] affectedRows = pstmt.executeBatch();if (affectedRows.length > 0) {System.out.println("商品记录批量插入成功,共插入" + affectedRows.length + "条记录!");} else {System.out.println("商品记录批量插入失败!");}} catch (SQLException e) {e.printStackTrace();System.out.println("数据库操作异常!");}}
}

案例三:插入记录并获取自增主键

假设有一个订单表orders,表结构如下:

字段名数据类型
idint
user_idint
amountdouble
statusvarchar

SQL表创建语句

CREATE TABLE orders (id INT PRIMARY KEY AUTO_INCREMENT,user_id INT,amount DOUBLE,status VARCHAR(20)
);

Java代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class InsertOrderAndGetId {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/testdb";String username = "root";String password = "123456";String sql = "INSERT INTO orders (user_id, amount, status) VALUES (?, ?, ?)";try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();System.out.println("数据库驱动加载失败!");return;}try (Connection conn = DriverManager.getConnection(url, username, password);PreparedStatement pstmt = conn.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS)) {pstmt.setInt(1, 1);pstmt.setDouble(2, 200.0);pstmt.setString(3, "待支付");int affectedRows = pstmt.executeUpdate();if (affectedRows > 0) {try (ResultSet rs = pstmt.getGeneratedKeys()) {if (rs.next()) {int orderId = rs.getInt(1);System.out.println("订单记录插入成功,生成的订单ID为:" + orderId);}}} else {System.out.println("订单记录插入失败!");}} catch (SQLException e) {e.printStackTrace();System.out.println("数据库操作异常!");}}
}

代码说明:

  • 获取自增主键:在prepareStatement方法中传入PreparedStatement.RETURN_GENERATED_KEYS参数,表示在执行插入操作后返回生成的主键。
  • 获取生成的主键:通过getGeneratedKeys方法获取一个ResultSet,从中可以获取生成的主键值。
    以上三个案例分别展示了插入单条记录、批量插入记录以及插入记录并获取自增主键的常见场景,你可以根据实际需求进行参考和修改。

相关文章:

Java学习教程,从入门到精通,JDBC插入记录语法及案例(104)

JDBC插入记录语法及案例 一、JDBC插入记录语法 在JDBC中,插入记录主要通过执行SQL的INSERT语句来实现。其基本语法如下: INSERT INTO 表名 (列1, 列2, ..., 列n) VALUES (值1, 值2, ..., 值n);表名:需要插入记录的表的名称。列1, 列2, …,…...

Linux文件基本操作

Linux 的设计哲学 在 Linux 中,一切皆文件! 什么是文件? 文件是具有永久存储性,按特定字节顺序组成的命名数据集 文件可分为:文本文件,二进制文件 文本文件:每个文件存放一个 ASCII 码 存储…...

React 路由导航与传参详解

随着单页面应用(SPA)已经成为主流。React 作为最流行的前端框架之一,提供了强大的路由管理工具 react-router-dom,帮助开发者轻松实现页面导航和传参。本文将详细介绍如何使用 react-router-dom 构建路由导航、传参以及嵌套路由的…...

C#面试常考随笔6:ArrayList和 List的主要区别?

在 C# 中&#xff0c;ArrayList和List<T>&#xff08;泛型列表&#xff09;都可用于存储一组对象。推荐优先使用List<T>&#xff0c;因为它具有更好的类型安全性、性能和语法简洁性&#xff0c;并且提供了更丰富的功能。只有在需要与旧代码兼容或存储不同类型对象的…...

C#分页思路:双列表数据组合返回设计思路

一、应用场景 需要分页查询&#xff08;并非全表查载入物理内存再筛选&#xff09;&#xff0c;返回列表1和列表2叠加的数据时 二、实现方式 列表1必查&#xff0c;列表2根据列表1的查询结果决定列表2的分页查询参数 三、示意图及其实现代码 1.示意图 黄色代表list1的数据&a…...

中科大:LLM检索偏好优化应对RAG知识冲突

&#x1f4d6;标题&#xff1a;RPO: Retrieval Preference Optimization for Robust Retrieval-Augmented Generation &#x1f310;来源&#xff1a;arXiv, 2501.13726 &#x1f31f;摘要 &#x1f538;虽然检索增强生成&#xff08;RAG&#xff09;在利用外部知识方面表现出…...

知识库管理系统提升企业知识价值与工作效率的实践路径分析

内容概要 知识库管理系统在企业发展中的重要性日益凸显&#xff0c;尤其是在信息爆炸的时代。现代企业需要有效地管理和利用自身知识资产&#xff0c;以提升整体效率和竞争力。本文旨在探讨知识库管理系统的应用实践&#xff0c;围绕其在信息整理、知识共享及决策支持等方面的…...

中文输入法方案

使用了三年的自然码双拼&#xff0c;毫无疑问是推荐使用双拼输入法。 三年积累下来的习惯是&#xff1a; 1 自然码方案 2 空格出字 字母选字 直到如今&#xff0c;想要做出改变&#xff0c;是因为这样的方案带来的痛点&#xff1a; 1 使用空格出字就无法使用辅助码&#…...

《AI芯片:如何让硬件与AI计算需求完美契合》

在人工智能飞速发展的今天&#xff0c;AI芯片已成为推动这一领域前行的关键力量。从智能语音助手到自动驾驶汽车&#xff0c;从图像识别技术到复杂的自然语言处理&#xff0c;AI芯片的身影无处不在。它就像是人工智能的“超级大脑”&#xff0c;以强大的计算能力支撑着各种复杂…...

AlertDialog组件的功能与用法

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了Dismissible Widget相关的内容,本章回中将介绍AlertDialog Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们介绍的AlertDialog是指程序中弹出的确认窗口&#xff0c;其实我们在上一章回中删除…...

【Python百日进阶-Web开发-FastAPI】Day813 - FastAPI 响应模型

文章目录 一、返回与输入相同的数据二、添加输出模型三、在文档中查看四、响应模型编码参数4.1 使用 response_model_exclude_unset 参数4.1.1 默认值字段有实际值的数据4.1.2 具有与默认值相同值的数据4.2 response_model_include 和 response_model_exclude4.2.1 使用 list 而…...

洛谷U525376 信号干扰 (判断多个区间是否有重叠)

U525376信号干扰 题目描述 有 n n n 座信号塔&#xff0c;第 i i i 座信号塔的信号将覆盖区间 [ l i , r i ] [l_i,r_i] [li​,ri​]。 若某个点被超过一座信号塔的信号覆盖&#xff0c;则在该点会产生信号干扰。 对于信号塔区间 [ a , b ] [a,b] [a,b]&#xff0c;若建…...

ESP32-S3模组上跑通esp32-camera(35)

接前一篇文章:ESP32-S3模组上跑通esp32-camera(34) 一、OV5640初始化 2. 相机初始化及图像传感器配置 上一回继续对reset函数的后一段代码进行解析。为了便于理解和回顾,再次贴出reset函数源码,在components\esp32-camera\sensors\ov5640.c中,如下: static int reset…...

Java进阶(二):Java设计模式

目录 设计模式 一.建模语言 二.类之间的关系 1.依赖关系 2.关联关系 3.聚合关系 4.组合关系 5.继承关系 6.实现关系 三.面向对象设计原则 单一职责原则 开闭原则 里氏替换原则 依赖倒置 接口隔离原则 迪米特原则 组合/聚合(关联关系)复用原则 四.23种设计模式…...

DeepSeek R1:中国AI黑马的崛起与挑战

文章目录 技术突破&#xff1a;从零开始的推理能力进化DeepSeek R1-Zero&#xff1a;纯RL训练的“自我觉醒”DeepSeek R1&#xff1a;冷启动与多阶段训练的平衡之道 实验验证&#xff1a;推理能力的全方位跃升基准测试&#xff1a;超越顶尖闭源模型蒸馏技术&#xff1a;小模型的…...

抗体人源化服务如何优化药物的分子结构【卡梅德生物】

抗体药物作为一种重要的生物制药产品&#xff0c;已在癌症、免疫疾病、传染病等领域展现出巨大的治疗潜力。然而&#xff0c;传统的抗体药物常常面临免疫原性高、稳定性差以及治疗靶向性不足等问题&#xff0c;这限制了其在临床应用中的效果和广泛性。为了克服这些问题&#xf…...

AndroidCompose Navigation导航精通2-过渡动画与路由切换

目录 前言路由切换NavControllerBackStackEntry过渡动画过渡原理缩放动画渐隐动画滑动动画动画过渡实战前言 在当今的移动应用开发中,导航是用户与应用交互的核心环节。随着 Android Compose 的兴起,它为开发者提供了一种全新的、声明式的方式来构建用户界面,同时也带来了更…...

基于微信小程序的社团活动助手php+论文源码调试讲解

4 系统设计 微信小程序社团微信小程序的设计方案比如功能框架的设计&#xff0c;比如数据库的设计的好坏也就决定了该系统在开发层面是否高效&#xff0c;以及在系统维护层面是否容易维护和升级&#xff0c;因为在系统实现阶段是需要考虑用户的所有需求&#xff0c;要是在设计…...

WebSocket 详解:全双工通信的实现与应用

目录 一、什么是 WebSocket&#xff1f;&#xff08;简介&#xff09; 二、为什么需要 WebSocket&#xff1f; 三、HTTP 与 WebSocket 的区别 WebSocket 的劣势 WebSocket 的常见应用场景 WebSocket 握手过程 WebSocket 事件处理和生命周期 一、什么是 WebSocket&#xf…...

漏洞修复:Apache Tomcat 安全漏洞(CVE-2024-50379) | Apache Tomcat 安全漏洞(CVE-2024-52318)

文章目录 引言I Apache Tomcat 安全漏洞(CVE-2024-50379)漏洞描述修复建议升级Tomcat教程II Apache Tomcat 安全漏洞(CVE-2024-52318)漏洞描述修复建议III 安全警告引言 解决方案:升级到最新版Tomcat https://blog.csdn.net/z929118967/article/details/142934649 service in…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...