Java JDBC 数据库增删改查工具类(含多库分页支持)
在Java开发中,频繁编写JDBC代码容易带来样板代码冗余问题。该工具类封装了连接管理、参数绑定及结果集映射功能,通过正则表达式从SQL语句中提取列名以适配实体类属性,并针对不同数据库实现了差异化的分页SQL拼接逻辑,有效提升了DAO层的开发效率。
核心功能与特性
本工具类 DBUtil 主要解决以下痛点:
- 防SQL注入:所有执行方法均强制使用
PreparedStatement进行参数绑定。 - 自动类型映射:通过反射将
ResultSet中的数据自动填充至Java Bean对象中,支持自定义字段映射注解。 - 多库兼容:根据当前连接的Driver类型,自动追加相应的分页语法(MySQL使用
LIMIT,Oracle使用ROWNUM,PostgreSQL使用OFFSET/LIMIT)。
准备条件
在使用前,请确保项目环境中已包含对应的数据库驱动依赖。代码默认配置了 PostgreSQL 的连接信息,实际使用时需替换为对应数据库的配置。
private static String url = "jdbc:postgresql://192.168.56.101/db";
private static String user = "test";
private static String password = "12345678";
若需切换至其他数据库,请修改 static 块中的 Class.forName() 参数及上述连接常量。
真实操作顺序
第1步:执行插入操作 (Insert)
目的:向数据库表中添加新记录。
入口:调用 insert(String sql, Object... param) 或 insert(String sql, T t)。
动作说明:
- 建立数据库连接
getConnection()。 - 创建预编译语句
conn.prepareStatement(sql)。 - 若传入实体对象
t,则调用getColumnsFromInsert解析SQL列名,并通过反射获取实体属性值绑定参数。 - 若直接传入可变参数
param,则按顺序绑定。 - 执行
executeUpdate()并返回影响行数。
第2步:执行更新操作 (Update)
目的:修改数据库表中的现有记录。
入口:调用 update(String sql, Object... param)。
动作说明:
- 复用连接管理机制。
- 若传入实体对象,调用
getColumnsFromUpdate提取 SET 和 WHERE 子句中的字段名,并绑定实体对应属性值。 - 执行
executeUpdate()。
第3步:执行查询操作 (Query)
目的:获取单条或多条数据记录并转换为对象列表。
入口:querySingular(查单个)、queryPlural(查列表)或 queryPluralForPagging(分页查)。
动作说明:
- 对于分页查询,内部调用
addPagingSQL根据Driver类型拼接 LIMIT/OFFSET 或 ROWNUM 逻辑。 - 构建
PreparedStatement并绑定参数。 - 遍历
ResultSet,利用instance()方法通过反射将每行数据映射为目标 Class<T>的对象。 - 注意:映射时优先匹配实体类中与SQL列名一致的字段名;若不一致,可结合自定义的
@Column注解进行匹配。
第4步:统计数据量
目的:快速获取符合查询条件的总记录数,无需加载全量数据。
入口:queryDataCount(String sql, Object... param)。
动作说明:
- 内部调用
addCountSQL将原SQL包裹在SELECT COUNT(*) as dataCount FROM ( ... ) a结构中。 - 执行查询并返回
dataCount字段的整数值。
完成判断与排错
完成状态:方法成功返回整数影响行数、对象实例或 List 集合,且 finally 块正确关闭了 Statement、ResultSet 和 Connection,未发生资源泄露。
常见排错:
- 列名不匹配:若实体类字段名与数据库列名不一致导致结果为null,请检查是否使用了
@Column(name="db_column")注解,或确认SQL查询出的别名是否正确。 - 驱动加载失败:报错
NoClassDefFoundError或ClassNotFoundException时,请检查maven/gradle依赖是否引入完整,并核对Class.forName()中的驱动类名是否与当前使用的数据库版本一致(如 MySQL 新版驱动可能是com.mysql.cj.jdbc.Driver)。 - 分页异常:Oracle 分页逻辑依赖于子查询别名,若原始 SQL 结构复杂导致正则解析列名失败,可能需要手动调整
addPagingSQL中的正则表达式。
总结
以上就是基于JDBC实现Java数据库增删改查及分页功能的详细内容。该工具类通过封装底层的驱动管理和反射映射,简化了持久层开发的复杂度,适用于快速原型开发或非重型ORM场景。更多关于Java数据库优化的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









