一个 DAO 的实现方法

对 ORM 的讨论永远都没有结束...
每个人都有不同的思路, 不同的实现.

之所以引入ORM, 我认为是:
1) 减少复杂度, 抽象出了公共的持久层.
比如把一个对象保存到数据库. 传统的 JDBC 方法, 需要insert into ...语句.
事实上, 生成这些 CRUD 的 Sql 的过程是重复的. 因此 ORM 给我们做了这些重复的工作.

2) 解决了多个数据库的差异问题, 一旦移植到其他数据库, 转换非常方便.
不过, 如果是做企业应用, 一般不会经常换数据库, 除非是做通用的产品.

3) ORM 还提供了一些辅助的功能, 比如缓存, 事务, 分页...

相比 JDBC, 我觉得 ORM 最方便的地方不用去写那些重复的 CRUD 的sql语句.
其实, 最麻烦的还是 insert into ... 和 update ...2个. 还有就是查询到的记录封装到一个Java Bean 里面去.
对于 delete, search...应该都不算麻烦的.

基于这种想法, 我觉得可以尝试这样来做 DAO 层:
1) 封装 Spring 的 SimpleJdbcTemplate, 来做持久层的工作.
2) 用Spring里面的 ParameterizedRowMapper 来将查询到的记录转换为 Java Bean.
3) 利用 Jdk5 的 Annotation 和 Generic 特性, 在 Java Bean 里面标注属性名称对应余数据库表里面的字段名称.
在以及在生成 sql 语句时的匹配方式,比如 like %abc, like %abc%, like abc%, =, <, >...
通过这个Annotation, 把那些 生成 CRUID 的过程独立出来


另外, 很多人认为 Java Bean 里面的 get, set 方法很枯燥, 多余.
如果把 字段类型修改为 public 的会怎样?
在面向对象的编程里面, 好像有一种共识, 数据字段定义为 private 的, 访问字段一定要用 get 方法, 修改字段一定要用 set 方法.

如果对于这些 POJO 的数据字段, 我觉得用 public 类型好像也没有什么不好, 除非你要将 一个 Date 类型的字段, 在显示的时候, 要进行
格式转换, 我觉得可以一些 get 方法, 或者在其他地方来做.

最终的 DAO 会是这样:

基本的 DAO 接口:
public interface BaseDao<T extends AbstractEntity> {
T add(T entity);
T delete(T entity);
T update(T entity);

//对于基本的查询, 所有的查询关键字, 应该都是 这个对象本身的一个属性字段,所以, 用这个对象来作为参数,
//如果某个属性字段非空, 就取其值作为查询参数. 并且, BaseDaoImpl 可以根据这个条件对象, 创建结果对象.
//将ResultSet 里面的记录转换为相应的字段
//复杂的查询就另外写fetch 方法了. 在相应的 DAO 里面定义, findByXXX...
List<T> fetch(T criteria, long startRow, long endRow);
}


基本的 DAO 实现, 包括 CRUD, 事务, 分页.
public class BaseDaoImpl<T extends AbstractEntity> extends AbstractDao implements BaseDao<T> {
//1) 实现基本的 CRUD 方法.
//2) 提供方法将查询出来的 ResultSet 转换为 JavaBean, 对于 属性-字段 的对应关系, 定义在 JavaBean 里面
//3) 提供一个 findBySql(String sql) 方法.
//4) 提供一个 executeSql(String sql) 方法.
//5) 提供事务处理能力, 借助 Spring 提供的事务处理能力, 任何子类都可以调用父类的事务处理代码

}

1) 定义 Java Bean
//name: table name
//pk: primary key
@Table(name = Role.TABLE_NAME, pk = Role.ROLE_ID)
@OrderBy(Role.ROLE_NAME)
public class Role extends AbstractEntity {
private static final long serialVersionUID = 4895370359568588708L;

// Defines database fields
public static final String ROLE_ID = "role_id";
public static final String ROLE_NAME = "role_name";
public static final String DESCRIPTION = "description";

// Table name
public static final String TABLE_NAME = "role";

// Fields, 在查询的时候, sql 语句使用 like 来匹配这个字段, 也可以定义为其他的, 比如 =, <, >...
@Column(name = ROLE_NAME, mode=MatchMode.LIKE)
public String roleName;

@Column(name = DESCRIPTION)
public String description;

@One-To-Many(name=...)
public List<User> members;
}

2) 定义 DAO 接口
public interface RoleDao extends BaseDao<Role> {
}

3) 实现 DAO
public class RoleDaoImpl extends BaseDaoImpl<Role> implements RoleDao { 
//对于基本的 CRUD, 不用写代码, BaseDaoImpl 实现了基本的 CRUD.
}
大家来讨论讨论, 看看这种实现方法如何 ?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值