JDBC 连接与查询
掌握 DriverManager、Connection、Statement、ResultSet
JDBC 连接与查询
JDBC(Java Database Connectivity)是 Java 操作数据库的统一标准。不管底层是 MySQL、PostgreSQL 还是 Oracle,你写的 JDBC 代码几乎一样——数据库厂商提供各自的驱动实现即可。
学完本章你将: 创建连接、执行查询、处理 ResultSet、完成增删改。
核心组件关系
你的代码
→ DriverManager(找驱动)
→ Connection(数据库连接,相当于一条电话线)
→ PreparedStatement(预编译 SQL,相当于发电报)
→ ResultSet(查询结果,一张临时表)
添加驱动依赖
xml
<!-- MySQL 驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.3.0</version>
</dependency>
建立连接
java
// JDBC URL 格式:jdbc:数据库类型://主机:端口/数据库名
String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC";
String user = "root";
String password = "123456";
// try-with-resources 保证连接自动关闭
try (Connection conn = DriverManager.getConnection(url, user, password)) {
System.out.println("连接成功!数据库:" + conn.getCatalog());
} // conn 自动 close()
执行查询(推荐 PreparedStatement)
java
String sql = "SELECT id, name, age FROM users WHERE age > ?";
try (Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1, 18); // 第1个 ? 填 18(索引从 1 开始,不是 0!)
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) { // 逐行读取
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.printf("ID: %d, 姓名: %s, 年龄: %d%n", id, name, age);
}
}
}
⚠️ 为什么不用 Statement?
Statement拼接 SQL 字符串容易 SQL 注入。PreparedStatement用?占位符,参数和 SQL 分离,安全且预编译更快。
增删改 —— executeUpdate
java
// INSERT
String insert = "INSERT INTO users (name, age) VALUES (?, ?)";
try (PreparedStatement stmt = conn.prepareStatement(insert)) {
stmt.setString(1, "Alice");
stmt.setInt(2, 25);
int rows = stmt.executeUpdate(); // 返回影响行数
System.out.println("插入 " + rows + " 行");
}
// UPDATE
String update = "UPDATE users SET age = age + 1 WHERE name = ?";
// DELETE
String delete = "DELETE FROM users WHERE id = ?";
💡 查询用
executeQuery()(返回 ResultSet),增删改用executeUpdate()(返回影响行数)。