一、JDBC核心概念
-
定义
JDBC(Java Database Connectivity)是Java语言中用于与数据库进行交互的API。它提供了一种标准的方法来访问各种关系型数据库,如MySQL、Oracle、PostgreSQL等。通过JDBC,Java应用程序可以执行SQL语句、处理查询结果、管理数据库连接等操作。 -
核心组件
- DriverManager:管理数据库驱动的加载与连接获取。
- Connection:代表数据库连接对象。
- Statement/PreparedStatement:执行SQL语句的操作对象。
- ResultSet:存储查询结果的迭代器。
-
URL格式
jdbc:<协议>://<IP地址>:<端口号>/<资源名>?<参数>
示例:
String url = "jdbc:mysql://localhost:3306/testdb?serverTimezone=Asia/Shanghai&useSSL=false";
二、JDBC编程六步法
-
注册驱动
Class.forName("com.mysql.cj.jdbc.Driver"); // 推荐方式(自动注册驱动) // 或显式注册(不常用) DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
-
获取连接
Connection conn = DriverManager.getConnection(url, user, password);
-
创建操作对象
- Statement:直接执行静态SQL(存在SQL注入风险)。
Statement stmt = conn.createStatement(); int count = stmt.executeUpdate("UPDATE table SET ...");
- PreparedStatement:预编译SQL,支持参数化查询(推荐)。
PreparedStatement ps = conn.prepareStatement("SELECT * FROM user WHERE name=?"); ps.setString(1, "admin"); ResultSet rs = ps.executeQuery();
- Statement:直接执行静态SQL(存在SQL注入风险)。
-
执行SQL语句
executeUpdate()
:用于DML/DDL语句,返回受影响行数。executeQuery()
:用于SELECT语句,返回ResultSet
。
-
处理结果集
while (rs.next()) { String name = rs.getString("name"); int age = rs.getInt("age"); }
-
释放资源
if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (conn != null) conn.close();
三、关键注意事项
-
SQL注入防护
- 问题:用户输入直接拼接到SQL中,可能导致恶意代码执行。
- 解决方案:使用
PreparedStatement
,通过占位符(?
)传递参数。
-
事务控制
- 默认自动提交,需手动关闭:
conn.setAutoCommit(false); // 开启事务 // 执行多条SQL... conn.commit(); // 提交事务 // 或捕获异常时回滚 conn.rollback();
- 默认自动提交,需手动关闭:
-
驱动兼容性
- MySQL 5驱动类:
com.mysql.jdbc.Driver
。 - MySQL 8驱动类:
com.mysql.cj.jdbc.Driver
(需配置serverTimezone
参数)。
- MySQL 5驱动类:
-
资源管理优化
- 使用工具类封装连接与资源释放:
public class JDBCUtil { private static String url = "jdbc:mysql://..."; // 从配置文件读取 // 静态块注册驱动 static { Class.forName("com.mysql.cj.jdbc.Driver"); } // 获取连接、关闭资源方法... }
- 使用工具类封装连接与资源释放:
四、扩展知识
-
乐观锁与悲观锁
- 乐观锁:通过版本号(
version
字段)控制并发更新,适用于低冲突场景。 - 悲观锁:通过
FOR UPDATE
或LOCK IN SHARE MODE
锁定行,强制事务串行化。
- 乐观锁:通过版本号(
-
配置管理
- 使用
jdbc.properties
文件管理连接信息:
通过driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/testdb?serverTimezone=Asia/Shanghai user=root password=123456
ResourceBundle
加载配置,提升灵活性。
- 使用
五、常见错误修正
-
拼写错误
registerDeiver
→registerDriver
exexuteUpdata
→executeUpdate
com.mysql.jdbc.Deiver
→com.mysql.cj.jdbc.Driver
-
驱动兼容性
- MySQL 8需添加时区参数:
serverTimezone=Asia/Shanghai
。
- MySQL 8需添加时区参数:
六、最佳实践
- 优先使用
PreparedStatement
防止SQL注入。 - 通过工具类统一管理数据库连接与资源释放。
- 事务操作需明确提交或回滚,避免数据不一致。
- 配置文件管理数据库连接信息,提升可维护性。
示例代码
以下是一个简单的JDBC示例,展示了如何连接到MySQL数据库并执行查询:
import java.sql.*;
public class JdbcExample {
public static void main(String[] args) {
try {
// 1. 加载数据库驱动程序
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 建立数据库连接
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydatabase", "username", "password");
// 3. 创建Statement对象
Statement statement = connection.createStatement();
// 4. 执行SQL查询
ResultSet resultSet = statement.executeQuery("SELECT * FROM mytable");
// 5. 处理查询结果
while (resultSet.next()) {
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
System.out.println("Name: " + name + ", Age: " + age);
}
// 6. 关闭资源
resultSet.close();
statement.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意事项
异常处理:在实际应用中,应该使用try-catch块来捕获和处理SQLException等异常。
资源管理:确保在使用完Connection、Statement和ResultSet等资源后,及时关闭它们,以避免资源泄漏。
SQL注入:使用PreparedStatement而不是Statement来执行SQL语句,以防止SQL注入攻击。
连接池:在高并发应用中,建议使用数据库连接池(如HikariCP、C3P0)来管理数据库连接,以提高性能和资源利用率。
JDBC是Java与数据库交互的基础,掌握它的使用对于开发数据库驱动的应用程序非常重要。