文章目录
- 基本流程
- 注册驱动的两种方法
- DriverManager
- DriverManager 的核心作用
- 核心原理
- 自动注册驱动的机制
- 关键方法
- 示例代码: 连接Mysql数据库
- Statement
- PreparedStatement
JDBC全称Java DataBase Connectivity。
定义: JDBC 是 Java 语言中用于连接和执行 SQL 操作的标准接口。
功能: 提供统一的方式访问关系型数据库(如 MySQL、Oracle、PostgreSQL 等)。
核心包: java.sql 和 javax.sql。
基本流程
- 加载并注册驱动
- 建立数据库连接
- 创建 Statement 对象
- 执行sql语句
- 处理结果集 (ResultSet)
- 释放资源 (直接close)
注册驱动的两种方法
以mysql为例
第一种:
DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
- 手动创建一个驱动实例,并显式注册到
DriverManager
中 DriverManager
会将这个驱动添加到它的驱动列表中,以便后续用getConnection()
建立数据库连接。
第二种(推荐)
Class.forName("com.mysql.cj.jdbc.Driver")
- 利用 Java 的反射机制加载这个类,并执行它的静态代码块
com.mysql.cj.jdbc.Driver
的静态代码块中已经调用了
DriverManager.registerDriver(new Driver());
所以自动完成了驱动注册。
DriverManager
DriverManager
是 Java JDBC(Java Database Connectivity)API 的核心类之一,它负责管理数据库驱动并协调应用程序与数据库之间的连接。
DriverManager 的核心作用
功能 | 说明 |
---|---|
驱动注册 | 接受驱动类注册(DriverManager.registerDriver() ) |
驱动管理 | 内部维护一个已注册驱动的列表 |
获取连接 | 通过 getConnection() 方法,找到能处理特定 JDBC URL 的驱动并返回连接 |
核心原理
驱动注册机制
- JDBC 驱动类实现了
java.sql.Driver
接口 - 驱动类的静态代码块中通常会调用:
DriverManager.registerDriver(new Driver());
这就把该驱动对象注册到 DriverManager
的内部驱动列表中。
- 也可以手动注册:
DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
驱动列表
DriverManager
内部维护了一个List<Driver>
,用于存储所有注册的 JDBC 驱动- 这个列表是线程安全的(使用了同步机制)
获取连接
getConnection() 的调用
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db", "user", "pass");
执行流程如下:
-
- 遍历内部注册的驱动列表
- 每个驱动调用
acceptsURL(url)
判断是否支持这个 URL - 找到支持的驱动后,调用它的
connect()
方法返回一个Connection
对象 - 如果没有任何驱动支持这个 URL,会抛出
SQLException
自动注册驱动的机制
从 JDBC 4.0 开始(Java 6 起),支持SPI 自动注册机制:
- 驱动 JAR 包中包含
META-INF/services/java.sql.Driver
文件 - 文件内容为驱动的全限定类名,如:
com.mysql.cj.jdbc.Driver
- 当类加载器加载驱动 jar 时,JDK 会自动加载并注册驱动类,无需显式写
Class.forName(...)
所以可以直接写:
Connection conn = DriverManager.getConnection(...);
关键方法
方法 | 说明 |
---|---|
getConnection(String url, String user, String password) | 根据 URL、用户名、密码获取数据库连接 |
getDrivers() | 获取当前已注册的所有驱动 |
registerDriver(Driver driver) | 手动注册驱动(通常不需要直接调用) |
deregisterDriver(Driver driver) | 从注册列表中移除驱动 |
getDrivers() | 获取所有已注册的驱动实例 |
setLogWriter(PrintWriter) | 设置日志输出流 |
setLoginTimeout(int seconds) | 设置连接超时时间 |
示例代码: 连接Mysql数据库
package JDBC;import java.sql.*;public class demo1 {public static void main(String[] args) {String url="jdbc:mysql://localhost:3307/test";String user="root";String password="root";try{//1.加载驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.建立连接Connection conn= DriverManager.getConnection(url,user,password);//3.创建StatementStatement stmt = conn.createStatement();//4.执行sql语句ResultSet rs = stmt.executeQuery("select * from users");//5.处理结果集while(rs.next()){String username = rs.getString("user");//列名的方式String pass = rs.getString(2);//列下标的方式System.out.println("username:"+username+" password:"+pass);}//6.关闭资源rs.close();stmt.close();conn.close();}catch (Exception e){e.printStackTrace();System.out.println(e.getMessage());}}
}
Statement
Statement sql语句的主要操作函数有三个
executeQuery() //执行select查询语句
executrupdate() //可以执行insert,update,delect,CREATE 之类的
execute() //执行任意语句
PreparedStatement
PreparedStatement其sql语句是在其获取命令执行对象时就以及写入了预编译语句。其要进行sql执行只要对其参数进行传入即可
PreparedStatement pstmt = conn.prepareStatement("select * from users where user=?");
pstmt.setString(1,"xpw");
ResultSet rs2 = pstmt.executeQuery();
rs2.next();
System.out.println("预编译查询\t用户名:"+rs2.getString("user")+" 密码:"+rs2.getString("password"));//预编译查询 用户名:xpw 密码:123
需要注意的是所得到的ResultSet类的实例,其初始的索引是不在第一行的,我们想获取内容需要先使用next使得索引内移