什么是JDBC?
JDBC(Java Database Connectivity)是Java语言操作数据库的一套标准接口。你可以把它想象成**“Java和数据库之间的桥梁”**。
- 作用:用Java代码连接数据库(如MySQL、Oracle),执行SQL语句(增删改查),并处理结果。
- 为什么需要它?不同数据库有自己的“方言”(如MySQL用
VARCHAR
,Oracle用VARCHAR2
),JDBC统一了操作方式,开发者只需学一套API。
JDBC的四大核心组件
DriverManager
- 管理数据库驱动,负责“找司机”(驱动)。
- 示例:
Class.forName("com.mysql.cj.jdbc.Driver");
(加载MySQL驱动)。
Connection
表示Java程序与数据库的“连接”,类似打电话时的通话线路。
获取方式:
Connection conn = DriverManager.getConnection(url, user, password);
Statement / PreparedStatement
Statement:直接执行SQL语句,但可能被SQL注入攻击(不安全)。
Statement stmt = conn.createStatement();
PreparedStatement(推荐):预编译SQL,防注入,性能更高。
PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE id=?"); ps.setInt(1, 1001); // 参数下标从1开始
ResultSet
保存查询结果,类似Excel表格,用“光标”逐行读取数据。
ResultSet rs = ps.executeQuery(); while (rs.next()) { String name = rs.getString("name"); }
JDBC使用步骤(六步法)
1. 导入数据库驱动包
- 如MySQL:下载
mysql-connector-java.jar
,添加到项目依赖。
2. 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver"); // 新版MySQL可省略,自动加载
3. 建立连接
String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC";
String user = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, user, password);
4. 创建Statement对象
PreparedStatement ps = conn.prepareStatement("INSERT INTO users(name) VALUES (?)");
ps.setString(1, "张三");
5. 执行SQL并处理结果
增删改:
int rows = ps.executeUpdate(); // 返回受影响的行数
查询:
ResultSet rs = ps.executeQuery(); while (rs.next()) { System.out.println(rs.getString("name")); }
6. 关闭资源(重要!)
rs.close();
ps.close();
conn.close(); // 关闭顺序:后开的先关
优化:用try-with-resources
自动关闭(Java 7+)
try (Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement ps = conn.prepareStatement(sql)) {
// 执行操作...
} // 自动关闭conn和ps,无需手动
事务处理
确保多个操作要么全部成功,要么全部失败(如转账)。
conn.setAutoCommit(false); // 关闭自动提交
try {
// 执行多个SQL...
conn.commit(); // 成功则提交
} catch (Exception e) {
conn.rollback(); // 失败则回滚
}
连接池(提升性能)
频繁创建连接很耗资源,连接池会预先创建一批连接,用时取出,用完归还。
常用工具:HikariCP、Druid
示例(HikariCP):
HikariConfig config = new HikariConfig(); config.setJdbcUrl(url); config.setUsername(user); config.setPassword(password); HikariDataSource ds = new HikariDataSource(config); Connection conn = ds.getConnection(); // 从池中获取
常见问题及解决
- ClassNotFoundException: com.mysql.jdbc.Driver
- 原因:未导入驱动包,或驱动类名写错。
- 解决:检查包路径,新版MySQL驱动类名为
com.mysql.cj.jdbc.Driver
。
- SQLException: Access denied for user
- 原因:用户名或密码错误,或数据库未授权远程访问。
- 解决:检查密码,确保数据库允许从本地(或指定IP)连接。
- 连接泄漏
- 现象:程序运行一段时间后无法连接数据库。
- 解决:确保所有
Connection
、Statement
、ResultSet
在finally块或try-with-resources中关闭。
总结
- JDBC核心:通过
DriverManager
获取连接,用PreparedStatement
执行SQL,处理ResultSet
结果。 - 最佳实践:使用连接池、PreparedStatement防注入、try-with-resources管理资源。
- 下一步学习:掌握ORM框架(如MyBatis、Hibernate),简化JDBC操作。
示例完整代码(MySQL插入数据):
try (Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test?serverTimezone=UTC", "root", "123456");
PreparedStatement ps = conn.prepareStatement("INSERT INTO users(name) VALUES (?)")) {
ps.setString(1, "李四");
int rows = ps.executeUpdate();
System.out.println("插入了 " + rows + " 行数据");
} catch (SQLException e) {
e.printStackTrace();
}