【SSH项目实战】国税协同平台-23.抽取BaseService

来源:互联网 发布:数据作假和抄袭 编辑:程序博客网 时间:2024/05/21 10:13
接下来我们开始整顿我们的Service层,我们每一个Service基本上都有下面几个方法(拿info举例子):
[java] view plaincopy
  1. //新增  
  2. public void save(Info entity);  
  3. //更新  
  4. public void update(Info enetity);  
  5. //根据id删除  
  6. public void delete(Serializable id);  
  7. //根据id查找  
  8. public Info findObjectById(Serializable id);  
  9. //查找列表  
  10. public List<Info> findObjects();  

我们写任何一个Service都要不停的重复这些代码,很是繁琐,所以我们要把它们抽取出来,然后卸写在BaseService中,让其他Service都去实现BaseService这个接口。
[java] view plaincopy
  1. package cn.edu.hpu.tax.core.action;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.List;  
  5.   
  6. public interface BaseService<T> {  
  7.       
  8.     //新增  
  9.     public void save(T entity);  
  10.     //更新  
  11.     public void update(T enetity);  
  12.     //根据id删除  
  13.     public void delete(Serializable id);  
  14.     //根据id查找  
  15.     public T findObjectById(Serializable id);  
  16.     //查找列表  
  17.     public List<T> findObjects();  
  18. }  

我们要实现这个接口:
[java] view plaincopy
  1. package cn.edu.hpu.tax.core.service.impl;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.List;  
  5.   
  6. import cn.edu.hpu.tax.core.dao.BaseDao;  
  7. import cn.edu.hpu.tax.core.service.BaseService;  
  8.   
  9.   
  10. public class BaseServiceImpl<T> implements BaseService<T>{  
  11.   
  12.   
  13.     private BaseDao<T> baseDao;  
  14.       
  15.     @Override  
  16.     public void save(T entity) {  
  17.         baseDao.save(entity);  
  18.     }  
  19.   
  20.   
  21.     @Override  
  22.     public void update(T enetity) {  
  23.         baseDao.update(enetity);  
  24.     }  
  25.       
  26.     @Override  
  27.     public void delete(Serializable id) {  
  28.         baseDao.delete(id);  
  29.     }  
  30.   
  31.   
  32.     @Override  
  33.     public T findObjectById(Serializable id) {  
  34.         return baseDao.findObjectById(id);  
  35.     }  
  36.   
  37.   
  38.     @Override  
  39.     public List<T> findObjects() {  
  40.         return baseDao.findObjects();  
  41.     }  
  42.   
  43.   
  44. }  

我们这里BaseDao并没有任何注入和实现,所以我们使用的话还是会报空指针异常的。

上面的问题先放一边,我们使用BaseService的话应该是这样(以info为例):
[java] view plaincopy
  1. package cn.edu.hpu.tax.info.service;  
  2.   
  3. import cn.edu.hpu.tax.core.service.BaseService;  
  4. import cn.edu.hpu.tax.info.entity.Info;  
  5.   
  6. public interface InfoService extends BaseService<Info>{  
  7.       
  8. }  


[java] view plaincopy
  1. package cn.edu.hpu.tax.info.service.impl;  
  2.   
  3. import javax.annotation.Resource;  
  4.   
  5. import org.springframework.stereotype.Service;  
  6.   
  7. import cn.edu.hpu.tax.core.service.impl.BaseServiceImpl;  
  8. import cn.edu.hpu.tax.info.dao.InfoDao;  
  9. import cn.edu.hpu.tax.info.entity.Info;  
  10. import cn.edu.hpu.tax.info.service.InfoService;  
  11.   
  12.   
  13. @Service("infoService")  
  14. public class InfoServiceImpl extends BaseServiceImpl<Info> implements InfoService {  
  15.   
  16.   
  17.     @Resource  
  18.     private InfoDao infoDao;//留他是为了info以后自己的业务方法  
  19. }  

问题来了,我们怎么样去让BaseDao在BaseServiceImpl中实例化呢?
我们这么做:
[java] view plaincopy
  1. package cn.edu.hpu.tax.info.service.impl;  
  2.   
  3. import javax.annotation.Resource;  
  4.   
  5. import org.springframework.stereotype.Service;  
  6.   
  7. import cn.edu.hpu.tax.core.service.impl.BaseServiceImpl;  
  8. import cn.edu.hpu.tax.info.dao.InfoDao;  
  9. import cn.edu.hpu.tax.info.entity.Info;  
  10. import cn.edu.hpu.tax.info.service.InfoService;  
  11.   
  12.   
  13. @Service("infoService")  
  14. public class InfoServiceImpl extends BaseServiceImpl<Info> implements InfoService {  
  15.       
  16.     private InfoDao infoDao;  
  17.       
  18.     @Resource  
  19.     public void setInfoDao(InfoDao infoDao) {  
  20.         super.setBaseDao(infoDao);  
  21.         this.infoDao = infoDao;  
  22.     }  
  23.       
  24.       
  25. }  

我们使用set注入,然后在注入InfoDao的同时,我们将BaseServiceImpl中的BaseDao也进行了实例化。

我们在BaseServiceImpl添加这个set方法:
[java] view plaincopy
  1. public class BaseServiceImpl<T> implements BaseService<T>{  
  2.   
  3.     private BaseDao<T> baseDao;  
  4.       
  5.     public void setBaseDao(BaseDao<T> baseDao) {  
  6.         this.baseDao=baseDao;  
  7.     }  
  8.     //下面代码不在赘述  
  9. }  

这样我们就巧妙的注入了BaseServiceImpl中的BaseDao,做到了无论谁继承了我这个Service,都能使用他自己的Dao进行操作。

我们测试info的各项功能,都没有问题,证明我们的Servcie抽取成功。

下面我们将我们之前的User、role层的Service统统换掉,我们的BaseService的抽取工作就全面完成了。

先是换掉Role的:
[java] view plaincopy
  1. package cn.edu.hpu.tax.role.service;  
  2.   
  3. import cn.edu.hpu.tax.core.service.BaseService;  
  4. import cn.edu.hpu.tax.role.entity.Role;  
  5.   
  6. public interface RoleService  extends BaseService<Role>{  
  7.   
  8. }  

[java] view plaincopy
  1. package cn.edu.hpu.tax.role.service.impl;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.List;  
  5.   
  6. import javax.annotation.Resource;  
  7.   
  8. import org.springframework.stereotype.Service;  
  9.   
  10. import cn.edu.hpu.tax.core.service.impl.BaseServiceImpl;  
  11. import cn.edu.hpu.tax.info.dao.InfoDao;  
  12. import cn.edu.hpu.tax.role.dao.RoleDao;  
  13. import cn.edu.hpu.tax.role.entity.Role;  
  14. import cn.edu.hpu.tax.role.service.RoleService;  
  15.   
  16. @Service("roleService")  
  17. public class RoleServiceImpl extends BaseServiceImpl<Role> implements RoleService{  
  18.   
  19.   
  20.     private RoleDao roleDao;  
  21.       
  22.     @Resource  
  23.     public void setRoleDao(RoleDao roleDao) {  
  24.         super.setBaseDao(roleDao);  
  25.         this.roleDao = roleDao;  
  26.     }  
  27.       
  28.     @Override  
  29.     public void update(Role role) {  
  30.         //1.删除该角色对应的所有权限  
  31.         roleDao.deletePrivilegeByRoleId(role.getRoleId());  
  32.         //2.更新角色及其权限  
  33.         roleDao.update(role);  
  34.     }  
  35.   
  36.   
  37. }  

然后换掉User的:
[java] view plaincopy
  1. package cn.edu.hpu.tax.user.service;  
  2.   
  3. import java.io.File;  
  4. import java.io.Serializable;  
  5. import java.util.List;  
  6.   
  7. import javax.servlet.ServletOutputStream;  
  8.   
  9. import cn.edu.hpu.tax.core.exception.ServiceException;  
  10. import cn.edu.hpu.tax.core.service.BaseService;  
  11. import cn.edu.hpu.tax.info.entity.Info;  
  12. import cn.edu.hpu.tax.user.entity.User;  
  13.   
  14. public interface UserService  extends BaseService<User>{  
  15.     //导出列表  
  16.     public void exportExcel(List<User> userList,  
  17.             ServletOutputStream outputStream);  
  18.     //导入用户列表  
  19.     public void importExcel(File userExcel, String userExcelFileName);  
  20.     //根据Id和账号查找用户  
  21.     public List<User> findUserByAccountAndId(String id, String account);  
  22.     //保存用户和角色信息  
  23.     public void saveUserAndRole(User user, String[] userRoleIds);  
  24.     //修改用户和角色信息  
  25.     public void updateUserAndRole(User user, String[] userRoleIds);  
  26.     //根据用户id获取其所有角色的id  
  27.     public String[] getRoleIdByUserId(String id);  
  28.     //根据用户账号密码获取用户列表  
  29.     public List<User> findUserByAccountAndPassword(String account,  
  30.             String password);  
  31. }  

[java] view plaincopy
  1. package cn.edu.hpu.tax.user.service.impl;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.Serializable;  
  6. import java.util.List;  
  7.   
  8. import javax.annotation.Resource;  
  9. import javax.servlet.ServletOutputStream;  
  10.   
  11. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  12. import org.apache.poi.ss.usermodel.Cell;  
  13. import org.apache.poi.ss.usermodel.Row;  
  14. import org.apache.poi.ss.usermodel.Sheet;  
  15. import org.apache.poi.ss.usermodel.Workbook;  
  16. import org.apache.poi.xssf.usermodel.XSSFWorkbook;  
  17. import org.springframework.stereotype.Service;  
  18.   
  19. import cn.edu.hpu.tax.core.service.impl.BaseServiceImpl;  
  20. import cn.edu.hpu.tax.core.util.ExcelUtil;  
  21. import cn.edu.hpu.tax.role.entity.Role;  
  22. import cn.edu.hpu.tax.user.dao.UserDao;  
  23. import cn.edu.hpu.tax.user.entity.User;  
  24. import cn.edu.hpu.tax.user.entity.UserRole;  
  25. import cn.edu.hpu.tax.user.entity.UserRoleId;  
  26. import cn.edu.hpu.tax.user.service.UserService;  
  27.   
  28.   
  29. @Service("userService")  
  30. public class UserServiceImpl extends BaseServiceImpl<User> implements UserService{  
  31.   
  32.   
  33.     private UserDao userDao;  
  34.       
  35.     @Resource  
  36.     public void setUserDao(UserDao userDao) {  
  37.         super.setBaseDao(userDao);  
  38.         this.userDao = userDao;  
  39.     }  
  40.       
  41.     @Override  
  42.     public void delete(Serializable id) {  
  43.         userDao.delete(id);  
  44.         //删除用户对应的所有权限  
  45.         userDao.deleteUserRoleByUserId(id.toString());  
  46.     }  
  47.   
  48.   
  49.     @Override  
  50.     public void exportExcel(List<User> userList,  
  51.             ServletOutputStream outputStream) {  
  52.         ExcelUtil.exportExcel(userList, outputStream);  
  53.     }  
  54.   
  55.   
  56.     @Override  
  57.     public void importExcel(File userExcel, String userExcelFileName) {  
  58.         try {  
  59.             FileInputStream fileInputStream = new FileInputStream(userExcel);  
  60.             //判断是否是03版本的Excel(还是07的)  
  61.             boolean is03Excel = userExcelFileName.matches("^.+\\.(?i)(xls)$");  
  62.             //1、读取工作簿  
  63.             Workbook workbook = is03Excel ? new HSSFWorkbook(fileInputStream)  
  64.                     : new XSSFWorkbook(fileInputStream);  
  65.             //2、读取工作表  
  66.             Sheet sheet=workbook.getSheetAt(0);  
  67.             //3、读取行  
  68.             if(sheet.getPhysicalNumberOfRows()>2){  
  69.                 User user=null;  
  70.                 for (int i = 2; i < sheet.getPhysicalNumberOfRows(); i++) {  
  71.                     //4、读取单元格  
  72.                     Row row=sheet.getRow(i);  
  73.                     user=new User();  
  74.                       
  75.                     //用户名  
  76.                     Cell cell1=row.getCell(0);  
  77.                     user.setName(cell1.getStringCellValue());  
  78.                     //账号  
  79.                     Cell cell2=row.getCell(1);  
  80.                     user.setAccount(cell2.getStringCellValue());  
  81.                     //所属部门  
  82.                     Cell cell3=row.getCell(2);  
  83.                     user.setDept(cell3.getStringCellValue());  
  84.                     //性别  
  85.                     Cell cell4=row.getCell(3);  
  86.                     user.setGender(cell4.getStringCellValue().equals("男"));  
  87.                     //电子邮箱  
  88.                     Cell cell5=row.getCell(4);  
  89.                     user.setEmail(cell5.getStringCellValue());  
  90.                       
  91.                     //导入用户的初始密码为123456  
  92.                     user.setPassword("123456");  
  93.                     //默认用户状态为有效  
  94.                     user.setState(User.USER_STATE_VALID);  
  95.                       
  96.                     //5、保存用户  
  97.                     userDao.save(user);  
  98.                 }  
  99.             }  
  100.             workbook.close();  
  101.             fileInputStream.close();  
  102.         } catch (Exception e) {  
  103.             e.printStackTrace();  
  104.         }  
  105.     }  
  106.   
  107.   
  108.     @Override  
  109.     public List<User> findUserByAccountAndId(String id, String account) {  
  110.         return userDao.findUserByAccountAndId(id,account);  
  111.     }  
  112.   
  113.   
  114.     @Override  
  115.     public void saveUserAndRole(User user, String[] userRoleIds) {  
  116.         //1.保存用户  
  117.         save(user);  
  118.         //2.保存用户对于的角色  
  119.         if(userRoleIds!=null){  
  120.             for (String roleId:userRoleIds) {  
  121.                 userDao.saveUserRole(new UserRole(new UserRoleId(user.getId(),new Role(roleId))));  
  122.             }  
  123.         }  
  124.     }  
  125.   
  126.   
  127.     @Override  
  128.     public void updateUserAndRole(User user, String[] userRoleIds) {  
  129.         //1.根据用户删除该用户的所有角色  
  130.         userDao.deleteUserRoleByUserId(user.getId());  
  131.         //2.更新用户  
  132.         update(user);  
  133.         //3.保存用户对应的角色  
  134.         if(userRoleIds!=null){  
  135.             for (String roleId:userRoleIds) {  
  136.                 userDao.saveUserRole(new UserRole(new UserRoleId(user.getId(),new Role(roleId))));  
  137.             }  
  138.         }  
  139.     }  
  140.   
  141.   
  142.     @Override  
  143.     public String[] getRoleIdByUserId(String id) {  
  144.         return userDao.getRoleIdByUserId(id);  
  145.     }  
  146.   
  147.   
  148.     @Override  
  149.     public List<User> findUserByAccountAndPassword(String account,  
  150.             String password) {  
  151.           
  152.         return userDao.findUserByAccountAndPassword(account,password);  
  153.     }  
  154.       
  155. }  

然后我们最好重新部署一下工程,进行测试。
经测试,我们的所有功能无误。至此,我们的BaseService抽取完毕。
0 0