`
louisling
  • 浏览: 143139 次
  • 性别: 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

相关推荐

    javaEE DAO具体实现方法源码

    首先,定义一个`BookDAO`接口,包含增删查改的基本方法,如`addBook()`, `deleteBook()`, `getBookById()`, `updateBook()`等。接口定义了业务所需的公共操作,而具体的实现则在单独的类中完成,例如`BookDAOImpl`。...

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

    在实验中,你需要创建一个具体的DAO实现类,该类将包含连接数据库、执行SQL语句、处理结果集等方法。例如,你可以为用户表创建一个UserDAO,包含增删改查等操作。 其次,MVC模式是一种将模型、视图和控制器分离开来...

    Dao的实现类

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

    自己用的DAO实现类

    在本压缩包中,只有一个名为"dao"的文件,可能是包含了一个或多个DAO实现类的Java源代码文件。这些类通常会对应数据库中的表,每个类负责一个特定的数据操作,如增删改查。下面将详细介绍DAO实现类可能涉及的一些...

    让java网站开发从此简单起来[一个项目只用一个Servlet和一个Dao类]demo

    Java网站开发通常涉及多个组件,如...对于初学者来说,这是一个很好的学习实例,展示了如何在简化的环境中实现基本的Web功能。而对于有经验的开发者,这可能是一个有趣的挑战,了解如何在限制条件下优化和组织代码。

    一个的DAO数据访问层的实现

    在这个“一个的DAO数据访问层的实现”中,我们可以探讨DAO模式的核心概念、实现方法以及它在实际项目中的应用。 首先,DAO模式的基本思想是创建一个专门负责与数据库进行交互的接口或类,即DAO接口或DAO实现类。这...

    JdbcTemplate通用泛型Dao实现

    在Java的Spring框架中,`JdbcTemplate`是一个非常重要的组件,它为数据库操作提供了模板方法,简化了数据库访问。本文将深入探讨`JdbcTemplate`通用泛型Dao实现的相关知识点,帮助开发者更好地理解和应用这一技术。 ...

    Struts + DAO实现基本分页

    2. **复用**:一个通用的DAO接口可以用于不同的分页查询,只需要改变查询条件即可。 3. **测试**:DAO接口易于单元测试,可以独立于业务逻辑进行测试。 **注意事项:** 1. **性能优化**:对于大数据量的分页,应...

    使用DAO模式实现宠物数据更新

    DAO(Data Access Object)模式是一种常见...同时,如果需要更换数据库或调整数据库操作方式,只需要修改DAO实现类,不会影响到其他层的代码,降低了维护成本。此外,该模式还有利于多线程环境下的并发控制和事务管理。

    泛型dao 泛型dao 泛型dao

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

    一个DAO通用模型

    // 实现方法... } ``` - 客户端代码: ```java @Service public class UserService { private UserRepository userRepository; public UserService(UserRepository userRepository) { this....

    在VB中用DAO实现数据库编程.rar

    在这个"在VB中用DAO实现数据库编程"的压缩包中,我们可以学习如何利用DAO在VB环境中进行数据库操作。 首先,DAO提供了几个核心对象,包括Database、Recordset、TableDef、Field等,它们各自扮演着不同的角色: 1. ...

    C#特性标签实现通用Dao层

    为了实现这个接口,我们可以为每个方法创建一个模板方法,使用反射来获取属性信息,并结合前面生成的SQL来执行数据库操作。这样,我们就无需为每个实体类编写单独的Dao,而是使用泛型Dao实例即可处理所有带有`...

    MVC+DAO实现留言系统

    在" MVC+DAO实现留言系统 "这个项目中,我们将深入探讨这两种模式的应用。 **MVC模式** MVC模式是一种将应用程序分为三个主要组件的架构模式,以实现业务逻辑和用户界面的分离。 1. **模型(Model)**:负责管理...

    一个dao模式的实验报告

    - 创建了DAO实现类`EmpDAOImpl.java`,实现了接口中定义的方法,主要负责执行SQL查询。 - 实现了DAO代理类`EmpDAOProxy.java`,用于处理更复杂的业务逻辑,如用户ID和密码的验证。 - 定义了工厂类`DAOFactory....

    java ssh通用DAO另类实现示例

    本示例将探讨一个通用DAO的另类实现方法,旨在提高代码复用性和简化开发过程。 首先,理解SSH框架中的DAO设计模式至关重要。DAO是一种设计模式,它为应用程序提供了一种抽象的接口,以便与数据库进行交互,同时避免...

    基于泛型的通用Dao接口和hibernate的实现

    Hibernate 是一个流行的持久层框架,可以与泛型Dao接口集成,实现数据访问的持久化。 Hibernate 对泛型Dao接口的实现主要通过继承泛型Dao接口,使用 Hibernate 的 Session 对象来实现数据访问。 Hibernate 对泛型...

    自定义Dao,反射实现

    自定义Dao时,我们通常会为每个数据表创建一个对应的DAO类,这个类包含了增删查改(CRUD)操作的方法。这些方法可能包括`insert()`, `delete()`, `update()` 和 `query()` 等。例如,对于一个名为`User`的实体类,...

    java 基于泛型与反射的通用 DAO

    本文将深入探讨如何结合这两种技术实现一个通用的DAO(Data Access Object)设计模式。 首先,我们来看“泛型”。泛型是Java 5引入的新特性,它允许在类、接口和方法中使用类型参数,从而提高了代码的类型安全性和...

    一个简单的DAO例子

    在提供的文件中,`MyDAO.docx`可能是一个文档,详细解释了DAO类的设计和实现过程,包括可能的类结构、方法定义和示例代码。而`MyDAO`可能是实现DAO接口的Java源代码文件,它包含了具体的数据库操作逻辑。 在实际...

Global site tag (gtag.js) - Google Analytics