封装数据库操作的关键是隐藏技术细节,只暴露语义化业务接口:私有化连接与SQL逻辑,注入敏感配置,统一处理事务、异常、空值与资源释放,返回脱敏不可变DTO。

在类设计中通过封装隐藏底层数据库操作细节,关键是让调用方完全感知不到 SQL、连接管理、事务控制、异常转换等技术实现——只关心“做什么”,不操心“怎么做”。
把数据库字段和连接对象设为 private
实体类或数据访问类中,所有与数据库强相关的成员都应私有化:
- 数据库连接(Connection)、语句对象(PreparedStatement)不能暴露为 public 字段或返回原始引用
- 表名、列名、SQL 拼接逻辑不写在业务方法里,而是收进私有辅助方法(如 private String buildSelectSql())
- 敏感配置(如 JDBC URL、密码)不硬编码,也不通过 getter 暴露,而由工厂或构造器注入后即封存
提供语义化的业务方法,不暴露技术动词
对外接口应表达业务意图,而不是数据库动作:
- 用 saveUser(User user) 替代 insertIntoUsersTable(User user)
- 用 findActiveOrdersByCustomerId(String id) 替代 executeQuery("SELECT ... WHERE status='ACTIVE'")
- 方法内部可自由切换实现:JDBC → MyBatis → JPA → Redis 缓存 → 远程 HTTP 调用,只要返回结果结构一致,调用方无需改动
在访问方法中统一处理数据库共性逻辑
所有数据库交互必须经过受控入口,把横切关注点内聚封装:
立即学习“Java免费学习笔记(深入)”;
- 自动事务管理:在 save/update 方法内开启、提交或回滚,不依赖外部 try-catch
- 异常翻译:把 SQLException 转为业务异常(如 DataAccessException 或 UserNotFoundExc),不向上传播驱动特有错误
- 空值与边界防护:查询无结果时返回 Optional.empty() 或抛定制异常,而非 null;插入前校验必填字段,不等数据库报错才拦截
- 资源自动释放:用 try-with-resources 封装 Connection/Statement,确保连接不泄露
返回不可变或脱敏的数据视图
避免把数据库映射对象直接返给上层,防止状态被意外篡改或敏感信息外泄:
- 不返回原始 Entity 对象,而返回 DTO(如 UserSummary),只含必要字段
- 对密码、身份证号等字段,在 getter 中做脱敏(如 getPhone() 返回 "138****1234")
- 若需返回集合,用 Collections.unmodifiableList() 包装,禁止外部修改缓存数据
- 时间字段返回 LocalDateTime 或格式化字符串,不暴露 java.sql.Timestamp 原始类型


















