Java安全
Java 基础知识
01概述
02变量
03运算符
04程序控制语句
05数组
06面向对象编程
07代码练习
08重载
09作用域
10构造方法&构造器
11this
12包
13修饰符
14封装
15继承
16super
17覆盖&重写
18多态
19零钱通项目
20类变量&类方法
21抽象类
22接口
23内部类
24枚举
25泛型
26常用API
27lambda表达式
28正则表达式
29异常
30File&IO流
31日志技术
32多线程
33网络编程
01反射
02反序列化
03JVM
04JDBC
05RMI
06JRMP
07JNDI
08CDI
09JPA
10Servlet
11Filter
12MVC模型
13MVC框架
14类的加载机制
15Maven
16注解
17ORM
18CC链
19JNDI注入
Log4j2
-
+
首页
04JDBC
JDBC(Java Database Connectivity,Java 数据库连接)是 Java 语言操作关系型数据库的标准 API,它定义了一套统一的接口,用于 Java 程序与各种数据库(如 MySQL、Oracle、SQL Server 等)进行交互,屏蔽了不同数据库底层的实现差异。 ## 作用 JDBC 的核心目标是实现 Java 程序对数据库的统一访问: - 没有 JDBC 时,Java 程序访问不同数据库需要适配各自的 API(如 MySQL 有专属驱动,Oracle 有专属驱动),代码无法通用; - JDBC 定义了一套标准接口(如Connection、Statement、ResultSet),数据库厂商提供实现这些接口的 “驱动程序”(Driver),Java 程序通过调用 JDBC 接口,间接操作数据库,实现 “一次编码,适配多库”。 ## 核心组件(接口) JDBC 的核心功能通过以下接口实现,这些接口由数据库驱动提供具体实现: | 组件接口 | 描述 | | ----------------- | ------------------------------------------------------------ | | Driver | 数据库驱动接口,每个数据库厂商的驱动类(如com.mysql.cj.jdbc.Driver)都实现此接口,负责与数据库建立连接。 | | DriverManager | 驱动管理类(工具类),负责注册驱动、管理数据库连接,是获取Connection的入口。 | | Connection | 数据库连接对象,代表与数据库的一次会话,负责创建Statement、控制事务(提交 / 回滚)。 | | Statement | SQL 语句执行对象,用于向数据库发送 SQL 语句并执行(如查询、插入、更新)。 | | PreparedStatement | 预编译的Statement子类,支持参数化 SQL(用?占位符),可防止 SQL 注入,执行效率更高。 | | CallableStatement | 用于调用数据库存储过程的Statement子类,支持输入 / 输出参数。 | | ResultSet | 结果集对象,存储 SQL 查询的返回数据,提供遍历、获取字段值的方法(如getString()、getInt())。 | ## 操作流程 > 前期准备 引入数据库驱动,在项目中添加对应数据库的 JDBC 驱动(如 MySQL 的mysql-connector-java)。 ```xml <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> ``` 设置数据库连接信息:确认数据库URL、用户名、密码(jdbc:mysql://主机名:端口号/数据库名?参数)。 > 代码示例:查询操作 ```java import java.sql.*; public class JdbcDemo { public static void main(String[] args) { // 数据库连接信息 String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC"; String username = "root"; String password = "123456"; // 声明资源对象(需在finally中关闭,或用try-with-resources自动关闭) Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { // 1. 注册驱动(MySQL 5.1+后可省略,驱动类会自动注册) Class.forName("com.mysql.cj.jdbc.Driver"); // 加载驱动类 // 2. 获取数据库连接(通过DriverManager) conn = DriverManager.getConnection(url, username, password); // 3. 创建PreparedStatement(预编译SQL,防止SQL注入) String sql = "SELECT id, username, age FROM t_user WHERE age > ?"; // 参数用?占位 pstmt = conn.prepareStatement(sql); pstmt.setInt(1, 20); // 设置第1个参数(年龄>20) // 4. 执行SQL查询(返回ResultSet结果集) rs = pstmt.executeQuery(); // 5. 处理结果集 while (rs.next()) { // 遍历结果集 int id = rs.getInt("id"); String uname = rs.getString("username"); int age = rs.getInt("age"); System.out.println("id: " + id + ", username: " + uname + ", age: " + age); } } catch (ClassNotFoundException e) { e.printStackTrace(); // 驱动类未找到(通常是依赖问题) } catch (SQLException e) { e.printStackTrace(); // 数据库操作异常(如连接失败、SQL错误) } finally { // 6. 关闭资源(必须按ResultSet -> Statement -> Connection的顺序关闭,防止内存泄漏) try { if (rs != null) rs.close(); if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } ``` > 关键步骤 **注册驱动**:Class.forName("驱动类全限定名")会加载驱动类,触发其静态代码块中的DriverManager.registerDriver()方法,完成驱动注册(MySQL 5.1 + 后可省略此步,驱动会自动注册)。 **获取连接**:DriverManager.getConnection()根据 URL、用户名、密码建立与数据库的连接,Connection是 JDBC 操作的核心入口。 执行 SQL: - executeQuery():执行查询语句(SELECT),返回ResultSet; - executeUpdate():执行更新语句(INSERT/UPDATE/DELETE),返回受影响的行数; - PreparedStatement通过?占位符接收参数,避免字符串拼接 SQL 导致的注入风险(如OR 1=1),是推荐用法。 **关闭资源**:数据库连接、Statement、ResultSet 都是稀缺资源,必须关闭(JDK 7 + 可使用try-with-resources自动关闭,简化代码)。 ## 事务管理 JDBC 通过Connection控制事务,默认情况下,每条 SQL 执行后会自动提交(autoCommit=true),可手动关闭自动提交,实现多 SQL 的事务一致性(ACID): ```java try { conn.setAutoCommit(false); // 关闭自动提交,开启事务 // 执行一系列SQL操作(如转账:扣减A账户,增加B账户) pstmt1.executeUpdate(); // 操作1 pstmt2.executeUpdate(); // 操作2 conn.commit(); // 所有操作成功,提交事务 } catch (SQLException e) { conn.rollback(); // 有异常,回滚事务(撤销所有操作) e.printStackTrace(); } finally { conn.setAutoCommit(true); // 恢复默认设置 } ```
毛林
2025年10月27日 20:56
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码