UserService实现(注意编程思维的养成)

根据面向接口编程的思维来讲,在Service中核心是实现Dao层,并调用Dao层。
UserDao层通过单元测试了,现在中心就应该放在业务逻辑的实现,毕竟数据持久化已经实现了。
从服务端程序的角度看来,用户的主要业务有注册、登录、注销登录、注销帐号等等,这里我们先拿注册来说事。

用户注册流程分析(用户角度):
填写帐号相关信息
提交注册信息
服务器返回是否注册成功

用户注册流程分析(服务器角度):
收到用户注册请求
解包数据→封装到UserBean解包数据失败(请求信息异常),返回错误提示信息
针对具体的用户信息检查是否符合标准不符合检查标准,返回对应的错误提示
通过检查,调用Dao检查是否存在同样的用户数据库已经存在相同的用户信息,不能重复添加,返回错误提示信息
不存在同样的用户,添加新用户,并返回成功的提示信息

流程图反映如下:

ssm框架用户行为解析流程图

自定义异常
新建一个与daodomain同级的包exception来存放自定义的异常
所有的自定义异常都要继承于Exception
UserAireadyExistException 用户已经存在异常

public UserAireadyExistException(String s) {super(s);}public UserAireadyExistException(String message, Throwable cause) {super(message, cause);}

下面的UserCanNotBeNullException (用户为空异常),UserNameCanNotBeNullException(用户名为空异常),UserPwdCanNotBeNullException(用户密码为空)异常代码相类似

还有个其他异常

public class OtherThingsException extends Exception {public OtherThingsException(String message) {super(message);}public OtherThingsException(Exception e){this(e.getMessage());}public OtherThingsException(String message, Throwable cause) {super(message, cause);}
}

可能会抛出的异常写完了,下面来实现用户注册的Service
首先还是先写个BaseService接口,用泛型解耦

public interface BaseService<T> {void add(T t) throws Exception;
}

用户注册接口
不同对象的业务体系不同,BaseService并不能完全替代不同对象的具体行为表现
UserService

public interface UserService extends BaseService<User>{void add(User user) throws Exception;User findUser(User user) throws Exception;
}
实例化用户注册接口UserServiceImpl

service包下创建一个子包,叫serviceImpl,用来存放业务层接口实现类
UserServiceImpl

@Service("userService")
public class UserServiceImpl implements UserService{@Autowiredprivate UserDao userDao;/*** 添加用户,一般来说需要检查用户为空、用户名为空、密码为空*/public void add(User user) throws UserCanNotBeNullException, UserNameCanNotBeNullException, UserPwdCanNotBeNullException, UserAireadyExistException, OtherThingsException {//先检查用户是否存在if (null == user) {//抛出用户为空的自定义异常throw new UserCanNotBeNullException("User can not be Null");}//用户名不能为空检查if (StringUtils.isEmpty(user.getLoginId())) {//抛出用户名为空的自定义异常throw new UserNameCanNotBeNullException("User name can not be Null");}//用户密码不能为空检查if (StringUtils.isEmpty(user.getPwd())) {//抛出用户密码为空的自定义异常throw new UserPwdCanNotBeNullException("User name can not be Null");}//由于我这个是管理系统,根据业务需求来说,我们的用户基本信息都是不能为空的//基本信息包括:姓名、年龄、用户名、密码、性别、手机号,年龄大于18if ( StringUtils.isEmpty(user.getSex())|| user.getAge() < 18|| StringUtils.isEmpty(user.getCellNumber())) {//其他综合异常throw new OtherThingsException("Some use's base info can not be null");}//已经存在相同用户if (null != userDao.findOneById(user.getLoginId())) {//存在相同的用户异常throw new UserAireadyExistException("Register User Failed,Because the  user Aiready exist");}int result = 0; //受影响的行数默认为0try {result = userDao.add(user);} catch (Exception e) {System.out.println("添加用户失败,用户已经存在");//其他用户添加失败异常throw new OtherThingsException(e);}if (result > 0)System.out.println("添加用户成功");}/*** 查找用户** @param user 用户bean* @throws Exception*/public User findUser(User user) throws Exception {return userDao.findOneById(user.getLoginId());}/*** 用于更新sessionId*/public void updateLoginSession(String sessionId, String loginId) {userDao.updateLoginSession(sessionId, loginId);}
}

在这里我们用到了StringUtils这个JAVA的工具类

http://www.jianshu.com/p/2eb9e42ecf44
写完每个Service后,都需要针对具体的对象的行为进行单元测试,UserServiceTest代码如下:
同样,要继承基础测试类

public class UserServiceTest extends BaseTest{@Autowiredprivate UserServiceImpl userService;//此处直接使用UserService的实现类,主要是方便抛出异常,然后异常出现时候可以针对性的处理@Testpublic void testAdd() {User user = new User();user.setLoginId("20171");user.setName("意识流1");user.setPwd("123456");user.setSex("不知道");user.setDuty("老大");user.setCellNumber("12345678910");user.setAge(10);try {userService.add(user);} catch (UserCanNotBeNullException e) {//用户不能为空异常抛出e.printStackTrace();} catch (UserNameCanNotBeNullException e) {//用户名不能为空e.printStackTrace();} catch (UserPwdCanNotBeNullException e) {//用户密码不能为空e.printStackTrace();} catch (UserAireadyExistException e) {//用户存在抛出e.printStackTrace();} catch (OtherThingsException e) {//其他综合异常或是不能处理的异常e.printStackTrace();}}@Testpublic void testFindUser() throws Exception {User user = new User();user.setLoginId("20171");User result = null; //受影响的行数默认为0try {result = userService.findUser(user);} catch (Exception e) {e.printStackTrace();System.out.println("查找用户失败");}if (null!=result)System.out.println("查找用户成功\n"+result.toString());}
}

同样的,我们的Service的测试代码执行后,我们可以在mysql中看到具体的数据变化

主要参考于大牛Clone丶记忆的SSM集成之路

spring+springMVC+mybatis的整合 part5相关推荐

  1. Spring+SpringMVC+MyBatis+easyUI整合优化篇(十三)数据层优化-表规范、索引优化

    本文提要 最近写的几篇文章都是关于数据层优化方面的,这几天也在想还有哪些地方可以优化改进,结合日志和项目代码发现,关于数据层的优化,还是有几个方面可以继续修改的,代码方面,整合了druid数据源也开启 ...

  2. Spring+SpringMVC+MyBatis+easyUI整合优化篇(五)MockMvc服务端的单元测试

    日常啰嗦 承接前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例>,已经讲解了dao层和service层的单元测试,还有控制器这层也不能 ...

  3. SSM框架Spring+SpringMVC+MyBatis——详细整合教程

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎所有的JDBC代码和参 ...

  4. Spring+SpringMVC+MyBatis+easyUI整合基础篇(一)项目简述及技术选型介绍

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 萌芽阶段 很久之前就开始打算整理一下自己的技术博客了,由于各种原因( ...

  5. springmvc连接mysql_挺详细的spring+springmvc+mybatis配置整合|含源代码

    大家好,我是雄雄,今天来带着大家来配置一下SSM(spring+springmvc+ mybatis)框架. 01 新建java web项目 直接在myeclipse中,新建一个web项目即可. 02 ...

  6. Spring+SpringMVC+Mybatis简单整合 图书管理项目 实现增删改查

    Spring+SpringMVC+Mybatis项目 tomcat7插件配置 <build><plugins><plugin><groupId>org. ...

  7. Spring+SpringMVC+Mybatis框架整合流程

    一:基本步骤 新建Maven项目,导入相关依赖.(推荐) ----–Mybatis配置 ------ 新建entity包,并根据数据库(表)新建相关实体类. 新建dao包,并根据业务创建必要的mapp ...

  8. 最详细的Spring+SpringMVC+Mybatis框架整合及mybatis分页讲解,适合初级者

    最详细的关于idea整合ssm框架讲解 一个关于brand(品牌)的项目 [ssm框架搭建源代码及mysql数据库数据]链接:https://pan.baidu.com/s/1eBogklK0rFLj ...

  9. spring,springmvc,mybatis基本整合(一)--xml文件配置方式(1)

    **这个整合.仅仅是最主要的整合,而且是xml配置文件的方式之中的一个,即当中的mybatis是採用非mapper接口的方式.(第二遍採用mapper接口方式.第三遍採用注解的方式:第四篇採用注解基于 ...

最新文章

  1. linux下oracle自动创建实例脚本
  2. 自动ftp脚本的使用
  3. 如何在TFS中用命令行提交更新
  4. 简单web服务器学习总结
  5. 科大星云诗社动态20210414
  6. SQLite中的SQL
  7. java安全编码指南之:文件和共享目录的安全性
  8. 技术人最不该忽视可视化数据分析!
  9. html5和极速模式,浅谈360浏览器6.0版本极速模式与兼容模式_蓝戒的博客
  10. 简单python脚本实例-五个python常用运维脚本面试题实例
  11. 【连载】穿越计算机的迷雾——读书笔记
  12. MFC-利用内存映射文件来读写文件
  13. python中sklearn.datasets.make_blobs()函数用法
  14. 为什么粘贴是crtl+v
  15. 异构图注意力网络(Heterogeneous Graph Attention Network)
  16. 用Python批量下载视频
  17. C语言中chdir()使用
  18. 【工具】批量修改文件名
  19. Java 书籍阅读计划
  20. 1.1 编辑楼层标高

热门文章

  1. Objective-C语法汇总
  2. Java——递归调用
  3. JavaBean fields TO ExtjsMode fields
  4. ios 自动内存管理 ARC
  5. Druid使用ConfigFilter
  6. javascript瀑布流效果
  7. 程序员在囧途之我是一头牛
  8. 005 反转单链表(迭代递归)
  9. PHP 入门 - 7.Web技术
  10. CSS clear 清除浮动,兼容各浏览器