Z
ZHANK
编程在线教程Java 教程连接池与 DAO 模式
JDBC 与数据库

连接池与 DAO 模式

配置 HikariCP 连接池、设计 DAO 数据访问层

连接池与 DAO 模式

连接池复用数据库连接,DAO 分离数据访问逻辑。

学完本章你将: 配置 HikariCP、设计 DAO 层。


HikariCP 连接池

xml
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>5.1.0</version>
</dependency>
java
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
config.setUsername("root");
config.setPassword("123456");
config.setMaximumPoolSize(10);
config.setMinimumIdle(2);

HikariDataSource dataSource = new HikariDataSource(config);

// 从连接池获取连接
try (Connection conn = dataSource.getConnection()) {
    // 使用连接...
}
// 连接自动归还池中(不是真正关闭)

DAO 模式

java
// 实体类
public class User {
    private int id;
    private String name;
    private int age;
    // getter/setter...
}

// DAO 接口
public interface UserDao {
    List<User> findAll();
    Optional<User> findById(int id);
    void save(User user);
    void update(User user);
    void delete(int id);
}

// DAO 实现
public class UserDaoImpl implements UserDao {
    private final DataSource dataSource;

    public UserDaoImpl(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Override
    public Optional<User> findById(int id) {
        String sql = "SELECT * FROM users WHERE id = ?";
        try (Connection conn = dataSource.getConnection();
             PreparedStatement stmt = conn.prepareStatement(sql)) {
            stmt.setInt(1, id);
            ResultSet rs = stmt.executeQuery();
            if (rs.next()) {
                return Optional.of(mapUser(rs));
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return Optional.empty();
    }

    private User mapUser(ResultSet rs) throws SQLException {
        User u = new User();
        u.setId(rs.getInt("id"));
        u.setName(rs.getString("name"));
        u.setAge(rs.getInt("age"));
        return u;
    }
}

三层架构

Controller(接收请求 → 返回响应)
    ↓
Service(业务逻辑)
    ↓
DAO(数据访问)
    ↓
Database