使用 JDBC 实现 Java 数据库操作

news/2024/12/22 15:44:40 标签: java, 数据库, 开发语言

目录

一、JDBC 简介

二、JDBC 环境准备

1. 添加 JDBC 驱动

2. 创建数据库

三、JDBC 编程步骤

1. 加载数据库驱动

2. 获取数据库连接

3. 创建 Statement 对象并执行 SQL

4. 使用 PreparedStatement 防止 SQL 注入

5. 事务管理

6. 异常处理和关闭资源

四、完整示例


JDBC(Java Database Connectivity)是 Java 提供的数据库访问技术,它允许 Java 程序通过 SQL 语句与数据库进行交互。通过 JDBC,开发者能够实现常见的数据库操作,如增、删、改、查等。在这篇文章中,我们将深入探讨如何使用 JDBC 连接数据库,并执行各种常见的数据库操作。

一、JDBC 简介

JDBC 是 Java 语言提供的标准接口,允许开发者与各种关系型数据库系统(如 MySQL、Oracle、SQL Server 等)进行交互。JDBC 本质上是一组 Java API,它定义了如何执行 SQL 语句、更新数据、查询结果等操作。

在 JDBC 中,我们主要通过以下几个步骤进行数据库操作:

  1. 加载数据库驱动:通过 Class.forName() 或使用数据源自动加载数据库驱动。
  2. 建立连接:使用 DriverManager.getConnection() 获取数据库连接。
  3. 执行 SQL 语句:使用 Statement 或 PreparedStatement 执行 SQL 语句。
  4. 处理结果集:通过 ResultSet 处理查询结果。
  5. 关闭资源:关闭 ConnectionStatement 和 ResultSet 等资源。

二、JDBC 环境准备

1. 添加 JDBC 驱动

首先,确保在你的 Java 项目中添加了适合你所使用数据库的 JDBC 驱动。如果你使用的是 Maven 构建工具,可以在 pom.xml 文件中加入依赖:

对于 MySQL 数据库

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.26</version>
</dependency>

对于 Oracle 数据库,可能需要下载 .jar 文件并手动添加到项目的 lib 目录中。

2. 创建数据库

假设我们使用 MySQL 数据库,首先在数据库中创建一个简单的表 users,该表包含 idnameage 三个字段。你可以通过以下 SQL 语句创建数据库和表:

CREATE DATABASE testdb;

USE testdb;

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    age INT NOT NULL
);

INSERT INTO users (name, age) VALUES ('Alice', 30), ('Bob', 25), ('Charlie', 35);

三、JDBC 编程步骤

1. 加载数据库驱动

在 Java 中连接数据库时,首先需要加载数据库驱动。在 JDBC 中,我们可以通过 Class.forName() 方法加载驱动类。对于 MySQL 数据库,驱动类是 com.mysql.cj.jdbc.Driver

java">try {
    Class.forName("com.mysql.cj.jdbc.Driver");  // 加载 MySQL 驱动
    System.out.println("数据库驱动加载成功");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
    System.out.println("数据库驱动加载失败");
}

2. 获取数据库连接

连接数据库是通过 DriverManager.getConnection() 方法实现的。在获取连接时,我们需要提供数据库的 URL、用户名和密码。连接 URL 的格式通常如下:

jdbc:mysql://localhost:3306/testdb

代码示例:

java">String url = "jdbc:mysql://localhost:3306/testdb";
String user = "root";  // 数据库用户名
String password = "password";  // 数据库密码

Connection conn = null;
try {
    conn = DriverManager.getConnection(url, user, password);
    System.out.println("数据库连接成功");
} catch (SQLException e) {
    e.printStackTrace();
    System.out.println("数据库连接失败");
}

3. 创建 Statement 对象并执行 SQL

一旦获得数据库连接,就可以通过 Connection 对象创建 StatementPreparedStatement 来执行 SQL 语句。我们来看一个查询操作的例子,查询 users 表中的所有用户信息:

java">String query = "SELECT * FROM users";
Statement stmt = null;
ResultSet rs = null;

try {
    stmt = conn.createStatement();
    rs = stmt.executeQuery(query);

    while (rs.next()) {
        int id = rs.getInt("id");
        String name = rs.getString("name");
        int age = rs.getInt("age");
        System.out.println("ID: " + id + ", Name: " + name + ", Age: " + age);
    }
} catch (SQLException e) {
    e.printStackTrace();
} finally {
    // 关闭资源
    try {
        if (rs != null) rs.close();
        if (stmt != null) stmt.close();
        if (conn != null) conn.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

4. 使用 PreparedStatement 防止 SQL 注入

PreparedStatementStatement 的一种增强版,它可以提高执行效率并防止 SQL 注入。在执行带参数的 SQL 语句时,应该优先使用 PreparedStatement

例如,插入一个新用户的 SQL 语句:

java">String insertQuery = "INSERT INTO users (name, age) VALUES (?, ?)";
PreparedStatement pstmt = null;

try {
    pstmt = conn.prepareStatement(insertQuery);
    pstmt.setString(1, "David");  // 设置第一个参数为 "David"
    pstmt.setInt(2, 40);  // 设置第二个参数为 40

    int rowsAffected = pstmt.executeUpdate();
    System.out.println("插入成功,受影响的行数:" + rowsAffected);
} catch (SQLException e) {
    e.printStackTrace();
} finally {
    try {
        if (pstmt != null) pstmt.close();
        if (conn != null) conn.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

5. 事务管理

在 JDBC 中,可以使用事务来确保多个数据库操作的原子性。默认情况下,JDBC 使用自动提交模式,但你可以禁用自动提交来手动管理事务。以下是一个使用事务的示例:

java">try {
    conn.setAutoCommit(false);  // 禁用自动提交
    String updateQuery1 = "UPDATE users SET age = 26 WHERE name = 'Bob'";
    String updateQuery2 = "UPDATE users SET age = 36 WHERE name = 'Charlie'";

    stmt = conn.createStatement();
    stmt.executeUpdate(updateQuery1);
    stmt.executeUpdate(updateQuery2);

    conn.commit();  // 提交事务
    System.out.println("事务提交成功");
} catch (SQLException e) {
    try {
        if (conn != null) {
            conn.rollback();  // 回滚事务
            System.out.println("事务回滚");
        }
    } catch (SQLException ex) {
        ex.printStackTrace();
    }
    e.printStackTrace();
} finally {
    try {
        if (stmt != null) stmt.close();
        if (conn != null) conn.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

6. 异常处理和关闭资源

在 JDBC 编程中,异常处理非常重要,因为数据库操作可能会出现各种问题。我们可以使用 try-catch-finally 块来确保资源得到正确释放。所有的数据库连接、StatementResultSet 都应该在使用完毕后关闭。

四、完整示例

下面是一个完整的 JDBC 示例程序,包括连接数据库、查询、插入、更新、删除操作:

java">import java.sql.*;

public class JDBCExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/testdb";
        String user = "root";
        String password = "password";

        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {
            conn = DriverManager.getConnection(url, user, password);
            stmt = conn.createStatement();

            // 查询操作
            String query = "SELECT * FROM users";
            rs = stmt.executeQuery(query);
            while (rs.next()) {
                System.out.println("ID: " + rs.getInt("id") + ", Name: " + rs.getString("name") + ", Age: " + rs.getInt("age"));
            }

            // 插入操作
            String insertQuery = "INSERT INTO users (name, age) VALUES ('Eve', 28)";
            stmt.executeUpdate(insertQuery);

            // 更新操作
            String updateQuery = "UPDATE users SET age = 29 WHERE name = 'Eve'";
            stmt.executeUpdate(updateQuery);

            // 删除操作
            String deleteQuery = "DELETE FROM users WHERE name = 'Eve'";
            stmt.executeUpdate(deleteQuery);

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) rs.close();
                if (stmt != null) stmt.close();
                if (conn != null) conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}


http://www.niftyadmin.cn/n/5795492.html

相关文章

DB-GPT V0.6.3 版本更新:支持 SiliconCloud 模型、新增知识处理工作流等

DB-GPT V0.6.3版本现已上线&#xff0c;快速预览新特性: 新特性 1. 支持 SiliconCloud 模型&#xff0c;让用户体验多模型的管理能力 如何使用&#xff1a; 修改环境变量文件.env&#xff0c;配置SiliconCloud模型 # 使用 SiliconCloud 的代理模型 LLM_MODELsiliconflow_p…

15、基于SpringBoot的在线视频教育平台的设计与实现

随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于在线视频教育平台当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了在线视频教育平台&#xff0c;它彻底改变了过去传统…

【Mysql优化】SQL优化最佳实践分析与总结

文章目录 SQL优化最佳实践分析与总结1.2.1. 避免使用 SELECT \*1.2.2. 小表驱动大表1.2.3. 用连接查询代替子查询1.2.4. 提升 GROUP BY 的效率1.2.5. 批量操作1.2.6. 使用 LIMIT 优化查询 总结 SQL优化最佳实践分析与总结 SQL查询性能的优化是数据库设计与使用中的核心问题之一…

远程医疗:科技助力健康触手可及

随着信息技术与医疗领域的深度融合&#xff0c;远程医疗正逐步改变着人们获取医疗服务的方式。它跨越地理距离的障碍&#xff0c;将优质的医疗资源延伸到更广泛的区域。 对于患者来说&#xff0c;远程医疗极大地便利了就医过程。一些患有慢性疾病需要定期复诊的患者&#xff0c…

奇怪问题| Chrome 访问csdn 创作中心的时候报错: 服务超时,请稍后重试

Chrome 访问csdn 创作中心的时候报错&#xff1a; 服务超时,请稍后重试用无痕浏览器可以正常访问 关闭代理无效清缓存和Cookies无效。考虑无痕浏览器模式下插件不生效&#xff0c;尝试把chrome 插件也禁用&#xff0c;发现有效&#xff0c;是该扩展程序的缘故

Next.js v15- Metadata

概念 在 Web 开发中&#xff0c;Metadata提供有关网页的其他详细信息。元数据对访问页面的用户不可见。相反&#xff0c;它在幕后工作&#xff0c;嵌入到页面的 HTML 中&#xff0c;通常在<head>元素中。这些隐藏信息对于需要更好地了解您网页内容的搜索引擎和其他系统至…

我的2024年度总结

称着这个周末&#xff0c;写一篇2024年度总结&#xff0c;主要记录我过去一年的成长经历以及自己的一些收获。 过去一年的经历&#xff0c;可谓刻骨铭心&#xff0c;一个是24考研惨败&#xff0c;一个是毕设的准备&#xff0c;一个是省考的陪考&#xff0c;一个是找工作的焦虑…

C++_数据结构_详解二叉搜索树

✨✨ 欢迎大家来到小伞的大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 小伞的主页&#xff1a;xiaosan_blog 1.二叉树搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&a…