【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();
相关推荐
小周不摆烂43 分钟前
Java Web从入门到精通:全面探索与实战(一)
java
cherryc_44 分钟前
JavaSE基础——第六章 类与对象(二)
java·开发语言
快来卷java1 小时前
JVM虚拟机篇(三):JVM运行时数据区与方法区详解
java·jvm·mysql
whltaoin2 小时前
Java实现N皇后问题的双路径探索:递归回溯与迭代回溯算法详解
java·算法
nlog3n4 小时前
Java策略模式详解
java·bash·策略模式
Qlittleboy5 小时前
windows如何安装wkhtmltoimage 给PHP使用根据HTML生成图片
开发语言·windows·php
水w6 小时前
【Android Studio】解决报错问题Algorithm HmacPBESHA256 not available
android·开发语言·android studio
冷琅辞6 小时前
Elixir语言的云计算
开发语言·后端·golang
Mryan20057 小时前
解决GraalVM Native Maven Plugin错误:JAVA_HOME未指向GraalVM Distribution
java·开发语言·spring boot·maven
Naomi5217 小时前
自定义汇编语言(Custom Assembly Language) 和 Unix & Git
服务器·开发语言·git·unix