JDBC(Java Database Connectivity)三层架构指的是将数据库操作分成三个独立的层次:JDBC API、JDBC驱动程序和数据库本身。下面分三个部分详细解释每个层次的作用和相互之间的关系:
JDBC三层架构
JDBC API
JDBC API提供了一系列的类和接口,用于在Java程序中对数据库进行操作,通过JDBC API来实现Java程序和数据库的连接和操作。JDBC API提供了以下最核心的接口:
- Connection:提供连接数据库的方法。
- Statement/PreparedStatement:提供数据查询的方法。
- ResultSet:提供数据集合的访问方法。
同时还有一些其他的接口和类提供异常处理、元数据和事务等操作。JDBC API本身并不包含任何数据库的驱动或实现,只是定义了Java程序与数据库之间的规范。
JDBC驱动程序
JDBC驱动程序是JDBC API与不同数据库之间的连接的关键桥梁。JDBC驱动程序将接收到的JDBC API调用转换成对应的数据库底层API调用,从而使Java程序可以与不同的数据库进行连接和操作。JDBC驱动程序根据驱动类型可以分为以下三种:
- JDBC-ODBC桥:使用ODBC来连接数据库。
- 基于本地协议的驱动程序:针对某个特定的数据库。
- 网络协议驱动程序:通过TCP/IP协议进行通信,支持多种不同的数据库系统。
不同类型的JDBC驱动程序的具体实现方式也有所不同,但是,他们都必须实现JDBC API中定义的接口,以便Java程序能够调用和使用。
数据库本身
数据库本身就是我们需要操作和查询的具体数据存储地方,它可以是关系型数据库或非关系型数据库,根据实际情况选择相应的数据库。
示例
下面我们举两个例子,说明如何使用JDBC API进行数据库操作:
示例一
该示例用Java代码创建一个名为“test”的数据库,然后在其中插入一条数据并查询出来。
import java.sql.*;
public class JdbcDemo {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 注册数据库驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 打开数据库连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306", "root", "password");
// 创建数据库test
stmt = conn.createStatement();
stmt.executeUpdate("CREATE DATABASE test");
// 选中数据库test
stmt.executeUpdate("USE test");
// 创建数据表tb_user
stmt.executeUpdate("CREATE TABLE IF NOT EXISTS tb_user (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20) NOT NULL, age INT NOT NULL)");
// 插入数据
stmt.executeUpdate("INSERT INTO tb_user(name, age) VALUES ('Tom', 18)");
// 查询数据
rs = stmt.executeQuery("SELECT * FROM tb_user");
while (rs.next()) {
System.out.println("id: " + rs.getInt("id") + " name: " + rs.getString("name") + " age: " + rs.getInt("age"));
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
try {
// 关闭连接
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
}
示例二
该示例通过PreparedStatement实现了一条插入数据的语句。PreparedStatement是一种特殊的Statement,可以使用占位符,避免SQL注入问题。
import java.sql.*;
public class JdbcDemo {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 注册数据库驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 打开数据库连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password");
// 插入数据
pstmt = conn.prepareStatement("INSERT INTO tb_user(name, age) VALUES (?, ?)");
pstmt.setString(1, "Mike");
pstmt.setInt(2, 20);
pstmt.executeUpdate();
// 查询数据
rs = pstmt.executeQuery("SELECT * FROM tb_user");
while (rs.next()) {
System.out.println("id: " + rs.getInt("id") + " name: " + rs.getString("name") + " age: " + rs.getInt("age"));
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
try {
// 关闭连接
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
}
以上两个示例演示了使用JDBC API进行数据库的连接、创建和操作,JDBC驱动程序将Java程序中定义的API调用转换成相应的数据库调用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JDBC三层架构深入刨析 - Python技术站