`
louisling
  • 浏览: 141235 次
  • 性别: Icon_minigender_1
  • 来自: ZhuHai
社区版块
存档分类
最新评论

一个 DAO 的实现方法

    博客分类:
  • Java
阅读更多
对 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. 
}
大家来讨论讨论, 看看这种实现方法如何 ?
1
1
分享到:
评论
3 楼 louisling 2008-02-27  
我准备提供一个类似 Criteria 的工具, 这样, 查询语句就不会将数据库表名称, 字段 hardcode 了。
2 楼 louisling 2008-02-27  
呵呵, 我最近实在太忙了, 等过几天, 实现了里面的 OneToMany, ManyToMany, Cach 这些功能, 作个Demo 发到这里来。

1 楼 鹏凌三千 2008-02-25  
咱们的思维比较近似,今天我刚发了个原型实现,准备找人起一做呢。


1.什么是Loonframework

Loonframework由三个子项目构成,分别对应DAO框架实现,WEB框架实现,以及一个2D的GAME框架实现,全部完成后将作为一个快速开发用综合框架而存在;目前三部分都尚处于开发阶段。

2.关于Loonframework-DAO

Loonframework -DAO是loonframework项目下的DAO实现,是一个轻量级、低外部依赖度的实现;为实现小规模项目的快速开发而诞生,目前提供了jdbc数据接口的封装及简单的pojo应用处理能力(但并不是彻底的orm)。loonframework-DAO本身是一个试验性质的项目,内部提供了事务、日志、Cache、异常处理等方面的简单实现,能够不依赖于任何第三方项目而单独运行,当然也可以通过接口选择和其它项目并用,将会陆续提供支持第三方的 template以供调用。

DAO的实现原型今天上班刚发上去,回家后到处找有类似思维的,就找到这里来了~

基本介绍:http://blog.csdn.net/cping1982/archive/2008/02/25/2118613.aspx

相关推荐

    Dao的实现类

    定义一个DAo的接口类,z再建一个IMPL实现类,实现接口类的所有方法

    Java Web实验六 采用 DAO 模式实现对数据库的访问方法, 利用 Servlet 实现 MVC 模式

    Java Web实验六 DAO 和 MVC 模式。采用 DAO 模式实现对数据库的访问方法, 利用 Servlet 实现 MVC 模式

    javaEE DAO具体实现方法源码

    javaee 用DAO实现的一个图书管理,增删查功能都具备,大家可以共同学习、做为期末大作业

    泛型dao 泛型dao 泛型dao

    1)dao类的繁多,很多设计都是一个entity对应一个dao (不同的只有类名和方法名) 2)dao接口需要维护的method庞大。 3)业务逻辑改变时,dao需要同时修改两个类文件(接口和实现类) 在本文中,我将为您展示如何...

    一个很好的通用泛型dao(含源码)

    为什么我们要使用通用DAO接口呢,因为我们的数据库操作无非是增删改查,CRUD操作,我们不需要为每个实体去编写一个dao接口,对于相似的实体操作可以只编写一个通用接口,然后采用不同的实现! DAO已经成为持久层...

    J2EE之DAO设计模式

    在当前情况,可以提供一个抽象的DAO工厂对象(抽象工厂),用他来创建不同类型的具体DAO工厂,每一个工厂都各自支持一种不同的数据持久化储存的实现. 一旦你为某个特定的实现获得了具体的DAO工厂,你则可以用这个工厂来...

    利用Java反射实现万能DAO

    利用Java的反射机制实现的万能DAO工具类,包含对应的测试代码。具体功能包括:单表查询,多...利用万能DAO可以对数据库中任意表进行操作,只需一个DAO类即可完成。阅读本代码需要掌握Java反射机制以及数据库DAO类基础。

    jdbc在DAO层实现事务

    自己写的一个java示例 该示例用jdbc与java事务来实现DAO层的各个DAO的各方法之间的事务关联 使上层可以保证各数据访问的原子性 该示例包含了一个方便调用的数据库访问工具类,该工具类实现了调用SQL语句,调用...

    JavaWeb连接数据库(Dao模式),实现添加book并按日期范围查找相应book信息

    JDBC技术,通过简单的Dao模式封装,连接数据库,实现向数据库中添加book信息,并可以实现按照时间范围来查找book信息。

    mvc中dao层反射实现

    里面包含java之mvc框架中的dao层反射,dao层里面方法的实现采取的都是反射机制,比较灵活

    基于java泛型的通用DAO(CURD)实现

    DAO对象一般都包括CRUD动作,如果在一个应用中,大量的重复定义这些CRUD方法,会占用大量的开发时间及测试时间,那在这一方面,有没有改进的方法呢? 其实,利用Java面向对象的基本特性及JDK5新引入的泛型语法,我们...

    基于JSP+Servlet+JavaBean+JDBC+DAO的Web图书管理架构设计该系统

    基于JSP+Servlet+JavaBean+JDBC+DAO的Web架构设计该系统,进一步了解并掌握如何对数据库进行操作,以及如何分析、设计一个应用系统。 需求要求: 该系统的基本需求是,系统要实现如下的基本管理功能: (1)用户分为...

    DAO技术在数据库访问中的应用与实现

    DAO技术在数据库访问中的应用与实现.caj

    dao自动生成工具 基于ibator 只需要设置少量参数就能 创建dao层所有类

    现在我向大家介绍一个小工具, ibator-huoniao通过它你可以通过配置少量参数,通过一键生成dao层的全部文件,能够应付对dao层的所有操作 产物包括: 1. pojo文件 2. dao接口类 3. dao接口实现类文件 4. ibatis...

    day01_eesy_03mybatis_dao.zip

    我们在实际开发中,都是越简便越好,所以都是采用不屑dao实现类的方式。 不管使用XML还是注解配置 但是Mybatis它是支持写dao实现类的。 6.自定义Mybatis的分析: mybatis在使用代理dao的方式实现增删改查时做...

    MyEclipse自定义模板生成dao

    有些Javaweb框架,自己的dao需要直接继承BaseDao,在这个类中已经实现了各种dao的方法,而原始的MyEclipse 生成dao并不能满足这个需求,需要通过自定义模板

    最新修订:基于java泛型的通用DAO(CURD)实现

    DAO对象一般都包括CRUD动作,如果在一个应用中,大量的重复定义这些CRUD方法,会占用大量的开发时间及测试时间,那在这一方面,有没有改进的方法呢? 其实,利用Java面向对象的基本特性及JDK5新引入的泛型语法,我们...

    使用jdbc在DAO层实现了各DAO之间共享事务的示例

    自己写的一个java示例 该示例用jdbc与java事务来实现DAO层的各个DAO的各方法之间的事务关联 使上层可以保证各数据访问的原子性 该示例包含了一个方便调用的数据库访问工具类,该工具类实现了调用SQL语句,调用...

    非常重要的一张图-分析编写dao实现类Mybatis的执行过程.png

    非常重要的一张图-分析编写dao实现类Mybatis的执行过程,非常详细的介绍了mybatis非代理实现Dao过程,讲解了Mybatis中使用DaoImpl实现持久层Dao的方法。讲解了为什么可以使用Sqlsession.update()方法,删除数据。

    dao掉方法 ssh JAVA

    这是一个java程序片段,其功能是调用方法。实现增、删、改、查

Global site tag (gtag.js) - Google Analytics