Java JDBC泛型查询工具类核心是用PreparedStatement防SQL注入、反射自动映射字段、try-with-resources自动释放资源,并提取mapToEntity复用单/多对象映射逻辑。

Java 中用 JDBC 封装泛型查询工具类,核心是把 SQL 执行、结果集映射、资源释放这些重复逻辑抽离出来,同时支持任意实体类自动映射。关键不在于写得多炫酷,而在于安全、简洁、可维护——避免手写 ResultSet 处理,杜绝 SQL 注入,统一管理连接和异常。
用 PreparedStatement + 反射实现通用单对象查询
这是最常用也最稳妥的起点。不依赖第三方框架,纯 JDBC + Java 反射即可完成字段自动映射:
- SQL 使用 ? 占位符,通过 PreparedStatement 预编译,天然防注入
- 查询后用 ResultSetMetaData 获取列名,再通过反射匹配实体类的 setter 方法(忽略大小写或按命名规范如 user_name → setUserName)
- 对常见类型(String/Integer/Long/Date/Boolean 等)做兼容转换,null 值也能正确设为 null 而非报错
- 封装成静态方法,例如:T queryOne(String sql, Class<T> clazz, Object... params)
批量查询与列表映射复用同一套映射逻辑
单对象和多对象查询只差一层循环,没必要重复写映射代码:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 把“单行 ResultSet → 对象”的逻辑提取为私有方法 mapToEntity(ResultSet rs, Class<T> clazz)
- queryList 直接遍历 ResultSet,每行调一次 mapToEntity,add 进 ArrayList 返回
- 支持泛型通配,比如 List<User> users = queryList(sql, User.class, status);
- 注意:不要在循环里反复获取 ResultSetMetaData,它开销较大,提前提取一次复用即可
用 try-with-resources 确保连接、语句、结果集自动关闭
JDBC 资源泄漏是老问题,Java 7+ 的 try-with-resources 是最干净的解法:
立即学习“Java免费学习笔记(深入)”;
- Connection、PreparedStatement、ResultSet 都实现了 AutoCloseable,可直接放进 try() 括号里
- 即使发生 SQLException 或 RuntimeException,三者也会按声明逆序自动 close()
- 不必手动写 finally 块,也不用判空,代码更短更可靠
- 示例:try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) { ... }
支持简单条件拼接(非动态 SQL 引擎)
完全手拼 SQL 容易出错,但又不想引入 MyBatis;可以加一个轻量级条件构造器:
- 用 StringBuilder 拼 WHERE 子句,每加一个条件就 append " AND ",开头用 " WHERE 1=1 "
- 参数统一收集进 List<Object>,最后转成 Object[] 传给 query 方法
- 只处理等值查询、IN、范围(>= /
- 重点:所有用户输入必须走 ? 占位符,绝不字符串拼接字段值

















