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

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

http://www.kler.cn/a/523792.html

相关文章:

  • 中间件安全
  • 多协议网关BL110钡铼6路RS485转MQTT协议云网关
  • Baklib揭示内容中台与人工智能技术的创新协同效应
  • 关联传播和 Python 和 Scikit-learn 实现
  • 计算机网络之计算机网络主要性能
  • 【Elasticsearch 】悬挂索引(Dangling Indices)
  • LeetCode - #195 Swift 实现打印文件中的第十行
  • 【Pandas】pandas Series cov
  • 使用 Docker + Nginx + Certbot 实现自动化管理 SSL 证书
  • 【VUE】Vue2中Vue.extend方法
  • Ikigai是什么
  • MaskGAE论文阅读
  • 基于 RAG 的聊天机器人的追踪、日志和指标:结合 Elastic 的 OpenTelemetry 分发
  • 人物传记之新月篇
  • 一文讲解Java中Object类常用的方法
  • 开源 CSS 框架 Tailwind CSS v4.0
  • LeetCode 0040.组合总和 II:回溯 + 剪枝
  • 正反转电路梯形图
  • ESP32-S3模组上跑通esp32-camera(35)
  • 【Elasticsearch】Elasticsearch的查询
  • Linux内核链表学习录
  • 模板生成引擎技术介绍
  • 第P7周-Pytorch实现马铃薯病害识别(VGG16复现)
  • 深度研究新范式:通过Ollama和DeepSeek R1实现自动化研究
  • JS宏进阶:闭包与代理
  • 【人工智能】基于Python的机器翻译系统,从RNN到Transformer的演进与实现