Java案例如何实现数据库查询?

wen java案例 23

本文目录导读:

Java案例如何实现数据库查询?

  1. 环境准备
  2. 基础查询案例
  3. 封装成工具类
  4. 关键要点

在Java中实现数据库查询通常使用 JDBC(Java Database Connectivity) 技术,下面我将通过一个完整的案例,展示如何从数据库中进行查询操作,涵盖从环境准备到代码实现的全过程。

环境准备

1 添加数据库驱动依赖

如果是使用 Maven 项目,在 pom.xml 中添加 MySQL 驱动依赖:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>

2 创建数据库和表

在 MySQL 中创建示例数据:

CREATE DATABASE IF NOT EXISTS demo_db;
USE demo_db;
CREATE TABLE IF NOT EXISTS users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100),
    age INT
);
-- 插入测试数据
INSERT INTO users (name, email, age) VALUES 
('张三', 'zhangsan@example.com', 25),
('李四', 'lisi@example.com', 30),
('王五', 'wangwu@example.com', 28);

基础查询案例

1 查询所有用户

import java.sql.*;
public class DatabaseQueryDemo {
    public static void main(String[] args) {
        // 数据库连接信息
        String url = "jdbc:mysql://localhost:3306/demo_db?useSSL=false&serverTimezone=UTC";
        String username = "root";
        String password = "123456";
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            // 1. 加载驱动(MySQL 8.x 版本可以省略,DriverManager 会自动加载)
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 2. 建立数据库连接
            conn = DriverManager.getConnection(url, username, password);
            // 3. 创建 Statement 对象
            stmt = conn.createStatement();
            // 4. 执行查询
            String sql = "SELECT * FROM users";
            rs = stmt.executeQuery(sql);
            // 5. 处理结果集
            System.out.println("=== 所有用户信息 ===");
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String email = rs.getString("email");
                int age = rs.getInt("age");
                System.out.printf("ID: %d, 姓名: %s, 邮箱: %s, 年龄: %d\n", 
                                  id, name, email, age);
            }
        } catch (ClassNotFoundException e) {
            System.out.println("数据库驱动未找到: " + e.getMessage());
        } catch (SQLException e) {
            System.out.println("数据库操作异常: " + e.getMessage());
        } finally {
            // 6. 释放资源
            try {
                if (rs != null) rs.close();
                if (stmt != null) stmt.close();
                if (conn != null) conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

2 带条件的查询(使用 PreparedStatement)

import java.sql.*;
public class PreparedStatementQueryDemo {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/demo_db?useSSL=false&serverTimezone=UTC";
        String username = "root";
        String password = "123456";
        // 查询年龄大于指定值的用户
        int minAge = 26;
        String sql = "SELECT * FROM users WHERE age > ?";
        try (Connection conn = DriverManager.getConnection(url, username, password);
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            // 设置查询参数
            pstmt.setInt(1, minAge);
            // 执行查询
            try (ResultSet rs = pstmt.executeQuery()) {
                System.out.println("=== 年龄大于 " + minAge + " 的用户 ===");
                while (rs.next()) {
                    int id = rs.getInt("id");
                    String name = rs.getString("name");
                    String email = rs.getString("email");
                    int age = rs.getInt("age");
                    System.out.printf("ID: %d, 姓名: %s, 邮箱: %s, 年龄: %d\n", 
                                      id, name, email, age);
                }
            }
        } catch (SQLException e) {
            System.out.println("数据库操作异常: " + e.getMessage());
        }
    }
}

封装成工具类

为了代码复用,可以将数据库连接和查询操作封装成工具类:

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
// 用户实体类
class User {
    private int id;
    private String name;
    private String email;
    private int age;
    public User(int id, String name, String email, int age) {
        this.id = id;
        this.name = name;
        this.email = email;
        this.age = age;
    }
    @Override
    public String toString() {
        return String.format("User{id=%d, name='%s', email='%s', age=%d}", 
                             id, name, email, age);
    }
}
// 数据库连接工具类
class DBUtil {
    private static final String URL = "jdbc:mysql://localhost:3306/demo_db?useSSL=false&serverTimezone=UTC";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "123456";
    // 获取数据库连接
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USERNAME, PASSWORD);
    }
    // 释放资源
    public static void close(ResultSet rs, Statement stmt, Connection conn) {
        try {
            if (rs != null) rs.close();
            if (stmt != null) stmt.close();
            if (conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
// 用户数据访问对象
class UserDAO {
    // 查询所有用户
    public List<User> findAll() {
        List<User> users = new ArrayList<>();
        String sql = "SELECT * FROM users";
        try (Connection conn = DBUtil.getConnection();
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {
            while (rs.next()) {
                User user = new User(
                    rs.getInt("id"),
                    rs.getString("name"),
                    rs.getString("email"),
                    rs.getInt("age")
                );
                users.add(user);
            }
        } catch (SQLException e) {
            System.out.println("查询用户失败: " + e.getMessage());
        }
        return users;
    }
    // 根据ID查询用户
    public User findById(int id) {
        String sql = "SELECT * FROM users WHERE id = ?";
        User user = null;
        try (Connection conn = DBUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setInt(1, id);
            try (ResultSet rs = pstmt.executeQuery()) {
                if (rs.next()) {
                    user = new User(
                        rs.getInt("id"),
                        rs.getString("name"),
                        rs.getString("email"),
                        rs.getInt("age")
                    );
                }
            }
        } catch (SQLException e) {
            System.out.println("查询用户失败: " + e.getMessage());
        }
        return user;
    }
    // 根据姓名查询用户(模糊查询)
    public List<User> findByName(String name) {
        List<User> users = new ArrayList<>();
        String sql = "SELECT * FROM users WHERE name LIKE ?";
        try (Connection conn = DBUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, "%" + name + "%");
            try (ResultSet rs = pstmt.executeQuery()) {
                while (rs.next()) {
                    User user = new User(
                        rs.getInt("id"),
                        rs.getString("name"),
                        rs.getString("email"),
                        rs.getInt("age")
                    );
                    users.add(user);
                }
            }
        } catch (SQLException e) {
            System.out.println("查询用户失败: " + e.getMessage());
        }
        return users;
    }
}
// 测试类
public class UserQueryDemo {
    public static void main(String[] args) {
        UserDAO userDAO = new UserDAO();
        // 查询所有用户
        System.out.println("=== 所有用户 ===");
        List<User> allUsers = userDAO.findAll();
        allUsers.forEach(System.out::println);
        // 根据ID查询
        System.out.println("\n=== 查询ID为2的用户 ===");
        User user = userDAO.findById(2);
        System.out.println(user);
        // 模糊查询
        System.out.println("\n=== 查询姓名中包含'张'的用户 ===");
        List<User> usersWithName = userDAO.findByName("张");
        usersWithName.forEach(System.out::println);
    }
}

关键要点

1 使用 PreparedStatement 的好处

  • 防止SQL注入:自动转义特殊字符
  • 提高性能:预编译SQL语句,多次执行时效率更高
  • 代码更清晰:参数使用占位符 代替字符串拼接

2 资源管理最佳实践

// 推荐使用 try-with-resources(JDK 7+)
try (Connection conn = DBUtil.getConnection();
     PreparedStatement pstmt = conn.prepareStatement(sql);
     ResultSet rs = pstmt.executeQuery()) {
    // 处理结果集
} // 自动关闭资源

3 常见问题处理

// 处理空值
String email = rs.getString("email");
if (rs.wasNull()) {
    email = "未设置";
}
// 处理日期类型
Date date = rs.getDate("create_time");
if (date != null) {
    System.out.println(date);
}

通过以上案例,你可以掌握Java中数据库查询的基本实现方式,实际开发中,建议使用更高级的ORM框架(如MyBatis、Hibernate)来简化数据库操作,但理解JDBC底层原理仍然是必要的。

抱歉,评论功能暂时关闭!