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
函数中注册驱动:
// 1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
(3)获取连接
在获取数据库连接时,需要提供数据库名称、MySQL
用户名和密码:
// 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
为例:
// 3. 定义 sql
String sql = "SELECT * FROM users";
(5)获取执行 SQL
对象
使用 createStatement
获取 Statement
对象:
// 4. 获取 Statement 对象
Statement stmt = conn.createStatement();
(6)执行 SQL
语句
使用 executeQuery
执行 SQL
语句,返回 ResultSet
结果集:
// 5. 执行 SQL
ResultSet rs = stmt.executeQuery(sql);
(7)处理结果
遍历查询结果中的每一行,并读取相关字段:
// 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)释放资源
释放该过程中使用到的资源,注意关闭资源的顺序,先开启资源后关闭:
// 7. 释放资源
rs.close();
stmt.close();
conn.close();
JDBC API 介绍
这部分主要是对 JDBC
相关的 API
进行说明。
DriverManager
驱动管理类(DriverManager
)是一个工具类,其作用主要是:
(1)注册驱动
在 Class.forName("com.mysql.jdbc.Driver");
加载 Driver
类时,该类静态代码块中使用下面的代码自动进行了驱动的注册,可以通过 Ctrl
+ 鼠标点击 Driver
进入代码中查看:
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()
// 定义 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。
// DML
String sql = "UPDATE users set name = 'a' where id = 1";
Statement stmt = conn.createStatement();
int count = stmt.executeUpdate(sql);
System.out.println(count);
// 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
结果集对象。
// 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();