
文章目录
-
- 前言
- 🌍 一.连接池
-
- ❄️1. 传统获取Conntion问题分析
- ❄️2. 数据库连接池
- ❄️3.连接池之C3P0技术
-
- 🍁3.1关键特性
- 🍁3.2配置选项
- 🍁3.3使用示例
- ❄️4. 连接池之Druid技术
-
- 🍁 4.1主要特性
- 🍁 4.2 配置选项
- 🍁 4.3 使用示例
- 🌍 二.Apache-DBUtil
-
-
- ❄️1. 关键特性
- ❄️2. 主要类和方法
- ❄️3. 使用示例
-
- 🌍 三.BasicDAO
-
- ❄️1. 引入
- ❄️2. `BasicDAO` 类通常包含以下功能:
- ❄️3. 以下是如何使用 `BasicDAO` 的示例:
🙋♂️ 作者:@whisperrr.🙋♂️ 👀 专栏:JDBC 👀 🎉 其他专栏:零基础学Mysql 🎉 💥 标题:探索JDBC:Java数据库连接的艺术与魅力💥 ❣️ 寄语:比较是偷走幸福的小偷❣️
前言
在当今信息时代的浪潮中,数据库作为信息存储和处理的核心,其重要性不言而喻。作为一名普通的软件开发者,我在数据库连接与操作的道路上摸索前行,积累了一些实践经验。在此,与大家分享关于数据库连接池、Apache-DBUtils和BasicDAO这三个技术的一些心得和体会。本文旨在抛砖引玉,希望能够为同行们在优化数据库操作、提高系统性能的征途上提供一点参考和帮助。让我们一起学习,共同进步。
🌍 一.连接池
在学习一个新技术的时候,我们先来看看传统的方式有哪些问题,新技术又能解决什么样的问题,通过什么方式解决问题.
❄️1. 传统获取Conntion问题分析
感情的自然流露,我们引出数据库连接池。
❄️2. 数据库连接池
数据库连接池(Database Connection Pool)是一种用于提高数据库操作性能和资源管理效率的技术。可以很好的解决上面的传统方式带来的问题.
2.1 数据库连接池的基本原理如下:
2.2 数据库连接池的优点包括:
- 提高性能: 通过复用连接减少建立和关闭连接的次数,显著提高系统性能。
- 资源利用: 有效管理数据库连接,避免连接泄漏,节省系统资源。
- 响应速度: 减少等待建立连接的时间,提高系统的响应速度。
- 可配置性: 可以根据系统负载动态调整连接池的大小,适应不同的应用场景。
2.3 数据库连接池的技术包括:JDBC的数据库连接池使用javax.sql.DataSource来表示,DataSource只是一个接口,该接口通常由第三方提供实现[提供.jar]
- C3PO数据库连接池,速度相对较慢,稳定性不错(hibernate,spring)
- DBCP数据库连接池,速度相对c3p0较快,但不稳定
- Proxool数据库连接池,有监控连接池状态的功能,稳定性较c3p0差一点
- BoneCP数据库连接池,速度快
- Druid(德鲁伊)是阿里提供的数据库连接池,集DBCP、C3PO、Proxool优点于一身的数据库连接池
❄️3.连接池之C3P0技术
c3p0 是一个 Java 编程语言中的数据库连接池库,它实现了数据源和 JNDI 适配器,用于提高数据库操作的效率和性能。c3p0 旨在提供一个高效、可靠的解决方案,用于管理数据库连接,减少创建和销毁连接的开销。 以下是 c3p0 的一些关键特性和配置选项:
🍁3.1关键特性
🍁3.2配置选项
以下是一些常用的 c3p0 配置参数:
- initialPoolSize: 初始化时创建的连接数。
- maxPoolSize: 连接池中保留的最大连接数。
- minPoolSize: 连接池中保留的最小连接数。
- maxIdleTime: 连接的最大空闲时间,超过这个时间未使用的连接将被关闭。
- acquireIncrement: 当连接池中的连接耗尽时,一次性创建的连接数。
- idleConnectionTestPeriod: 空闲连接测试周期,用于验证空闲连接是否仍然有效。
- checkoutTimeout: 当没有可用连接时,从连接池中获取连接的最大等待时间。
- maxStatements: 缓存的最大 SQL 语句数。
- maxStatementsPerConnection: 每个连接可以缓存的最大 SQL 语句数。
🍁3.3使用示例
以下是一个简单的 c3p0 配置和使用示例:
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class C3P0Example {
private static DataSource dataSource;
static {
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
cpds.setUser("username");
cpds.setPassword("password");
cpds.setInitialPoolSize(5);
cpds.setMaxPoolSize(20);
// 其他配置…
dataSource = cpds;
}
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
public static void main(String[] args) {
try (Connection conn = getConnection()) {
// 使用连接进行数据库操作
} catch (SQLException e) {
e.printStackTrace();
}
}
}
在使用 c3p0 时,建议仔细阅读官方文档,并根据实际应用场景调整配置参数,以达到最佳性能。随着技术的发展,新的连接池技术(如 HikariCP)提供了更好的性能和更简单的配置,因此在选择连接池时,可以考虑比较不同库的性能和特性。
❄️4. 连接池之Druid技术
Druid 是一个用于数据库连接池和SQL监控的Java开源库,由阿里巴巴开源。它不仅提供了数据库连接池的功能,还包含了许多其他特性,如数据库加密、SQL执行日志、PSCache、慢SQL记录、SQL注入攻击防护等。Druid 广泛应用于各种需要数据库操作的Java应用程序中,特别是在大数据和高并发的场景下。 以下是 Druid 的一些主要特性和优势:
🍁 4.1主要特性
🍁 4.2 配置选项
Druid 的配置选项非常丰富,以下是一些常用的配置参数:
- initialSize: 初始化时建立物理连接的个数。
- minIdle: 最小连接池数量。
- maxActive: 最大连接池数量。
- maxWait: 获取连接时最大等待时间,单位毫秒。
- timeBetweenEvictionRunsMillis: 间隔多久进行一次检测,检测需要关闭的空闲连接。
- minEvictableIdleTimeMillis: 连接在池中最小生存的时间。
- validationQuery: 用来检测连接是否有效的SQL语句。
- testWhileIdle: 建议配置为true,不影响性能,并且保证安全性。
- estOnBorrow: 申请连接时执行validationQuery检测连接是否有效。
- testOnReturn: 归还连接时执行validationQuery检测连接是否有效。
🍁 4.3 使用示例
以下是一个简单的 Druid 配置和使用示例:
import com.alibaba.druid.pool.DruidDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class DruidExample {
private static DataSource dataSource;
static {
DruidDataSource dds = new DruidDataSource();
dds.setUrl("jdbc:mysql://localhost:3306/mydb");
dds.setUsername("username");
dds.setPassword("password");
dds.setInitialSize(5);
dds.setMinIdle(5);
dds.setMaxActive(20);
// 其他配置…
dataSource = dds;
}
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
public static void main(String[] args) {
try (Connection conn = getConnection()) {
// 使用连接进行数据库操作
} catch (SQLException e) {
e.printStackTrace();
}
}
}
在使用 Druid 时,可以通过其提供的监控界面来查看数据库连接池的状态、SQL执行情况等,这对于诊断和优化数据库性能非常有帮助。Druid 的监控功能是其一大亮点,使得它在众多数据库连接池技术中脱颖而出。
🌍 二.Apache-DBUtil
Apache DBUtils 是 Apache 软件基金会下的一个开源 Java 库,它提供了一套简单的 JDBC helper 类,用于简化数据库操作。DBUtils 主要包含两个核心类:QueryRunner 和 ResultSetHandler。这些类可以帮助开发者执行 SQL 查询和更新,并且处理查询结果,而无需编写大量的样板代码。
为什么学习这个技术: 1.关闭connection后,resultSet结果集无法使用 2.resultSet不利于数据的管理 3.示意图

以下是 Apache DBUtils 的一些关键特性和用法:
❄️1. 关键特性
❄️2. 主要类和方法
- QueryRunner: 用于执行 SQL 查询和更新操作。
- query(String sql, ResultSetHandler rsh, Object… params):执行查询操作。
- update(String sql, Object… params):执行更新操作(INSERT、UPDATE、DELETE)。
- ResultSetHandler: 接口,用于处理 ResultSet 对象。
- ArrayHandler:将结果集的第一行数据转换为对象数组。
- BeanHandler:将结果集的第一行数据转换为指定的 JavaBean 对象。
- BeanListHandler:将结果集的所有行转换为指定 JavaBean 对象的列表。
- ScalarHandler:用于处理单个值的结果,例如 COUNT、MAX、MIN 等。
❄️3. 使用示例
以下是一个使用 Apache DBUtils 的简单示例:
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
public class DBUtilsExample {
public static void main(String[] args) {
QueryRunner runner = new QueryRunner();
Connection conn = null;
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password");
List<User> users = runner.query(conn, "SELECT * FROM users", new BeanListHandler<>(User.class));
users.forEach(user -> System.out.println(user.getUsername()));
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
class User {
private int id;
private String username;
// getters and setters
}
在这个例子中,我们使用 QueryRunner 来执行一个查询,并将结果集转换为 User 对象的列表。我们使用了 BeanListHandler 来处理结果集。 Apache DBUtils 是一个轻量级的库,非常适合于简单的数据库操作,特别是当你不想引入更复杂的 ORM 框架时。然而,对于更复杂的数据库操作和业务逻辑,可能需要考虑使用更全面的 ORM 框架,如 Hibernate 或 MyBatis。
🌍 三.BasicDAO
❄️1. 引入
apache-dbutils+Druid简化了JDBC开发,但还有不足: 1.SQL语句是固定,不能通过参数传入,通用性不好,需要进行改进,更方便执行增删改查 2.对于select操作,如果有返回值,返回类型不能固定,需要使用泛型 3.将来的表很多,业务需求复杂,不可能只靠一个Java类完成 4.引出=》BasicDAO画出示意图,看看在实际开发中,应该如何处理 

BasicDAO 是一个通用的数据访问对象(DAO)抽象层的实现,它通常用于简化数据库操作。在Java中,DAO层的主要目的是将数据库操作代码与业务逻辑代码分离,使得业务逻辑更加清晰,同时也便于数据库迁移和维护。
❄️2. BasicDAO 类通常包含以下功能:
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
public abstract class BasicDAO<T> {
private QueryRunner queryRunner = new QueryRunner();
private Class<T> type;
public BasicDAO(Class<T> type) {
this.type = type;
}
protected Connection getConnection() throws SQLException {
// 这里应该根据实际情况来获取数据库连接
// 例如,从数据源(DataSource)获取连接
return DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password");
}
public T queryForObject(String sql, Object... params) throws SQLException {
try (Connection conn = getConnection()) {
return queryRunner.query(conn, sql, new BeanHandler<>(type), params);
}
}
public List<T> queryForList(String sql, Object... params) throws SQLException {
try (Connection conn = getConnection()) {
return queryRunner.query(conn, sql, new BeanListHandler<>(type), params);
}
}
public <V> V queryForScalar(String sql, Object... params) throws SQLException {
try (Connection conn = getConnection()) {
return queryRunner.query(conn, sql, new ScalarHandler<V>(), params);
}
}
public int update(String sql, Object... params) throws SQLException {
try (Connection conn = getConnection()) {
return queryRunner.update(conn, sql, params);
}
}
}
在这个 BasicDAO 类中,我们定义了几个方法来执行常见的数据库操作。这个类是泛型的,可以用于任何类型的实体类。使用时,你需要为你的实体类创建一个继承自 BasicDAO 的具体实现。
❄️3. 以下是如何使用 BasicDAO 的示例:
public class UserDao extends BasicDAO<User> {
public UserDao() {
super(User.class);
}
// 这里可以添加特定于User的数据库操作方法
}
// 使用UserDao
UserDao userDao = new UserDao();
User user = userDao.queryForObject("SELECT * FROM users WHERE id = ?", 1);
List<User> users = userDao.queryForList("SELECT * FROM users");
int updatedRows = userDao.update("UPDATE users SET username = ? WHERE id = ?", "newUsername", 1);
在这个例子中,UserDao 继承自 BasicDAO 并指定了实体类 User。然后,你可以使用 UserDao 来执行针对 User 表的数据库操作。 请注意,这个 BasicDAO 示例是一个简化版本,实际应用中可能需要更多的功能和错误处理。此外,直接使用 JDBC 和 DBUtils 可能不是最佳实践,特别是在大型或复杂的项目中,通常会使用更高级的框架如 Hibernate、MyBatis 或 Spring Data JPA 来处理数据访问层。




