本文目录导读:

在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底层原理仍然是必要的。