`

简化DAO设计的思想

阅读更多

当应用中需要使用到上十张表时,DAO的维护变得日益困难,主要表现在这几个方面:
1)dao类的繁多,很多设计都是一个entity对应一个dao
2)dao接口需要维护的method庞大。
3)业务逻辑改变时,dao需要同时修改两个类文件(接口和实现类)

出于上述问题,有必要从新设计dao包。要求
1)减少dao类的数目,dao包暴露的接口稳定且易于扩展新的查询。
2)减少dao接口的method
3)可以动态增加dao提供的数据访问逻辑,比如增加相应的查询实现等等

我的分析:
可以使用Criteria,NamedQuery来构造复杂的查询逻辑。
对于改动最多的read/find逻辑,可以作一个抽象设计,以提供动态增加的同时提供稳定的接口。
对于update,create,delete逻辑,dao的设计遵循原子操作的原则,不在这些接口中实现复杂的业务逻辑。总体来说,这些接口的改动很少,也很容易规范。

下面是一些设计的类代码:
[code="java"]
public interface QueryObject{
public void setNamedQuery(String qstring);
public Object query(Session session,Set parameterCollection);
public QueryCfg getQueryCfg();
public boolean validate(QuryCfg cfg,Set params) ;
public void setValidatable(boolean bool);
public booelan getValidatable();
}

public interface QueryCfg{
public List getParameterCfgs();
public String getName();
public void setName(String name);
}


public interface Parameter{
public ParameterCfg getParameterCfg();
public String getValue();

}

public interface ParameterCfg{
public int getOrder();
public void setOrder(int order);
public String getName();
public void setName(String name);
public Type getType();
public void setType();

}

public interface Type{
public static final String PRIMITIVE_TYPE="primitive";
public boolean isPrimitive();
public Class getObjectType();
public String getValue(Object o);
}



[/code]
上面这些基本接口便是组成我的dao包的设计基架。虽然与普通dao实现比较起来,这个设计多了许多复杂度,在项目初期也需要一定工作量来编码实现这些构架,但是当在项目进展到中后期时,这个设计已经显露了它优良的设计风格,它与普通DAO的设计相比较,有如下优点:
1)DAO的设计将会更加简洁,用一个DAO接口就可以实现所有entity的dao操作,可以动态扩展复杂查询。DAO设计:
[code="java"]public interface DAO{
// find 可以根据
public Object find(String namedQuery,Set parameters);
public Object createEntity(Object entity);
public Object updateEntity(Object entity);
public void removeEntity(Object entity);
}

//具体的实现可以整合到优秀的容器里面。比如spring
publi class DAOImpl{
//....
public Object find(String name,Set ps){
return (Object)getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
return QueryLocator.getQueryObject(name).query(session,ps);
});

}
}
//其中QueryLocator的实现可以用Spring,PicoContainer等等。
[/code]

2)业务逻辑层依赖于一个较稳定的DAO接口,使得可以更独立更快速的进行开发。
在业务逻辑层,他们可以这样写代码:

[code="java"]public class YourBusiness{
public void doBusiness(){
Set parameters=new LinkedHashSet();
parameters.add("firstName","test");
parameters.add(2,"test2");
List users=(List)getDao.find("findUserWithFullName",parameters);

}
}[/code]
这里的代码依赖于一个稳定的DAO接口,而不需要先实现DAO修改,再回来做相应的业务实现。
3)可以支持参数检查,因为dao包的设计中加入了诸如ParameterCfg,QueryCfg等配置类,通过扩展这些抽象配置类实现我们定义的查询的配置,可以有效地帮助我们检查客户端的非法查询。
4)工作量统计。可以计算一下,dao增加一个新的复杂的查询,需要增加一个QureyCfg类(可选,如果queryObject支持验证参数,则需要否则不需要),一个QueryObject类,增加Spring的一个Bean配置。
传统的DAO设计的话,需要修改一个DAO接口,修改DAO实现。
传统的DAO设计对于增加或者修改查询接口的话,工作量稍微少于我的设计。
当系统的表为10个时,传统的DAo设计一般需要产生10个dao类(需要接口的话,为20个),如果一个dao类需要支持复杂的read查询为5个的话,对于查询的method,至少需要50个method实现。
而我的设计除去Type这个底层稳定构架层次以外,仅仅需要一个DAO实现类,如果尽量采用NamedQuery,那么整体QueryObject类实现一般仅仅需要10个左右即可,QueryObject还有利于抽象复杂的查询,甚至包括需要使用到Criteria的QueryObject实现。比如这么一个抽象:
[code="java"]public class CommonQuery implments QueryObject{
public Object query(Session session,Set parametes){
//验证参数合法性
if(getValidatable())
validate(getQueryCfg(),parameters);
List res = session.createCriteria(parameters.get("type"))
.add( Expression.eq(parameters.get("queryParam"),parameters.get("value")))
.list();
}
}[/code]
他可以抽象对某个表的某个字段等于某值的查询。
当然这些设计需要涉及到一个参数集合规范的问题,这些都是可以在项目初期很快设计明确下来以形成正式的QueryObject设计规范文档。

整体评估:
当应用中的entity数量极大时,这种dao的设计将大大优越于传统的dao设计。

分享到:
评论

相关推荐

    基于3DGIS技术的梯形格网构建及其简化算法设计.docx

    传统矢量地图LOD绘制流程包含简化、剖分...本文借鉴梯形格网结构与简化思想,顾及投影方式对地图简化的影响,设计透视投影下梯形格网的简化算法,实现透视投影下矢量地图LOD方法简化与剖分的统一,从而加速地图的渲染。

    基于位移设计思想的抗震加固简化计算方法

    基于位移设计思想的抗震加固简化计算方法,李军,李宏男,本文基于位移抗震设计方法和弹性能力曲线与弹性需求曲线的关系,提出了运用位移相关型阻尼器对以剪切型变形为主的多层框架结构进

    算法设计与分析课程三级项目—简化的流形

    本次三级项目报告主要叙述“简化的流形”这个...本次项目使用了面向对象的思想,避免了实验变量的复杂。在求最短路径阶段,使用了弗洛伊德算法。在可视化中,使用了MATLAB来实现实验目的。本次实验实现了简化的流行。

    8天线码本设计思想

    3Gpp R10 支持Tm9的模式,支持8天线端口,但给定的8天线码本为256个,如果采用遍历的方法算法复杂度比较高,该文档提供了一些简化的方法

    javascript 设计模式简化版

    包括面向对象,面向对象编程思想,javascript面向对象,设计模式通俗版,快速进入模式学习与实践。

    简化行政执法程序的探讨

    要提高对简化行政执法程序的思想认识,通过采取设计简化的行政行政执法、适度提升削减执法流程的强度、在实际层面削减行政执法流程、组建完善的行政执法于刑事司法相联合的体制、创造简化行政执法程序的体制环境、...

    最新编译原理课程设计(附课设)

    《编译原理》是计算机专业的一门重要的专业课程,其中包含大量软件设计思想。大家通过课程设计,实现一些重要的算法,或设计一个完整的编译程序模型,能够进一步加深理解和掌握所学知识,对提高自己的软件设计水平...

    安卓开发框架工具类相关-KJFrameForAndroid的设计思想是通过封装Android原生SDK中复杂的复杂操作而达到简化Android应用级开发最终实现快速而又安全高效的开发APP。我们的目标是用最少的代码完成最多的操作用最高的效率完成最复杂的功能.zip

    KJFrameForAndroid的设计思想是通过封装Android原生SDK中复杂的复杂操作而达到简化Android应用级开发,最终实现快速而又安全高效的开发APP。我们的目标是用最少的代码,完成最多的操作,用最高的效率,完成最复杂的...

    JAVA思想外文翻译毕业设计.docx

    Java编程思想 (Java和因特网) 既然Java不过另一种类型的程序设计语言,大家可能会奇怪它为什么值得如此重视,为什么还有这么多的人认为它是计算机程序设计的一个里程碑呢?如果您来自一个传统的程序设计背景,那么...

    C++程序设计原理与实践

    尽管本书采用的是C++语言,但其中涵盖的程序设计思想同样适用于其他语言,而且这些颇具实践意义的编程思想还可以弥补高校程序设计课程偏重语法细节,忽视总体思想方法和整体过程实现的问题,使读者充分认识到程序...

    研磨设计模式带书签完整版228M.7z.002

    中高级内容则深入探讨如何理解这些模式,包括模式中蕴涵什么样的设计思想,模式的本质是什么,模式如何结合实际应用,模式的优缺点以及与其他模式的关系等,以期让读者尽量去理解和掌握每个设计模式的精髓所在。...

    研磨设计模式带书签完整版228M.7z.001

    中高级内容则深入探讨如何理解这些模式,包括模式中蕴涵什么样的设计思想,模式的本质是什么,模式如何结合实际应用,模式的优缺点以及与其他模式的关系等,以期让读者尽量去理解和掌握每个设计模式的精髓所在。...

    Ajax设计模式

    在各种必须要满足的约束条件之下,设计出一个最简化的架构是架构师孜孜不倦追求的目标。幸运的是,经过国外高水平的Web开发专家的探索,这样的架构设计已经有了一套行之有效的模式。这些模式都是围绕着REST的思想来...

    研磨设计模式 完美书签 完整(一)

    中高级内容则深入探讨如何理解这些模式,包括模式中蕴涵什么样的设计思想,模式的本质是什么,模式如何结合实际应用,模式的优缺点以及与其他模式的关系等,以期让读者尽量去理解和掌握每个设计模式的精髓所在。...

    C++经典教程《C++程序设计原理与实践》(RAR第二部分)

    本书是经典程序设计思想与C++开发实践的完美结合,是C++之父回归校园后对C++编程原理和技巧的全新阐述。书中全面地介绍了程序设计基本原理,包括基本概念、设计和编程技术、语言特性以及标准库等,教你学会如何编写...

    研磨设计模式带书签完整版228M.7z.003

    中高级内容则深入探讨如何理解这些模式,包括模式中蕴涵什么样的设计思想,模式的本质是什么,模式如何结合实际应用,模式的优缺点以及与其他模式的关系等,以期让读者尽量去理解和掌握每个设计模式的精髓所在。...

    论文研究-改进顶点聚类方法的并行核外模型简化算法.pdf

    算法首先将传统顶点聚类简化算法中的代表点计算方法改进为顶点筛选方法,进而设计了一种适用于分布式计算环境的数据外存储策略,最后采用多数据流的思想改进单元筛选与顶点筛选两个方法的执行过程,从而形成完整的...

    基于PIC的直流电动机PWM调速控制系统设计

    软件部分采用模块化设计思想,编制了各个模块的流程图。论述了软件的设计思想和方法;实现了对直流电动机转动参数的设置、启动、停止、加速、减速和显示等功能。利用PIC系列芯片进行低成本直流电动机控制系统的设计,...

    基于单片机的电子存包柜的软件设计

    本文结合基于单片机的电子存包柜的软件设计,简要分析了Small RTOS 的设计思想及消息队列通信机制的应用。 1. Small RTOS51 的基本原理 Small RTOS51是一个很小的内核,完全集成在KEIL C51编译器中,仅占用较...

    研磨设计模式(完整带书签).part2.pdf

    中高级内容则深入探讨如何理解这些模式,包括模式中蕴涵什么样的设计思想,模式的本质是什么,模式如何结合实际应用,模式的优缺点以及与其他模式的关系等,以期让读者尽量去理解和掌握每个设计模式的精髓所在。...

Global site tag (gtag.js) - Google Analytics