通用crud基础类用preparedstatement实现:sql模板化(?占位)、参数动态绑定(object...+types类型显式)、结果集按字段名反射映射(支持驼峰/注解)、事务由调用方控制、资源自动关闭、异常转运行时。

用 PreparedStatement 写通用 CRUD 基础类,核心是把 SQL 模板化、参数动态绑定、结果集自动映射,同时避免 SQL 拼接和类型硬编码。关键不在“全功能”,而在“可复用”和“类型安全”。
统一 SQL 模板 + 占位符管理
每个操作(增删改查)定义固定结构的 SQL 模板,用 ? 占位,不拼字符串。例如:
- 插入:
"INSERT INTO user(name, age, email) VALUES(?, ?, ?)" - 根据 ID 查询:
"SELECT id, name, age, email FROM user WHERE id = ?" - 条件更新:
"UPDATE user SET name = ?, age = ? WHERE id = ?" - 带条件删除:
"DELETE FROM user WHERE id = ?"
模板提前编译,复用 PreparedStatement 实例可提升性能;占位符顺序必须与参数传入顺序严格一致。
参数自动绑定(支持基本类型和 null)
用 Object... 接收参数,遍历设置值,对 null 调用 setNull(index, Types.VARCHAR) 等对应类型。关键点:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 用
java.sql.Types显式指定 null 类型(如Types.INTEGER对应Integer) - 对时间类型(
LocalDateTime)转为Timestamp后设置 - 基础类型包装类(
Integer,String)直接 set;原始类型(int)需先装箱
结果集自动映射到实体类(反射 + 注解)
用字段名(非下标)从 ResultSet 取值,靠注解或命名约定匹配实体属性。推荐轻量方式:
- 实体类字段名与数据库列名一致(如
user_name→userName,需做蛇形转驼峰) - 或加
@Column(name = "user_name")注解,运行时读取 - 用反射调用
setter,按字段类型调用rs.getString()、rs.getInt()、rs.getTimestamp().toLocalDateTime()等 - 对
NULL值,反射设为null(包装类)或跳过(原始类型需默认值)
事务与资源统一管理
基础类不直接管理连接生命周期,但提供模板方法支持外部事务控制:
- 所有方法接受
Connection参数,由调用方决定是否开启事务 - 内部只负责
PreparedStatement和ResultSet的close()(建议 try-with-resources) - 增删改方法返回影响行数(
executeUpdate()),查询方法返回List<t></t>或单个对象 - 异常统一转为运行时异常(如
DataAccessException),不暴露 JDBC 细节
不复杂但容易忽略:SQL 模板要和实体类保持同步;null 处理必须类型明确;列名映射别依赖下标——这些才是通用性落地的关键。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










