`
jamesby
  • 浏览: 383483 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

关于Service和DAO层的功能划分的迷惑

    博客分类:
  • Java
阅读更多
Service 层的代码

public class GeneralService extends AbstractService {
	private GeneralDao generalDao;

	public void setGeneralDao(GeneralDao generalDao) {
		this.generalDao = generalDao;
	}

	public void saveResourceSale(ResourceItemFormbean resourceItem)
			throws Exception {
		generalDao.saveResourceSale(resourceItem);
	}

	public List selectTodayResource(Map params) throws Exception {
		return generalDao.selectTodayResource(params);
	}

	public List selectTdPrintInfo(Integer ddid, Integer linkmanid)
			throws Exception {
		return generalDao.selectTdPrintInfo(ddid, linkmanid);
	}

	public List selectTdPrintItems(Integer ddid) throws Exception {
		return generalDao.selectTdPrintItems(ddid);
	}

	public List selectTodayBuy(Map params) throws Exception {
		return generalDao.selectTodayBuy(params);
	}

	public List selectStockKgzy(Integer ptid, Integer prodid, Integer cmdeptid,Integer page)
			throws Exception {
		return generalDao.selectStockKgzy(ptid, prodid, cmdeptid,page);
	}
	
	public List selectStockXqzy(Integer ptid, Integer prodid, Integer cmdeptid,
			Integer page) throws Exception {
		return generalDao.selectStockXqzy(ptid, prodid, cmdeptid, page);
	}

	public void deletePublishedResource(Integer pkid) throws Exception {
		generalDao.deletePublishedResource(pkid);
	}	
	
	public void saveXqResourcePublish(XqZyfbModel data) throws Exception {
		generalDao.saveXqResourcePublish(data);
	}
	
	public XqZyfbModel selectXqResourceDetail(Integer pkid) throws Exception {
		return generalDao.selectXqResourceDetail(pkid);
	}	
}


DAO 层的代码

public class GeneralDao extends AbstractDao {
	public void saveResourcePublish(ZyfbModel data) throws Exception {
		getSqlMapClientTemplate().update("MainProcedure.saveResourcePublish",
				data);
	}

	public void updateResourcePublish(ZyfbModel data) throws Exception {
		getSqlMapClientTemplate().update("MainProcedure.updateResourcePublish",
				data);
	}
	
	public void deletePublishedResource(Integer pkid) throws Exception {
		getSqlMapClientTemplate().update("MainProcedure.deletePublishedResource",
				pkid);
	}	
	

	public List selectStockXqzy(Integer ptid, Integer prodid, Integer cmdeptid,
			Integer page) throws Exception {
		Map params = new HashMap();
		params.put("ptid", ptid);
		params.put("prodid", prodid);
		params.put("cmdeptid", cmdeptid);
		params.put("row", new Integer(15));
		params.put("page", page);
		return getSqlMapClientTemplate().queryForList(
				"MainProcedure.selectStockXqzy", params);
	}	
	
	public void saveXqResourcePublish(XqZyfbModel data) throws Exception {
		getSqlMapClientTemplate().update("MainProcedure.saveXqResourcePublish",
				data);
	}	
	
	public XqZyfbModel selectXqResourceDetail(Integer pkid) throws Exception {
		return (XqZyfbModel) getSqlMapClientTemplate().queryForObject(
				"MainProcedure.selectXqResourceDetail", pkid);
	}
}


迷惑的是在上面的代码中,Service 并没有什么业务逻辑,似乎可有可无,是否上面的代码可以将Service层省略,直接在DAO层操作和事务拦截,只有涉及到具体业务逻辑的时候使用Service,当然这会造成Controller和DAO层之间的紧耦合,大家在项目中遇到如上情况都是如何做的?
分享到:
评论
8 楼 xuni 2007-02-14  
写一个service和DAO的基类不就成了吗,service中有一个BaseDAO的实例,service基类的save方法调用dao的save方法,
7 楼 jamesby 2007-02-14  
如果以上方案可行,可以考虑使用代码生成工具,在DB的数据结构确定后,直接生成entity model和SqlMap文件(包含select,query,update,delete)之类的几个statement声明,可以简化很多工作量!

当然这里涉及一个先有实体模型还是先有数据模型的问题!
6 楼 jamesby 2007-02-14  
目的是为了减少Service和DAO之间代码的过分重复,想来想去,以上代码在Service层代码简化的可能性很小!因此把方向放在对DAO层代码的优化上面来!

初步想法是DAO设计如下几个通用方法:

List queryForList(Object entity);
Object queryForObject(Object entity);
int saveEntity(Object entity);
int updateEntity(Object entity);
int deleteEntity(Object entity);


我用的是iBatis,有一个如何确定Statementid的问题,本来考虑在如上代码中添加一个String类型的参数,或者自己设计一个StatementType实现对Statmentid 的包装,感觉是一个道理.这样坏处就是Statementid需要由Service来指定,但是这些东西职责上应该由DAO来关心!

考虑再三决定根据参数类型来决定statmentid,这样需要一定的命名规范.

List queryForList(Object entity
{
    String statemntid = this.getClass().getName()+".query"+entity.getClass().getName();
    return getSqlMapTemplate().queryForList(statemntid,entity);
}


其它类同,这样一来要求命名空间的名字同DAO的名字一致,而statement的ID同entityObject的名字一致,不过多了前缀为query,select,insert,update等.

将如上代码放入DAO的超类中,这样我每一个DAO就不需要重复写这些功能雷同的代码!不知道有什么不合适之处.
5 楼 jamesby 2007-02-13  
codeutil 写道

在 service层, if (pkid==null) 这样的代码从来就没写过???????

楼上的意思是不是向Hibernate的saveOrUpdate一样,对于save和update在Service层只有一个方法,save和update是可以简单的合并,但是我还是有很多的get,select之类的啊!
4 楼 codeutil 2007-02-13  

在 service层, if (pkid==null) 这样的代码从来就没写过???????

3 楼 jamesby 2007-02-13  
xly_971223 写道
一种折中的办法是业务层继承dao层 业务对象要用到多个dao时会麻烦一些
像cms系统就是这种情况,大多数的操作是crud,要是按照上面的写法还不疯了
可以参考一下springside2中的方法
业务层继承DAO层,Service 肯定要访问多个DAO的,这个继承的方案有些行不通,现在已经快疯了:)

giscat 写道
视情况而定,简单的合并
复杂的分分层


现在的业务基本都是这种简单的情况,因为复杂的方式要求写存储过程. 简单情况如何合并?不是很理解




2 楼 xly_971223 2007-02-13  
一种折中的办法是业务层继承dao层 业务对象要用到多个dao时会麻烦一些
像cms系统就是这种情况,大多数的操作是crud,要是按照上面的写法还不疯了
可以参考一下springside2中的方法
1 楼 giscat 2007-02-13  

视情况而定,简单的合并
复杂的分分层

相关推荐

    Service层和DAO层解析

    Service层和DAO层是软件开发中常见的两种设计模式,主要用于分离业务逻辑和数据访问操作。在Java Web开发中,它们通常被应用于三层架构或MVC(Model-View-Controller)模型中。 DAO(Data Access Object)层是负责...

    怎样区分Action, Service 和 Dao功能.

    区分Action、Service和Dao功能 在软件开发中,Action、Service和Dao都是常用的架构模式,但是很多开发者对这些概念的理解和使用却存在一定的混淆。因此,本文将对Action、Service和Dao的功能进行详细的区分和解释。...

    action层,dao层 ,service层,entity层1

    标题和描述中提到的"action层,dao层,service层,entity层"是这种分层架构的典型组成部分,下面将详细解释每一层的功能和它们之间的交互。 1. **Action层(控制层)**: 这一层主要负责接收用户的请求,进行业务...

    DAO层_Service层_Controller层、View层介绍

    DAO层_Service层_Controller层、View层的一些了解知识,帮助填充对这部分比较空白的开发者们。

    Action,Service和Dao功能

    Action、Service 和 Dao 功能解析 在不分层的系统中,我们可以将所有的代码都写到一个地方,比如 Struts 的 Action 类。在这里,我们不仅要处理页面逻辑,还要做业务逻辑,还要做数据访问。为了更好地理解和分离 ...

    jsp、servlet进行增删改查,dao层和service层分开

    在Java Web开发中,"jsp、servlet进行增删改查,dao层和service层分开"是一种常见的设计模式,它遵循了MVC(Model-View-Controller)架构,旨在提高代码的可维护性和可扩展性。以下是这个模式的详细解释: 1. **...

    Spring的作用贯穿了整个中间层,将Web层、Service层、DAO层及PO无缝整合

    - **Spring**:用于Service层和DAO层,提供依赖管理和事务管理等功能。 - **Hibernate**:用于DAO层,负责对象关系映射(ORM),使得Java对象能够与数据库表相对应。 3. **配置文件**:配置文件是Spring框架中的...

    使用jsp-servlet-service-dao四层结构完成用户信息的增删改查操作

    本文将深入探讨如何使用jsp-servlet-service-dao四层架构来实现这样的系统,包括用户信息的增删改查功能,以及权限控制机制。 首先,让我们理解这四层架构的每一层: 1. **JSP(JavaServer Pages)**:JSP是Java ...

    自动生成MVC中的Service层、Dao层及Model层代码

    这些工具能够根据数据库的表结构自动创建Service、Dao和Model层的代码,只需简单配置即可。 自动生成代码的步骤通常包括: 1. 配置数据库连接信息,如数据库驱动、URL、用户名和密码。 2. 指定需要生成代码的数据库...

    java代码生成器(dao层service层)

    Java代码生成器是一种工具,主要用于自动化编程过程中重复性较强的部分,比如DAO(数据访问对象)层和服务(Service)层的代码编写。DAO层是应用程序与数据库交互的主要接口,而Service层则封装了业务逻辑,两者在...

    项目model、Dao层、业务层建模工具类

    建模工具类在Dao层可能包含诸如连接管理、事务处理、SQL执行等通用功能,例如`JDBCUtils`,这是一个常用的Java JDBC辅助类,用于简化数据库连接的获取和释放,以及执行SQL语句。 `JDBCUtils`文件可能包含以下功能:...

    分了dao service的ssm整合还附带分页功能

    在这个项目中,我们看到标题提到"分了dao service的ssm整合还附带分页功能",这表明项目不仅实现了SSM的基础整合,还在数据访问层(DAO)和服务层(Service)进行了分离,并且加入了分页功能,这对于新手来说是一个很好...

    采用Java Servlet +Service+DAO实现用户登陆注册

    (2)新增Service包,创建Servicve服务类,供Servlet调用,实现业务功能; (3)对数据库的增删改查操作进行封装,提供统一的访问对象DAO类; (4)以用户注册与登陆案例的实现为例。 教学重点与难点 (1)Servlet+...

    快速生成dao、service、controller等相关代码

    这个过程通常涉及编写DAO(Data Access Object)、Service和Controller层的代码,这些是软件架构中的核心组件。"快速生成DAO、Service、Controller等相关代码"的标题和描述暗示了一个针对这种情况的解决方案,即一个...

    简单DAO层示例

    首先,DAO层的主要职责是处理与数据库相关的所有操作,如查询、插入、更新和删除记录。它的存在使得业务逻辑层可以专注于业务规则的处理,而无需关心底层的数据存取细节。这遵循了软件设计中的单一职责原则,提高了...

    strut2+spring+ibatis 的ation层,service层,dao层自动生成,简单易用

    Struts2、Spring和iBatis是Java Web开发中常用的三大框架,它们分别负责MVC模式中的Action层、业务逻辑层(Service层)以及数据访问层(DAO层)。本项目提供的是一款工具,能够自动化生成这三层的代码,极大地提高了...

    SpringBoot 多模块Dao层单元测试

    对于多模块的Spring Boot项目,每个模块可能包含不同的组件,如Service层、Controller层和Dao层。Dao层主要负责与数据库交互,因此它的单元测试通常涉及对数据库操作的模拟,而无需实际连接到数据库。 1. **配置多...

    crm项目jsp+servlet+service+dao

    JUnit可以用来测试Service和DAO层的函数,而工具如Selenium可以帮助进行前端功能测试。 10. 部署与运行:项目完成后,需要打包成WAR文件部署到Web服务器,如Tomcat、Jetty等,然后通过HTTP请求访问并测试CRM系统的...

    javaSE-day11-day12--主要实现了购物系统的dao层和service层

    开发者可能将不同组件划分为不同的包,比如DAO层和Service层的实现可能分别放在`com.javashop.dao`和`com.javashop.service`等包下,以遵循良好的命名和组织规则。 综上所述,这个学习过程涵盖了Java开发中的关键...

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

    在C#编程中,"通用Dao层"是一个常见的设计模式,用于封装数据库操作,使得业务逻辑层能够专注于处理业务规则,而无需关心底层数据访问的细节。本篇将重点探讨如何利用C#的特性(Attribute)标签来实现这一目标,同时...

Global site tag (gtag.js) - Google Analytics