【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();
相关推荐
Code_流苏几秒前
VSCode搭建Java开发环境 2024保姆级安装教程(Java环境搭建+VSCode安装+运行测试+背景图设置)
java·ide·vscode·搭建·java开发环境
数据小爬虫@18 分钟前
如何高效利用Python爬虫按关键字搜索苏宁商品
开发语言·爬虫·python
ZJ_.20 分钟前
WPSJS:让 WPS 办公与 JavaScript 完美联动
开发语言·前端·javascript·vscode·ecmascript·wps
Narutolxy25 分钟前
深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道20241223
开发语言·golang·gin
Hello.Reader33 分钟前
全面解析 Golang Gin 框架
开发语言·golang·gin
禁默43 分钟前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程
Cachel wood1 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Code哈哈笑1 小时前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
gb42152871 小时前
springboot中Jackson库和jsonpath库的区别和联系。
java·spring boot·后端
程序猿进阶1 小时前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot