趁着假期,再接再厉.开发这个论坛刚开始就是数据库的设计,但是数据库的设计图在公司的电脑上,自己的电脑Rational坏了,所以数据库的设计就放到十一长假以后再说吧.
先说说我遇到的第一个大问题:dao层的设计
怎样设计一个无耦合的dao层呢?dao层设计成通用的还是各司其职的?关于这个问题我曾经在问答里提出过.连接:http://feiyang404.iteye.com/blog/1138642
虽然讨论了很久,但是没有我想要的答案,最后经过苦思冥想,我找到了自己的解决办法.
首先,我赞成通用dao层的方式,因为dao层的职责就是负责数据持久化和获取数据库数据供Service层用的,所以这个应该和Service层之间解耦合,冲着这一点,各司其职的dao层就站不住脚了.其次,通用dao层的设计,在Spring配置文件中也很好配置,只需要配置一次dao就可以在每个service中引用了.这种好处也体现在编码中,每个Service类都引用同一个dao对象,编码起来很清楚,根本不会错.
现在最大的问题就是和Service层解耦了,如果看过我上面给出的连接的话,就会明白这个问题的难度了.dao层只是负责数据持久化的,所以应该说完全要和Service层剥离,现在dao层一般采用的是HQL加Spring的HibernateTemplate来完成的,但是万一dao层不采用HQL而采用QBC怎么办?如果和Service耦合的话,这下麻烦就大了,不仅要修改dao层还要修改Service层,而且稍有不慎,连Action层都在劫难逃.我接触过的好多项目中,都有在Service层构造HQL语句然后传给dao层,这种设计虽然很方便,但是我一直很抵触,在这次开发这个论坛的之前,我发帖求助,一直没有得到想要的答案,最后没办法,自己竟然想出来了一个解决方法,呵呵,当时觉得特别高兴,但是,也仅仅是解决了问题而已,不知道这么做性能上会不会有影响.
下面我说说自己的方法,为什么我们要在Service层构造HQL语句,而不在dao层构造呢?原因之一就是Service层负责业务处理,基本的增删还好说,一旦遇到要按条件查找就不好办了,要构造where子句的key=value的形式的语句,通用dao层就不会专门有这种方法,所以也很难构造,大家都选择在Service层构造好HQL语句,直接丢给dao层执行.经过我很长时间思考,key=value的形式不正好是Map的结构吗?在Service层构造出一个条件查询的Map结构,在dao层再专门写一个函数将Map解析出来,构成HQL语句,这样,Serivce层传给dao层的也只是一个map对象,而且map对象里也包含的是普通对象,完全和dao层没有关系.下面是我的代码:
public static String createHQL(String clazz, Map mps){
StringBuilder sb = new StringBuilder("from ").append(clazz).append(" where ");
Iterator it = mps.keySet().iterator();
while(it.hasNext()){
Object o = it.next();
sb.append(o.toString()).append("='").append(mps.get(o)).append("'").append(" and ");
}
System.out.println("DaoImpl.createHQL:"+sb.substring(0, sb.length()-5).toString());
return sb.substring(0, sb.length()-5).toString();
}
再粘一个dao层调用的代码:
public List findByValue(String clazz, Map mps, String orderBy, String orderKey) {
String hqlL = createHQL(clazz,mps);
final String hql = hqlL+ " order by "+orderBy+" "+ orderKey;
return getHibernateTemplate().executeFind(new HibernateCallback(){
public Object doInHibernate(Session session) throws HibernateException{
Query query = session.createQuery(hql);
if(query.list()!=null){
return query.list();
}else{
return null;
}
}
});
}
Service调用dao的代码:
public List listForumEliteAll(long boardid){
Map mps = new HashMap();
mps.put("board", boardid);
mps.put("elite", 1);
List list = this.getDao().findByValue("Forum", mps, "id", Constant.DESC);
return list;
}
由于是Map形式的,所以可以传入任意的key=value值对,对于想按多个条件查询的情况特别管用.这种只需要在Service层构造Map结构就可以了.
有了这个办法,就可以写出完全与Service解耦合的通用dao层了.附件里是我的通用dao层,大家如果能用到,就拿去用吧!对于上述方法,希望给位多多提出宝贵意见.我也是被迫无奈,只是为了写出一个无耦合的通用dao层罢了.
原创首发,谢谢支持!
分享到:
相关推荐
在“空中鼠标控制——抛砖引玉”这个项目中,核心是利用双目摄像头来获取用户的手部或任何指定物体的三维空间坐标。双目摄像头,顾名思义,是由两个摄像头组成,通过三角测量原理来计算物体与摄像头之间的距离。它的...
【房地产兵法论专集之二十-抛砖引玉】这篇文档虽然以古代战争中的兵法故事开场,但实质上是探讨房地产市场的策略和现象。"抛砖引玉"原指用普通物品吸引更高价值的物品,文中以此比喻房地产市场中高价房产的价值与其...
算法优化抛砖引玉-主要是一些算法的实现
这份"抛砖引玉熊市主图"文档提供的源码,就是一个实例,展示了如何通过计算和分析价格、成交量等数据来评估市场的牛熊状态。 首先,公式中的"SW1"是一个短期和长期移动平均线的综合指标,它是5日指数移动平均线...
从提供的文件内容中,我们可以梳理出以下几个关于监控和运维的重要知识点: 1. 理想监控系统的五个关键特性: - 完善的管理系统:能够一目了然地展现系统状态,帮助运维人员快速定位问题。 - 强大的配置系统:...
这是梦幻西游使用的was文件的查看工具,在编写时看了不少WasTools的代码,终于对was文件有个初步的了解了,在查看挑选图片时比原作者云风的waskey方便一点,但运行时间一长就会冒出个Out of system resource的错误,...
从零开始深度学习:TinyMind汉字书法识别 操作步骤 从官网下载,并解压到当前文件夹。产生train test1 两个文件 运行data.py文件,进行转录,将原始数据集转录为numpy矩阵,生成data.npy及label.npy 运行train.py...
#### 二、SAS语言基础 ##### 2.1 数据类型 SAS中的数据主要分为两种类型:数值型和字符型。 - **数值型**: 用于存储整数和浮点数。 - **字符型**: 用于存储字符串,最大长度为32767个字符。 ##### 2.2 表达式 SAS...
1.拷贝CANBus文件夹到D:\WINCE600\PLATFORM\SMDK6410\SRC\DRIVERS 目录下 2.在dirs文件中添加CANBus ...注意:驱动中默认波特率为100K,本源码只是个抛砖引玉的作用。可以根据项目实际情况加以修改。
针对开关电源很多人觉得很难,其实不然。设计一款开关电源并不难,难就难在做精,等你真正入门了,积累一定的经验,再采用分立的结构进行设计就...万事开头难,笔者在这就抛砖引玉,慢慢讲解如何一步一步设计开关电源。
此资源为抛砖引玉,仅为赶时间速成的同学提供完整的项目案例。 ------------------------------------------------------------- 执行项目需要提前安装好python环境(anaconda、pycharm)以及selenium依赖包(pip ...
WPF是微软新一代图形系统,运行在.NET Framework 3.0架构下,为用户界面、2D/3D 图形、文档和媒体提供了统一的描述和操作方法。基于DirectX 9/10技术的WPF不仅带来了前所未有的3D界面,而且其图形向量渲染引擎也大大...
这个仓库主要是前段时间参加2018研究生数学建模大赛的经验与心得,但是第二问,第三问做的太烂,所以只放我们团队第一问的方案和源码,在此抛砖引玉,欢迎大家批评指正。具体内容分析可以查看我的博客,我的博客地址...
一位有心人写得很好的SAS基础知识介绍,值得一读。 前 言 --不要把学SAS 当作一件很时髦的事情,能用简单软件完成...而不是刚会走就想着跑甚至想飞,还没学几条语句就想去做统计分析,到头来发现错误百出而又手足无措
SAS语言抛砖引玉》 任何想学习和了解SAS语言的人,学习SAS的好材料,确实很有用。
#### 二、安装环境 本手册推荐使用如下软件版本进行安装: - **操作系统**:Windows XP / Windows 2003 Server - **Cacti版本**:0.8.7a - **RRDTool**:1.2.15 (适配Cygwin 1.5.20) - **PHP**:5.2.5 - **MySQL**...
利用delaunay函数划分网格欢迎指点探讨-DelaunayWithGrid.m 本帖最后由 liuf412044725 于 2013-6-8 17:47 编辑 近期论坛上有不少讨论delaunay函数的帖子。似乎主要有以下问题: 1、delaunay函数各参数的意义 ...
小弟不才,斗胆写下几行代码,来这里期待抛砖引玉。我们身边,每天都有无数的项目开工,然后是老板对进度的紧追不舍,项目经理程序员加班的无奈,再然后或许是成功的喜悦或许是失败的哀愁,但不管结果如何,所有人...