`

简化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设计。

分享到:
评论

相关推荐

    Android应用程序开发以及背后的设计思想深度剖析

    这篇文章将逐步揭示Android应用程序背后的设计思想,从基本的 APK 文件结构到更复杂的系统组件和编程模型。 首先,让我们深入了解 APK 文件。APK 是 Android 应用程序的基本打包格式,实质上是一个被压缩的 ZIP ...

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

    综上所述,本文通过借鉴梯形格网结构和简化思想,结合3DGIS技术,提出了新的地图绘制和渲染方法。这一方法不仅提高了地图渲染的效率,还优化了地图在视觉上的质量,对于推动GIS技术的发展和实际应用具有重要的意义。...

    关于我校学生管理系统的设计思想

    根据给定的文章信息,本文将深入探讨《关于我校学生管理系统的设计思想》中提及的主要知识点,包括系统设计背景、总体规划、具体功能模块等。 ### 一、问题的提出 随着中国经济的快速发展和教育改革的推进,高等...

    架构设计(包括一些设计思想,设计模型) C#

    在IT行业中,架构设计是构建复杂软件系统的关键步骤,它涉及到一系列的设计思想和模型,而C#作为一种强大的面向对象编程语言,常常被用于实现这些设计理念。在这个“架构设计(包括一些设计思想,设计模型) C#”的主题...

    jquery设计思想

    jQuery 设计思想主要体现在其简洁、高效的API设计上,它极大地简化了JavaScript操作网页元素的复杂性。jQuery的核心是选择器引擎,它基于CSS选择器,使得开发者能够以直观的方式选取DOM中的特定元素。以下是对jQuery...

    软件设计思想和c#设计技巧

    在IT行业中,软件设计思想和C#设计技巧是开发者必须掌握的核心能力。这两本书籍的目的是帮助读者深入理解编程背后的逻辑,提升代码质量和可维护性。让我们分别探讨这两个主题。 首先,软件设计思想,它是软件工程的...

    FPGA开发流程及编程思想+简化的开发流程+实际的开发流程+需求定义+设计输入+设计综合

    FPGA开发流程及编程思想+简化的开发流程+实际的开发流程+需求定义+设计输入+设计综合

    jQuery设计思想完整篇

    这种设计思想来源于CSS选择器,目的是为了简化DOM操作。在jQuery中,开发者使用美元符号$()函数(通常简写为$)作为构造函数,传入一个选择表达式,便能够选中特定的DOM元素或元素集合。例如,使用$('#id')可以选中...

    FPGA重要设计思想及工程应用之模块化设计.pdf

    模块化设计方法的基本思路是借鉴工业生产中的并行工作、协同设计思想。在传统的工业生产中,可以将一个复杂的物品分解为若干简单的部件,并在不同的车间同时进行制造,最后将这些部件组装起来。类似地,在模块化设计...

    单片机程序设计里的“分层思想”

    在单片机程序设计领域,采用合理的架构和设计思想对于提升程序的可维护性、扩展性和效率至关重要。“分层思想”是一种非常有效的程序设计策略,它可以帮助开发者更好地组织代码,提高代码的复用率,并简化复杂系统的...

    王平安网页设计思想.doc

    王平安的网页设计思想主要涵盖三个方面:响应式网页设计、扁平化风格和网页色彩搭配。这些设计理念在当今网页设计领域具有重要的地位,对于提升用户体验和优化网站视觉效果有着显著影响。 1. 响应式网页设计:响应...

    设计思想与编程艺术

    设计思想与编程艺术是软件...这些设计思想和编程艺术的核心是简化复杂性,提高软件的可维护性、可扩展性和可读性。通过遵循这些原则,开发者可以创造出更高效、更可靠的软件系统,从而在不断发展的IT行业中保持竞争力。

    设计之道 PDF

    以下将详细介绍书中涉及的设计思想和.NET设计框架的相关知识点。 1. 设计原则:书中的核心内容围绕着一些基础设计原则展开,如单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP...

    EDA 技术:举例:层次设计思想的应用.ppt

    **EDA技术:层次设计思想的应用** EDA(Electronic Design Automation)技术是电子设计自动化的重要工具,它使得复杂的集成电路设计过程变得更加高效和便捷。在本例中,我们将探讨如何应用层次设计思想来实现一个...

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

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

    高手系列!谈单片机程序设计中的“分层思想”

    ### 单片机程序设计中的“分层思想” #### 一、引言 单片机是一种集成微处理器、存储器及各种输入/输出接口于一体的微型计算机系统,被广泛应用于各个领域,如工业控制、家用电器、汽车电子等。随着单片机技术的...

    设计之道.pdf

    ### 设计之道——探索软件设计的核心理念与模式应用 #### 引言 在软件开发领域,“设计之道”不仅是关于如何创建高效、灵活的系统结构,更关乎如何在不断变化的需求和技术环境中保持竞争力。本书《设计之道》深入...

    用类设计思想实现单片机软件的C程序模块封装

    ### 用类设计思想实现单片机软件的C程序模块封装 #### 一、概述 在现代嵌入式系统开发中,单片机扮演着重要的角色。为了更好地管理和组织单片机软件,采用面向对象的设计思想变得越来越普遍。本文旨在探讨如何利用...

    浅谈单片机程序设计中的“分层思想”(转)

    这种思想通过将程序结构化分层,不仅能够简化代码的复杂度,还能够适应不同硬件平台的变化,使得软件具有更好的通用性和可维护性。本文将详细探讨分层思想在单片机程序设计中的应用,以及如何通过该思想解决硬件设计...

Global site tag (gtag.js) - Google Analytics