service层处理相关的业务,dao层处理数据的CRUD.
以登录为例:
第一个疑问
service层有个login接口,同样dao层也有一个login接口。
那么这样岂不是service层中与dao层中会出现很多一样的接口?
第二个疑问
A客户现在有这样的一个业务,登录时需要判断员工是否已经离职
那么我应该怎么处理呢?
在dao层中提供一个checkUser()的接口,service中调用,正确后在调用dao层的login接口。
还是service中直接调用dao层提供的login接口,在dao接口的实现中去判断。
如果B客户没有特别的业务处理,只是单纯的登录,那么此时按照上面的两种方式
我肯定要修改其中的一层了,dao层或者service层。
请大家指点一下……

解决方案 »

  1.   

    为什么要那么多的接口?
    正常登陆就直接service调用dao里的login方法就好了,
    判断离职时,service连续调用dao里的isLizhi和login就好了。
      

  2.   

    很明显,定义接口是为了让SERVICE层和DAO层解耦。这样做有个很明显的好处,就是你换ORM的框架,对你的SERVICE层没有影响,你只要保证DAO接口定义不变,里面的实现根据不同的ORM框架修改就可以了。至于你的第二个问题,很明显是应该在SERVICE层里调用2次DAO层,DAO层应该是纯粹的CRUD原子操作,不和任何业务有关系,你说的验证问题已经是业务需求了,应该SERVICE层负责。
      

  3.   

    SERVICE的接口,是为了和控制器层解耦。道理和DAO接口一样,SERVICE层业务修改,不应该影响显示层。
      

  4.   

    Dao层怎么会有login这样的业务操作接口,应该叫queryUser吧。楼上的说的挺好的。
      

  5.   

    dao层可以有一个 findUserByXX 方法 不一定是给login调用(也可以给其他service调用),login可以是service 的业务方法,但是dao层的方法应该都叫findXX、qry,del,update 等等,与业务无关
      

  6.   

    看来dao层所做的接口都是原子性的,最小粒度的。都是基本CURD 不应该与业务层的接口一样。比如登录时要做的:1.校验用户是否存在。2.判断是否离职。3.设置用户相关的权限。service层的接口只需要有一个login()就可以了,在这个接口调用dao层中一下三个接口--->dao层应该有的接口:getUser()、isLiZhi()、setQuanXian().这样理解是否正确呢?
      

  7.   


    DAO层的方法应该面向表,比如表名叫user,就应该有 getUser deleteUser updateUser 这样的方法;Service层应该面向业务,方法名为业务逻辑,比如 login  logout 之类的。关于DAO类的设置,我个人观点是每个表都应该有自己的DAO,这样后期容易维护,如果你的权限表和用户表不是一个,那么就应该是2个DAO接口,每个接口定义自己表相关的CRUD方法定义。
      

  8.   

    第一个问题:action依赖于service,最终你的登入是要在action里面被ui给调用的。action不能调用dao这样维护起来不方便。dao一般是单纯的增加删除修改查询,而service一般是复杂的业务,不一定是封装,而且目前的传统架构service一般是数据库事物切入层。
    第二个问题:为了减少耦合以及维护方便最好是调用service的login。
      

  9.   

    dao层应该是queryByXXX,delete,add,update才对啊,不应该有login这样的名字,dao层只是用来操作数据库数据(增删改查),不作业务处理
      

  10.   

    楼主你还是先搞清楚什么情况下需要借口吧。
    我在 开发驿站 网站看见这个帖子, 这个接口标准或许对你有用。(百度搜 开发驿站)
    java抽象类与接口的区别java接口:可以理解为一种合约,共性的标准, 该接口中如果存在某些方法,那么这些方法具备一定的关联。
    如果你的接口不稳定,常常需要修改;如果你的接口和某种情况有冲突;如果你的接口中存在方法与接口本接口无关; 如果你的接口仅有一个实现, 很难派生出第二个实现,或者根本没有必要或没有可能出现第二种情况;那么你应该好好检查验证考虑你的设计, 本接口是否有存在的意义价值。
    我看过很多初学者在使用接口的时候,总是出现如果代码:
    public interface StudentDao {
    void saveStudent(Student student);
    void removeStudentById(int id);
    void updateStudent(Student student);
    Student findStudentById(int id);
    /**等等其他的方法**/
    }这种一般出现在某某管理系统,数据库应用中,存在一个实体对象,提供实体对象的数据库操作。
    在我看来,一般一个数据库的应用中, 像本类型的接口毫无用处, 把接口删掉, 直接使用实现类即可。
    因为这个接口, 不是合约, 不是共性, 仅一种特例状态,毫无标准可言。
    更甚至导致, 实现不知道如何合理取名, 叫做StudentDaoImpl, 以后再二次开发,维护,修改的人一头雾水。希望对大家有用