连接池与 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