简单理解:

DAO数据库访问对象实现连接数据库修改、添加等细节
service服务层面向功能把一个整个服务细化调用DAO
其实service其中都是一些方法去调用DAO甚至方法名都和DAO中一样的
如某个service是用作用户注册的
其中可能包括检测用户名是否存在和插入用户数据两部分
分别调用DAO中具体实现操纵数据库
看起来逻辑更清晰而已

进一步说明:

Dao层实现是简单的CRUD操作。相当于sql中的单条select,insert,upate,delete语句。
而service层就是具体业务的实现。一般多次组合dao层的方法(dao层方法达到了重用目的),是多个数据库操作的集合,可以看做数据库中的存储过程,而且事务一般控制在service层。这些数据库操作一起提交或回滚。
当然,简单的系统完全可以不划分service层,只用dao层。但那这样的话,代码从用性就不高。

用户的Dao层

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142publicclassUserDaoHibernateextendsBaseDaoHibernateimplementsIUserDao{/***增加用户**@paramuser*/publicLongaddUser(Useruser){returnaddEntityRetVal(user);}/***通过id删除用户**@paramuser*/publicvoiddeleteUser(Longid){UseruserPO=(User)getHibernateTemplate().load(User.class,id);deleteEntity(userPO);}/***删除用户**@paramuser*/publicvoiddeleteUser(Useruser){UseruserPO=(User)getHibernateTemplate().load(User.class,user.getUserid());deleteEntity(userPO);}/***更新用户**@paramuser*/publicvoidupdateUser(Useruser){UseruserPO=(User)getHibernateTemplate().load(User.class,user.getUserid());BeanUtil.copyProperties(userPO,user);updateEntity(userPO);}/***通过id查询用户**@paramid*@return*/publicUserqueryUserById(Longid){return(User)getHibernateTemplate().load(User.class,id);}/***通过用户名字查询用户实体--这个方法存在SQL注入攻击问题*@paramusernme*@return*/publicUserqueryUserByName(Stringusername){Stringhql="selectufromUseruwhereu.username='"+username+"'";return(User)this.queryObjectByHql(hql);}/***查询所有用户**@return*/publicList<User>queryAllUser(){returnqueryAllEntitys(User.class);}/***分页查询用户*/publicList<User>queryAllUser(Stringhql,intcurrentPage,intpageSize){returnqueryAllEntitys(currentPage,pageSize,hql);//调用的是有currentPage的分页方法}/****通过用户id查询用户名称,查不到返回null*@paramid*@return*/publicStringqueryNameById(Longid){Stringhql="fromUserdwhered.userId=?";List<?>users=getHibernateTemplate().find(hql,id);if(users.size()>){return((User)users.get()).getUsername();}else{returnnull;}}/***得到用户分页记录总数*@paramparentId*@return*//*publicLongqueryTotalNumberOfUser(){Stringhql="selectcount(*)fromUser";List<?>childNumber=getHibernateTemplate().find(hql);return(Long)childNumber.get(0);}*/publicintqueryAllUserNubmer(Stringhql){returnqueryAllEntitysNumer(hql);}/***查询用户的权限*@paramuserId*@return*/publicList<UserAuth>queryFunctionOnlyByUserId(LonguserId){Stringhql="selectuafromUserAuthuawhereua.userid="+userId;List<UserAuth>userAuths=queryAllObjectByHql(hql);returnuserAuths;}/***查询用户的角色*@paramuserId*@return*/@SuppressWarnings("unchecked")publicList<UserRole>queryRoleOnlyByUserId(LonguserId){Stringhql="selecturfromUserRoleurwhereur.userid="+userId;List<UserRole>userAuths=queryAllObjectByHql(hql);returnuserAuths;}}



service层,又可细化为查询业务UserHelper,还有增加,更新,删除业务集中在UserFacade中。这里贴出UserHelper.java

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252@WebServicepublicclassUserHelperimplementsIUserHelper{privateIUserDaouserDao=null;privateIDepartmentDaodepartDao=null;privateIFunctionHelperfunctionHelper=null;privateIRoleHelperroleHelper=null;publicvoidsetUserDao(IUserDaouserDao){this.userDao=userDao;}publicvoidsetFunctionHelper(IFunctionHelperfunctionHelper){this.functionHelper=functionHelper;}publicvoidsetDepartDao(IDepartmentDaodepartDao){this.departDao=departDao;}publicvoidsetRoleHelper(IRoleHelperroleHelper){this.roleHelper=roleHelper;}/***通过id查询权限,没有则返回null**@paramid*@return*/publicUserVOqueryUserById(Longid)throwsGeneralException{Useruser=null;try{user=userDao.queryUserById(id);}catch(Exceptione){e.printStackTrace();thrownewGeneralException("error.userDeatil","通过id查询权限时出错!");}//PO转VOUserVOuserVO=userPoToVo(user);returnuserVO;}/***得到所有权限的集合,没有则返回null**@return*/publicList<UserVO>queryAllUser()throwsGeneralException{List<UserVO>allFuncVOs=newArrayList<UserVO>();List<User>allFuncs=null;try{allFuncs=userDao.queryAllUser();}catch(Exceptione){thrownewGeneralException("error.userList","得到所有权限的集合时出错!");}for(Iterator<?>iterator=allFuncs.iterator();iterator.hasNext();){Useruser=(User)iterator.next();//PO转VOUserVOuserVO=userPoToVo(user);allFuncVOs.add(userVO);}returnallFuncVOs;}/***权限的PO到VO转换的方法**@paramuser*@return*/publicUserVOuserPoToVo(Useruser)throwsGeneralException{UserVOuserVO=newUserVO();BeanUtil.copyProperties(userVO,user);try{userVO.setDepartName(departDao.queryNameById(user.getDepartid()));//设置部门名称}catch(Exceptione){thrownewGeneralException("error.user","权限的PO到VO转换时出错!");}if(userVO.getStatus().equals("1")){userVO.setStatus("可用");}else{userVO.setStatus("不可用");}userVO.setRegisterName("ZHANG");userVO.setChangerName("ZHANG");returnuserVO;}/***通过分页查询权限信息集合**@paramhql*@paramcurrentPage*@parampageSize*@return*@throwsGeneralException*/publicList<UserVO>queryUserByPage(Stringhql,intcurrentPage,intpageSize)throwsGeneralException{List<UserVO>allFuncVOs=newArrayList<UserVO>();List<User>allFuncs=null;try{allFuncs=userDao.queryAllUser(hql,currentPage,pageSize);}catch(Exceptione){thrownewGeneralException("error.userList","分页得到权限的集合时出错!");}for(Iterator<?>iterator=allFuncs.iterator();iterator.hasNext();){Useruser=(User)iterator.next();//PO转VOUserVOuserVO=userPoToVo(user);allFuncVOs.add(userVO);}returnallFuncVOs;}/***返回User分页对象**@paramcurrentPage*@return*/publicPaginationgetPagination(intcurrentPage,Stringhql){returnnewPagination(currentPage,DisplayRecordCount.DISPLAY_IN_USER_LIST,userDao.queryAllUserNubmer(hql));}/***查到用户的所有角色ID**@paramuserId*@return*@throwsGeneralException*/publicList<Long>queryAllRoleidsOfUser(LonguserId)throwsGeneralException{List<Long>rolesOfUser=newArrayList<Long>();List<UserRole>userRoles=null;try{userRoles=userDao.queryRoleOnlyByUserId(userId);//查到角色权限}catch(Exceptione){thrownewGeneralException("error.userRoleidsList","得到用户的角色ID集合出错!");}for(Iterator<?>iterator=userRoles.iterator();iterator.hasNext();){UserRoleuserRole=(UserRole)iterator.next();Longroleid=userRole.getRoleid();rolesOfUser.add(roleid);}returnrolesOfUser;}/***查到用户的所有角色**@paramuserId*@return*@throwsGeneralException*/publicList<RoleVO>queryAllRoleOfUser(LonguserId)throwsGeneralException{List<Long>rolesOfUser=newArrayList<Long>();List<RoleVO>userRoles=newArrayList<RoleVO>();try{rolesOfUser=queryAllRoleidsOfUser(userId);for(Iterator<?>iterator=rolesOfUser.iterator();iterator.hasNext();){Longroleid=(Long)iterator.next();RoleVOroleVO=roleHelper.queryRoleById(roleid);userRoles.add(roleVO);}}catch(Exceptione){e.printStackTrace();thrownewGeneralException("error.userRoleList","得到用户的角色集合出错!");}returnuserRoles;}/***查询用户的所有权限1.查询所有用户的权限2.查询所有用户的角色3.查询所有用户的权限+角色的权限-共同的权限**@paramuserId*@return*/publicList<FunctionVO>queryAllFunctionOfUser(LonguserId,Stringsystem)throwsGeneralException{Set<FunctionVO>userAllFuncs=newHashSet<FunctionVO>();List<FunctionVO>userAllFuncsList=newArrayList<FunctionVO>();try{List<UserAuth>userFuncs=userDao.queryFunctionOnlyByUserId(userId);//查到权限if(userFuncs!=null){for(Iterator<?>iterator=userFuncs.iterator();iterator.hasNext();){UserAuthuserFunc=(UserAuth)iterator.next();LongfuncId=userFunc.getFuncid();FunctionVOfuncVO=functionHelper.queryFunctionById(funcId);userAllFuncs.add(funcVO);}}List<UserRole>userRoles=userDao.queryRoleOnlyByUserId(userId);//查到角色if(userRoles!=null){//查到所有角色的所有权限,将权限放入到userAllFuncs中for(Iterator<?>iterator=userRoles.iterator();iterator.hasNext();){UserRoleuserRole=(UserRole)iterator.next();LongroleId=userRole.getRoleid();List<FunctionVO>funcVOs=roleHelper.queryFunctionOfRole(roleId);for(Iterator<?>iterator2=funcVOs.iterator();iterator2.hasNext();){FunctionVOfunctionVO=(FunctionVO)iterator2.next();userAllFuncs.add(functionVO);}}}//将筛选了数据的无序Set集合转换为有序的List集合.一定要从小到大,否则权限树显示就会有问题for(Iterator<?>iterator=userAllFuncs.iterator();iterator.hasNext();){FunctionVOuserAllFun=(FunctionVO)iterator.next();if(system.equals("crm")){if(userAllFun.getFuncid()>=20000000l){userAllFuncsList.add(userAllFun);}}elseif(system.equals("hr")){if(userAllFun.getFuncid()<20000000l){userAllFuncsList.add(userAllFun);}}}FunctionComparatorfc=newFunctionComparator();Collections.sort(userAllFuncsList,fc);}catch(Exceptione){e.printStackTrace();thrownewGeneralException("error.userAllFuncsList","得到用户的权限集合出错!");}returnuserAllFuncsList;}}dao层是sql的增删改查
service层是给dao层得到结果添加业务逻辑
以‘用户登录’为例
dao层只负责查询用户名是username、密码是password的用户返回list
service层添加逻辑判断,list的size如果大于0,返回用户;size小于0,提示‘用户名或密码错误’

http://shenzhen.offcn.com/