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,从中可以获取生成的主键值。
    以上三个案例分别展示了插入单条记录、批量插入记录以及插入记录并获取自增主键的常见场景,你可以根据实际需求进行参考和修改。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据学习之Kafka消息队列、Spark分布式计算框架一

Kafka消息队列 章节一.kafka入门 4.kafka入门_消息队列两种模式 5.kafka入门_架构相关名词 Kafka 入门 _ 架构相关名词 事件 记录了世界或您的业务中 “ 发生了某事 ” 的事实。在文档中 也称为记录或消息。当您向 Kafka 读取或写入数据时,您以事件的 形式执行…

爱书爱考平台说明

最近我开发了一个综合性的考试平台,内容包括但不限于职业资格证考试、成人教育、国家公务员考试等内容。目前1.0版本已经开发完成,其他的功能陆续完善中。 微信小程序搜索"爱书爱考" 微信小程序图标如下图: 目前维护了java相关的面试题的考题…

Docker/K8S

文章目录 项目地址一、Docker1.1 创建一个Node服务image1.2 volume1.3 网络1.4 docker compose 二、K8S2.1 集群组成2.2 Pod1. 如何使用Pod(1) 运行一个pod(2) 运行多个pod 2.3 pod的生命周期2.4 pod中的容器1. 容器的生命周期2. 生命周期的回调3. 容器重启策略4. 自定义容器启…

2023年吉林省职业院校技能大赛网络系统管理样题-网络配置(华三代码)

目录 附录1:拓扑图 附录2:地址规划表 1.S1 2.S3 3.S4 4.S5 5.S7 6.S8 7.S9 8.R1 9.R2 10.R3 11.EG1 12.EG2 13.AC1 14.AC2 附录1:拓扑图 编号 型号

HTML-新浪新闻-实现标题-排版

标题排版 图片标签&#xff1a;<img> src&#xff1a;指定图片的url&#xff08;绝对路径/相对路径&#xff09; width&#xff1a;图片的宽度&#xff08;像素/相对于父元素的百分比&#xff09; heigth&#xff1a;图片的高度&#xff08;像素/相对于父元素的百分比&a…

基于物联网的智能环境监测系统(论文+源码)

1系统的功能及方案设计 本课题为基于物联网的智能环境监测系统的设计与实现&#xff0c;整个系统采用stm32f103单片机作为主控制器&#xff0c;通过DHT11传感器实现智能环境监测系统温度和湿度的检测&#xff0c;通过MQ传感器实现CO2浓度检测&#xff0c;通过光照传感器实现光照…

全面解析文件上传下载删除漏洞:风险与应对

在数字化转型的时代&#xff0c;文件上传、下载与删除功能已经成为各类应用程序的标准配置&#xff0c;从日常办公使用的协同平台&#xff0c;到云端存储服务&#xff0c;再到社交网络应用&#xff0c;这些功能在给用户带来便捷体验、显著提升工作效率的同时&#xff0c;也隐藏…

1.2第1章DC/DC变换器的动态建模-1.2Buck-Boost 变换器的交流模型--电力电子系统建模及控制 (徐德鸿)--读书笔记

1.2 Buck-Boost 变换器的交流模型 Buck- Boost变换器是一种典型的DC/DC变换器&#xff0c;具有升压和降压功能其输出电压的极性与输入电压相反&#xff0c;见图1-4a。当电感L的电流i(t)连续时一个开关周期可以分为两个阶段。在阶段1&#xff0c;开关在位置1时&#xff0c;即&am…

06-AD向导自动创建P封装(以STM32-LQFP48格式为例)

自动向导创建封装 自动向导创建封装STM32-LQFP48Pin封装1.选则4排-LCC或者QUAD格式2.计算焊盘相定位长度3.设置默认引脚位置(芯片逆时针)4.特殊情况下:加额外的标记 其他问题测量距离:Ctrl M测量 && Ctrl C清除如何区分一脚和其他脚?芯片引脚是逆时针看的? 自动向导…

若依基本使用及改造记录

若依框架想必大家都了解得不少&#xff0c;不可否认这是一款及其简便易用的框架。 在某种情况下&#xff08;比如私活&#xff09;使用起来可谓是快得一匹。 在这里小兵结合自身实际使用情况&#xff0c;记录一下我对若依框架的使用和改造情况。 一、源码下载 前往码云进行…

面试经典150题——图

文章目录 1、岛屿数量1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、被围绕的区域2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、克隆图3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 4、除法求值4.1 题目链接4.2 题目描述4.3 解题代码4.4 解题思路 5、课…

基于SpringBoot电脑组装系统平台系统功能实现六

一、前言介绍&#xff1a; 1.1 项目摘要 随着科技的进步&#xff0c;计算机硬件技术日新月异&#xff0c;包括处理器&#xff08;CPU&#xff09;、主板、内存、显卡等关键部件的性能不断提升&#xff0c;为电脑组装提供了更多的选择和可能性。不同的硬件组合可以构建出不同类…

万字长文总结前端开发知识---JavaScriptVue3Axios

JavaScript学习目录 一、JavaScript1. 引入方式1.1 内部脚本 (Inline Script)1.2 外部脚本 (External Script) 2. 基础语法2.1 声明变量2.2 声明常量2.3 输出信息 3. 数据类型3.1 基本数据类型3.2 模板字符串 4. 函数4.1 具名函数 (Named Function)4.2 匿名函数 (Anonymous Fun…

MySQL(单表访问)

今天是新年&#xff0c;祝大家新年快乐&#xff0c;但是生活还是得继续。 后面也会持续更新&#xff0c;学到新东西会在其中补充。 建议按顺序食用&#xff0c;欢迎批评或者交流&#xff01; 缺什么东西欢迎评论&#xff01;我都会及时修改的&#xff01; 大部分截图和文章采…

HarmonyOS简介:应用开发的机遇、挑战和趋势

问题 更多的智能设备并没有带来更好的全场景体验 连接步骤复杂数据难以互通生态无法共享能力难以协同 主要挑战 针对不同设备上的不同操作系统&#xff0c;重复开发&#xff0c;维护多套版本 多种语言栈&#xff0c;对人员技能要求高 多种开发框架&#xff0c;不同的编程…

【Elasticsearch】Elasticsearch的查询

Elasticsearch的查询 DSL查询基础语句叶子查询全文检索查询matchmulti_match 精确查询termrange 复合查询算分函数查询bool查询 排序分页基础分页深度分页 高亮高亮原理实现高亮 RestClient查询基础查询叶子查询复合查询排序和分页高亮 数据聚合DSL实现聚合Bucket聚合带条件聚合…

使用 KNN 搜索和 CLIP 嵌入构建多模态图像检索系统

作者&#xff1a;来自 Elastic James Gallagher 了解如何使用 Roboflow Inference 和 Elasticsearch 构建强大的语义图像搜索引擎。 在本指南中&#xff0c;我们将介绍如何使用 Elasticsearch 中的 KNN 聚类和使用计算机视觉推理服务器 Roboflow Inference 计算的 CLIP 嵌入构建…

LogicFlow 一款流程图编辑框架

LogicFlow是什么 LogicFlow是一款流程图编辑框架&#xff0c;提供了一系列流程图交互、编辑所必需的功能和灵活的节点自定义、插件等拓展机制。LogicFlow支持前端自定义开发各种逻辑编排场景&#xff0c;如流程图、ER图、BPMN流程等。在工作审批流配置、机器人逻辑编排、无代码…

几种K8s运维管理平台对比说明

目录 深入体验**结论**对比分析表格**1. 功能对比****2. 用户界面****3. 多租户支持****4. DevOps支持** 细对比分析1. **Kuboard**2. **xkube**3. **KubeSphere**4. **Dashboard****对比总结** 深入体验 KuboardxkubeKubeSphereDashboard 结论 如果您需要一个功能全面且适合…

《HelloGitHub》第 106 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…