spring+springMVC+mybatis的整合 part5
UserService实现(注意编程思维的养成)
根据面向接口编程的思维来讲,在Service
中核心是实现Dao
层,并调用Dao
层。
UserDao
层通过单元测试了,现在中心就应该放在业务逻辑的实现,毕竟数据持久化已经实现了。
从服务端程序的角度看来,用户的主要业务有注册、登录、注销登录、注销帐号等等,这里我们先拿注册来说事。
用户注册流程分析(用户角度):
填写帐号相关信息
提交注册信息
服务器返回是否注册成功
用户注册流程分析(服务器角度):
收到用户注册请求
解包数据→封装到UserBean
解包数据失败(请求信息异常),返回错误提示信息
针对具体的用户信息检查是否符合标准不符合检查标准,返回对应的错误提示
通过检查,调用Dao
检查是否存在同样的用户数据库已经存在相同的用户信息,不能重复添加,返回错误提示信息
不存在同样的用户,添加新用户,并返回成功的提示信息
流程图反映如下:
ssm框架用户行为解析流程图
自定义异常
新建一个与dao
,domain
同级的包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相关推荐
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(十三)数据层优化-表规范、索引优化
本文提要 最近写的几篇文章都是关于数据层优化方面的,这几天也在想还有哪些地方可以优化改进,结合日志和项目代码发现,关于数据层的优化,还是有几个方面可以继续修改的,代码方面,整合了druid数据源也开启 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(五)MockMvc服务端的单元测试
日常啰嗦 承接前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例>,已经讲解了dao层和service层的单元测试,还有控制器这层也不能 ...
- SSM框架Spring+SpringMVC+MyBatis——详细整合教程
2019独角兽企业重金招聘Python工程师标准>>> 摘要: 包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎所有的JDBC代码和参 ...
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(一)项目简述及技术选型介绍
作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 萌芽阶段 很久之前就开始打算整理一下自己的技术博客了,由于各种原因( ...
- springmvc连接mysql_挺详细的spring+springmvc+mybatis配置整合|含源代码
大家好,我是雄雄,今天来带着大家来配置一下SSM(spring+springmvc+ mybatis)框架. 01 新建java web项目 直接在myeclipse中,新建一个web项目即可. 02 ...
- Spring+SpringMVC+Mybatis简单整合 图书管理项目 实现增删改查
Spring+SpringMVC+Mybatis项目 tomcat7插件配置 <build><plugins><plugin><groupId>org. ...
- Spring+SpringMVC+Mybatis框架整合流程
一:基本步骤 新建Maven项目,导入相关依赖.(推荐) ----–Mybatis配置 ------ 新建entity包,并根据数据库(表)新建相关实体类. 新建dao包,并根据业务创建必要的mapp ...
- 最详细的Spring+SpringMVC+Mybatis框架整合及mybatis分页讲解,适合初级者
最详细的关于idea整合ssm框架讲解 一个关于brand(品牌)的项目 [ssm框架搭建源代码及mysql数据库数据]链接:https://pan.baidu.com/s/1eBogklK0rFLj ...
- spring,springmvc,mybatis基本整合(一)--xml文件配置方式(1)
**这个整合.仅仅是最主要的整合,而且是xml配置文件的方式之中的一个,即当中的mybatis是採用非mapper接口的方式.(第二遍採用mapper接口方式.第三遍採用注解的方式:第四篇採用注解基于 ...
最新文章
- linux下oracle自动创建实例脚本
- 自动ftp脚本的使用
- 如何在TFS中用命令行提交更新
- 简单web服务器学习总结
- 科大星云诗社动态20210414
- SQLite中的SQL
- java安全编码指南之:文件和共享目录的安全性
- 技术人最不该忽视可视化数据分析!
- html5和极速模式,浅谈360浏览器6.0版本极速模式与兼容模式_蓝戒的博客
- 简单python脚本实例-五个python常用运维脚本面试题实例
- 【连载】穿越计算机的迷雾——读书笔记
- MFC-利用内存映射文件来读写文件
- python中sklearn.datasets.make_blobs()函数用法
- 为什么粘贴是crtl+v
- 异构图注意力网络(Heterogeneous Graph Attention Network)
- 用Python批量下载视频
- C语言中chdir()使用
- 【工具】批量修改文件名
- Java 书籍阅读计划
- 1.1 编辑楼层标高