一、JDBC概述
Java DataBase Connectivity(JDBC) 是Java语言中用于连接和操作关系型数据库的标准API。通过JDBC,开发者可以轻松实现:
-
建立/关闭数据库连接
-
执行SQL语句
-
处理查询结果集
-
管理数据库事务
为什么需要JDBC?
不同数据库厂商(MySQL/Oracle/SQL Server)底层实现不同,JDBC通过定义统一接口屏蔽数据库差异,开发者只需掌握一套API即可操作各类数据库。
二、JDBC核心接口与类
类/接口 | 作用 |
---|---|
DriverManager | 管理数据库驱动,建立数据库连接 |
Connection | 表示与数据库的连接 |
Statement | 执行静态SQL语句 |
PreparedStatement | 预编译SQL语句,防止SQL注入 |
ResultSet | 封装查询结果集 |
三、JDBC六步开发流程(附代码实战)
步骤1:创建测试数据库
-- 创建员工表
CREATE TABLE emp (
empno INT PRIMARY KEY,
ename VARCHAR(50),
job VARCHAR(50),
sal DECIMAL(10,2)
);
-- 插入测试数据
INSERT INTO emp VALUES
(7369, 'SMITH', 'CLERK', 800),
(7499, 'ALLEN', 'SALESMAN', 1600);
步骤2:项目引入MySQL驱动
-
Maven项目添加依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
步骤3:完整CRUD示例
public class JDBCTest {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// 1. 注册驱动(MySQL5.7+可省略)
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 获取连接
String url = "jdbc:mysql://localhost:3306/test?useSSL=false";
conn = DriverManager.getConnection(url, "root", "root");
// 3. 预编译SQL
String sql = "INSERT INTO emp(empno, ename, job, sal) VALUES(?,?,?,?)";
ps = conn.prepareStatement(sql);
// 4. 设置参数
ps.setInt(1, 7934);
ps.setString(2, "MILLER");
ps.setString(3, "CLERK");
ps.setDouble(4, 1300);
// 5. 执行更新
int count = ps.executeUpdate();
System.out.println("插入" + count + "条记录");
} catch (Exception e) {
e.printStackTrace();
} finally {
// 6. 释放资源(反向关闭)
try { if(rs != null) rs.close(); } catch (Exception e) {}
try { if(ps != null) ps.close(); } catch (Exception e) {}
try { if(conn != null) conn.close(); } catch (Exception e) {}
}
}
}
四、防范SQL注入攻击
什么是SQL注入?
通过构造特殊输入参数篡改SQL语义,例如:
SELECT * FROM users
WHERE username='admin' AND password='' OR '1'='1';
这将绕过密码验证!
解决方案:PreparedStatement
String sql = "SELECT * FROM users WHERE username=? AND password=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, inputUsername);
ps.setString(2, inputPassword);
ResultSet rs = ps.executeQuery();
优势:
-
预编译SQL模板
-
自动处理特殊字符转义
-
提升执行效率(重复执行只需编译一次)
五、事务管理与工具类封装
事务ACID特性实现
try {
conn.setAutoCommit(false); // 关闭自动提交
// 执行多个SQL操作
updateAccount(conn, "A", -100);
updateAccount(conn, "B", 100);
conn.commit(); // 提交事务
} catch (Exception e) {
conn.rollback(); // 回滚事务
}
工具类DBUtil优化
public class DBUtil {
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "root");
}
public static void close(Connection conn, Statement stmt, ResultSet rs) {
// 统一关闭资源逻辑
}
}
六、JDBC核心技巧总结
-
资源释放:使用
try-with-resources
自动关闭(Java7+) -
连接池:生产环境推荐使用Druid/HikariCP
-
ORM框架:进阶学习MyBatis/JPA
-
性能优化:批量处理
addBatch()
/executeBatch()
附录:常见错误排查
-
驱动问题:
No suitable driver found
→ 检查驱动版本和URL格式 -
时区问题:添加
serverTimezone=Asia/Shanghai
参数 -
SSL警告:
useSSL=false
禁用(仅测试环境)
掌握JDBC是Java开发者必备的数据库操作技能!!