【Java SE】JDBC

JDBC(Java DataBase Connectivity)是一套用于在 Java 中操作关系型数据库的 API。它允许开发者使用统一的 Java 代码来访问不同的关系型数据库。

JDBC 的本质 :JDBC 是由官方(Sun 公司)定义的一套接口规范,各数据库厂商根据这套规范实现自己的数据库驱动程序(jar 包)。开发者通过 JDBC 编程,实际执行的操作是这些驱动程序中的实现。

JDBC 的优势 :1)统一接口:各数据库厂商遵循相同接口,Java 代码无需针对不同数据库进行修改;2)灵活性:可以轻松替换底层数据库,而访问数据库的 Java 代码几乎不变。

JDBC 快速入门

这里演示如何快速上手 JDBC 的使用。

(0)创建 MySQL 数据表

在 MySQL 数据库中创建一个名为 db 的 schema,在这个 schema 中创建一个 users 表,该表用于 JDBC 的快速入门。

(1)创建工程,导入驱动 jar 包

利用 IDEA 创建一个新工程,Build system 选择 IntelliJ。在项目根目录下创建一个存放 jar 包的文件夹 lib。这里以 MySQL 数据库为例,将 MySQL 的 jar 包放入 lib 中。接着,右键 jar 包选择 Add as Library...,使得当前工程能识别 jar 包。

(2)注册驱动

首先,在 src 下创建一个 JDBCDemo 类,用于实现 JDBC 的快速入门,在 main 函数中注册驱动:

java 复制代码
// 1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");

(3)获取连接

在获取数据库连接时,需要提供数据库名称、MySQL 用户名和密码:

java 复制代码
// 2. 获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db?useSSL=false";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);

(4)定义 SQL 语句

这里以查询 users 为例:

java 复制代码
// 3. 定义 sql
String sql = "SELECT * FROM users";

(5)获取执行 SQL 对象

使用 createStatement 获取 Statement 对象:

java 复制代码
// 4. 获取 Statement 对象
Statement stmt = conn.createStatement();

(6)执行 SQL 语句

使用 executeQuery 执行 SQL 语句,返回 ResultSet 结果集:

java 复制代码
// 5. 执行 SQL
ResultSet rs = stmt.executeQuery(sql);

(7)处理结果

遍历查询结果中的每一行,并读取相关字段:

java 复制代码
// 6. 处理结果
while (rs.next()) {
    int id = rs.getInt("id"); // 根据列名获取数据
    String name = rs.getString("name");
    String email = rs.getString("email");

    System.out.println("ID: " + id + ", Name: " + name + ", Email: " + email);
}

(8)释放资源

释放该过程中使用到的资源,注意关闭资源的顺序,先开启资源后关闭:

java 复制代码
// 7. 释放资源
rs.close();
stmt.close();
conn.close();

JDBC API 介绍

这部分主要是对 JDBC 相关的 API 进行说明。

DriverManager

驱动管理类(DriverManager)是一个工具类,其作用主要是:

(1)注册驱动

在 Class.forName("com.mysql.jdbc.Driver");加载 Driver 类时,该类静态代码块中使用下面的代码自动进行了驱动的注册,可以通过 Ctrl + 鼠标点击 Driver 进入代码中查看:

java 复制代码
DriverManager.registerDriver(new Driver());

另外,在 mysql 5 之后的驱动 jar 中,可以省略 Class.forName("com.mysql.jdbc.Driver");这行代码。

(2)获取数据库连接

使用 getConnection 方法获取连接对象,其需要提供三个参数,分别是:连接路径(url)、数据库用户名(user)和数据库密码(password)。需要注意的是:

  • url 参数的语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2,示例:jdbc:mysql://127.0.0.1:3306/db。

  • 如果连接的是本机 MySQL 服务器,并且 MySQL 服务默认端口是3306,则 url 可以简写为:jdbc:mysql://数据库名称?参数键值对。

  • 可配置 useSSL=false 参数,禁用安全连接方式,解决警告提示。

Connection

数据库连接对象(Connection)是一个与特定数据库的连接(会话)的接口,用于执行 SQL 语句并在连接的上下文中返结果,其主要作用是:

(1)获取执行 SQL 的对象

这一部分涉及到三个方法:

  • 普通执行 SQL 对象:Statement createStatement()

  • 预编译 SQL 的执行 SQL 对象:防止 SQL 注入:PreparedStatement prepareStatement(sql)

  • 执行存储过程的对象:CallableStatement prepareCall(sql)

(2)管理事务

Connection 接口中定义了与 MySQL 3个事务对应的方法:

  • 开启事务:setAutoCommit(boolean autoCommit)

true 为自动提交事务;false为手动提交事务,即为开启事务。

  • 提交事务:commit()

  • 回滚事务:rollback()

java 复制代码
// 定义 sql
String sql1 = "UPDATE users set name = 'a' where id = 1";
String sql2 = "UPDATE users set name = 'b' where id = 2";

// 获取 Statement 对象
Statement stmt = conn.createStatement();
try {
    // 开启事务,确保两条sql语句执行一致
    conn.setAutoCommit(false);
    int count1 = stmt.executeUpdate(sql1); // 受影响行数
    System.out.println(count1);
    int count2 = stmt.executeUpdate(sql2); // 受影响行数
    System.out.println(count2);

    // 提交事务
    conn.commit();
} catch (Exception e) {
    // 回滚事务
    conn.rollback();
    throw new RuntimeException(e);
}

Statement

Statement 对象用于执行 SQL 语句,这个对象提供了不同的方法来执行不同的 SQL 语句。

(1)int executeUpdate(sql)执行 DML、DDL 语句

DDL 语句是对表和库的增删改操作,DML 语句是对数据的增删改操作,这个方法的返回值:

  • DML 语句影响的行数;

  • DDL 语句执行后,执行成功也可能返回 0。

java 复制代码
// DML
String sql = "UPDATE users set name = 'a' where id = 1";
Statement stmt = conn.createStatement();
int count = stmt.executeUpdate(sql);
System.out.println(count);
java 复制代码
// DDL
String sql = "CREATE database db1";
Statement stmt = conn.createStatement();
int count = stmt.executeUpdate(sql);
System.out.println(count);

(2)ResultSet excuteQuery(sql)执行 DQL 语句

DQL 语句是对数据的查询操作,这个方法的返回值是 ResultSet 结果集对象。

java 复制代码
// DDL
String sql = "SELECT * FROM users";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
    int id = rs.getInt("id"); // 根据列名获取数据
    String name = rs.getString("name");
    String email = rs.getString("email");
}
rs.close();
相关推荐
旺仔Sec15 分钟前
2026年江西省职业院校技能大赛(中职组)应用软件系统开发赛项竞赛样题
java·应用软件系统开发
qq_25183645741 分钟前
理发管理系统 —— 会员模块
开发语言·前端·python·flask
Dovis(誓平步青云)44 分钟前
几个方案来回选不定?做一个随时切换的候选推荐页
android·java·服务器·开发语言·javascript·数据库·智能化
郝学胜-神的一滴1 小时前
AI 编程智能体 03:拆解当下主流智能体能力
开发语言·c++·人工智能·python·程序人生·游戏
一条破秋裤1 小时前
Linux 线程同步:读写锁
java·linux·jvm
言乐61 小时前
Python文字审核模型
开发语言·windows·python·django·pygame
蜗牛互联网1 小时前
从Barclays扩大Claude部署看受监管软件工程的责任重分配
java·大数据·人工智能·后端·软件工程
天远API1 小时前
零信任架构实战:基于天远股权穿透构建自动化供应链授信穿透网关
java·人工智能·架构·自动化
最强小杰1 小时前
claude-opus-5.5 API 接入教程:anthropic-version 头、tools 定义、流式事件格式三个常见问题全部梳理,收藏备用
java·服务器·网络·ai
Cc.Y1 小时前
Java零基础入门:方法(函数)深度掌握
java·开发语言