JDBC
# 一、JDBC 基本概念
# 1.1 概念
- JDBC(Java Database Connectivity):Java 操作数据库的一套标准 API。
- 本质:Sun 公司定义的一套操作关系型数据库的接口(规则)。数据库厂商提供实现(即数据库驱动 jar 包)。
# 1.2 工作原理
- 开发时使用 JDBC 接口编程。
- 实际运行时,由具体数据库厂商的实现类来执行操作。
# 二、快速入门步骤
# 2.1 步骤流程
- 导入驱动 jar 包(如:mysql-connector-java-5.1.37-bin.jar)
- 注册驱动(Class.forName(...))
- 获取数据库连接对象:Connection
- 定义 SQL
- 获取执行 SQL 的对象:Statement
- 执行 SQL,接收返回结果
- 处理结果
- 释放资源
# 2.2 示例代码(更新语句)
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
String sql = "UPDATE account SET balance = 500 WHERE id = 1";
Statement stmt = conn.createStatement();
int count = stmt.executeUpdate(sql);
System.out.println(count);
stmt.close();
conn.close();
# 三、JDBC 核心对象详解
# 3.1 DriverManager:驱动管理类
- 注册驱动:Class.forName("com.mysql.jdbc.Driver");
- 获取连接:
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
# 3.2 Connection:数据库连接对象
创建 SQL 执行对象:createStatement() / prepareStatement()
管理事务:
- 开启:setAutoCommit(false)
- 提交:commit()
- 回滚:rollback()
# 3.3 Statement:执行 SQL 的对象
- 执行通用 SQL:execute(String sql)
- 执行增删改:executeUpdate(String sql)
- 执行查询:executeQuery(String sql)
# 3.4 ResultSet:结果集对象
- 遍历数据:
while (rs.next()) {
int id = rs.getInt(1);
String name = rs.getString("name");
double balance = rs.getDouble(3);
}
获取数据:
- getXxx(int columnIndex)
- getXxx(String columnName)
# 3.5 PreparedStatement:预编译执行对象
- 防止 SQL 注入。
- 使用占位符 ?:
String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "zhangsan");
pstmt.setString(2, "123");
# 四、JDBC 工具类封装:
# JDBCUtils
# 4.1 目的
- 简化 JDBC 开发
- 提供通用的连接获取与资源释放功能
# 4.2 配置文件
jdbc.properties
url=jdbc:mysql://localhost:3306/db3
user=root
password=root
driver=com.mysql.jdbc.Driver
# 4.3 工具类结构
public class JDBCUtils {
static {
Properties pro = new Properties();
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL res = classLoader.getResource("jdbc.properties");
pro.load(new FileReader(res.getPath()));
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
Class.forName(driver);
}
public static Connection getConnection() {
return DriverManager.getConnection(url, user, password);
}
public static void close(ResultSet rs, Statement stmt, Connection conn) {
// 分别关闭资源
}
}
# 五、实战示例:用户登录验证
# 5.1 数据表结构
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(32),
password VARCHAR(32)
);
INSERT INTO user VALUES (NULL, 'zhangsan', '123');
INSERT INTO user VALUES (NULL, 'lisi', '234');
# 5.2 登录验证代码
public boolean login(String username, String password) {
if (username == null || password == null) return false;
String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
try (Connection conn = JDBCUtils.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, username);
pstmt.setString(2, password);
ResultSet rs = pstmt.executeQuery();
return rs.next();
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
# 六、JDBC 控制事务
# 6.1 场景:
转账操作(张三 -> 李四 500元)
# 6.2 步骤
- 开启事务:conn.setAutoCommit(false)
- 执行多个 SQL
- 如果全部成功:conn.commit()
- 如果异常:conn.rollback()
# 6.3 示例代码
conn.setAutoCommit(false); // 开启事务
PreparedStatement pstmt1 = conn.prepareStatement(sql1);
PreparedStatement pstmt2 = conn.prepareStatement(sql2);
// 设置参数 & 执行 SQL
pstmt1.setDouble(1, 500);
pstmt1.setInt(2, 1);
pstmt2.setDouble(1, 500);
pstmt2.setInt(2, 2);
pstmt1.executeUpdate();
int error = 1 / 0; // 模拟异常
pstmt2.executeUpdate();
conn.commit(); // 成功后提交
// catch 中处理回滚
conn.rollback();
# ✅ 总结
| 对象 | 作用 |
|---|---|
| DriverManager | 管理驱动与数据库连接 |
| Connection | 表示数据库连接对象 |
| Statement | 执行 SQL 语句(不安全) |
| PreparedStatement | 预编译语句,防注入 |
| ResultSet | 查询结果集 |
推荐:使用 PreparedStatement 完成所有 SQL 操作,安全高效。
上次更新: 2025/07/23, 01:37:33