当前位置:首页 > 后端开发 > 正文

Java如何查询数据库

在Java中查询数据库通常使用JDBC API:加载驱动、建立连接、创建Statement对象执行SQL查询语句,通过ResultSet处理返回数据,最后关闭连接释放资源。

在Java中查询数据库是后端开发的核心操作之一,主要通过JDBC(Java Database Connectivity) 实现,以下是详细步骤和最佳实践,涵盖从基础连接到安全查询的全流程:


准备工作

  1. 导入JDBC驱动
    在Maven项目中添加依赖(以MySQL为例):

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
  2. 数据库连接信息
    准备以下参数:

    • 数据库URL:jdbc:mysql://localhost:3306/your_database
    • 用户名和密码
    • 表结构(示例表usersid INT, name VARCHAR(50)

查询数据库的6个步骤

加载并注册驱动

Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL 8.0+

建立数据库连接

String url = "jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC";
String user = "root";
String password = "your_password";
try (Connection connection = DriverManager.getConnection(url, user, password)) {
    // 后续操作在此代码块内进行
}

创建Statement对象

// 使用PreparedStatement防止SQL注入
String sql = "SELECT id, name FROM users WHERE age > ?";
try (PreparedStatement statement = connection.prepareStatement(sql)) {
    statement.setInt(1, 18); // 设置参数(索引从1开始)
    // 执行查询
    try (ResultSet resultSet = statement.executeQuery()) {
        // 处理结果集
    }
}

处理查询结果

while (resultSet.next()) {
    int id = resultSet.getInt("id");
    String name = resultSet.getString("name");
    System.out.println("ID: " + id + ", Name: " + name);
}

关闭资源(自动)

使用 try-with-resources(Java 7+)自动关闭连接、Statement和ResultSet,避免资源泄漏。

Java如何查询数据库  第1张


完整代码示例

import java.sql.*;
public class DatabaseQuery {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/test_db";
        String user = "root";
        String password = "secure_pass123";
        try (Connection conn = DriverManager.getConnection(url, user, password)) {
            String sql = "SELECT id, name FROM users WHERE status = ?";
            try (PreparedStatement stmt = conn.prepareStatement(sql)) {
                stmt.setString(1, "active");  // 参数化查询
                try (ResultSet rs = stmt.executeQuery()) {
                    while (rs.next()) {
                        System.out.println(
                            "User ID: " + rs.getInt("id") + 
                            ", Name: " + rs.getString("name")
                        );
                    }
                }
            }
        } catch (SQLException e) {
            e.printStackTrace(); // 生产环境应使用日志框架
        }
    }
}

关键注意事项

  1. 防SQL注入
    必须使用PreparedStatement 替代Statement,避免拼接SQL字符串。

  2. 连接池优化
    高并发场景使用连接池(如HikariCP):

    HikariConfig config = new HikariConfig();
    config.setJdbcUrl(url);
    config.setUsername(user);
    config.setPassword(password);
    try (HikariDataSource dataSource = new HikariDataSource(config)) {
        Connection conn = dataSource.getConnection();
        // 使用连接
    }
  3. 异常处理
    捕获SQLException并合理处理(记录日志/抛出业务异常):

    catch (SQLException e) {
        logger.error("Database query failed: " + e.getMessage());
        throw new CustomException("查询失败,请重试");
    }
  4. 结果集处理

    • 使用resultSet.getXxx("column_name")按列名获取数据(推荐)。
    • 检查resultSet.next()移动游标并判断是否有数据。

扩展:常用工具库

  1. JPA/Hibernate
    对象关系映射(ORM)简化CRUD:

    @Entity
    public class User {
        @Id
        private Long id;
        private String name;
    }
    // 查询示例
    List<User> users = entityManager.createQuery("FROM User", User.class).getResultList();
  2. Spring JDBC Template
    简化JDBC模板代码:

    jdbcTemplate.query("SELECT * FROM users", 
        (rs, rowNum) -> new User(rs.getInt("id"), rs.getString("name"))
    );

  • 基础流程:加载驱动 → 建立连接 → 创建PreparedStatement → 执行查询 → 处理ResultSet → 关闭资源。
  • 安全优先:始终使用参数化查询(PreparedStatement)。
  • 性能优化:连接池管理资源,及时关闭数据库连接。
  • 现代方案:生产环境推荐使用Spring Data JPA或MyBatis等框架减少样板代码。

通过遵循这些实践,可构建高效、安全的数据库查询逻辑,符合E-A-T原则(专业性、权威性、可信度),确保代码质量和可维护性。


引用说明:本文代码示例基于Oracle官方JDBC文档、MySQL Connector/J 8.0指南及OWASP SQL注入防护建议,遵循Java数据库开发最佳实践,技术细节可参考:

  • Oracle JDBC Tutorial
  • MySQL Connector/J Documentation
  • HikariCP GitHub
0