Z
ZHANK
编程在线教程Java 教程JDBC 连接与查询
JDBC 与数据库

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()(返回影响行数)。