【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 数据库中创建一个名为 dbschema,在这个 schema 中创建一个 users 表,该表用于 JDBC 的快速入门。

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

利用 IDEA 创建一个新工程,Build system 选择 IntelliJ。在项目根目录下创建一个存放 jar 包的文件夹 lib。这里以 MySQL 数据库为例,将 MySQLjar 包放入 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)执行 DMLDDL 语句

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();
相关推荐
她又在丛中笑2 分钟前
Flink使用详解
java·spring boot·后端·flink
lsx2024064 分钟前
迭代器模式
开发语言
九圣残炎6 分钟前
【从零开始的LeetCode-算法】3239. 最少翻转次数使二进制矩阵回文 I
java·算法·leetcode
环境感知10 分钟前
基于MATLAB的激光雷达与相机联合标定原理及实现方法——以标定板为例
开发语言·人工智能·数码相机·算法·matlab
祭の29 分钟前
HttpServletResponse响应对象讲解(笔记)
java·前端·笔记
爪哇学长38 分钟前
JavaFX 与其他图形库的详细比较:现代架构与性能优势
java·架构·系统架构
黑不溜秋的1 小时前
C++ 并发专题 - 线程安全的单例模式
开发语言·c++
luckilyil1 小时前
EasyExcel在SpringBoot中的简单使用
java·spring boot·后端
祭の1 小时前
HttpServletRequest和⽤用户登录表单提交
java·服务器·前端
CodeCraft Studio1 小时前
【实用教程】如何利用 JxBrowser 在 Kotlin 中实现屏幕共享
android·开发语言·kotlin