1、首先我们完善我们的项目结构如下图:
这里我们要注意以下dataobject(dto)和model、dao和viewobject(vo)层的区别:
Model层是面向业务的,我们是通过业务来定义Model的,dao层对应于数据库中存储的数据(数据表),VO对应于页面上需要显示的数据(表单),dto是用于数据传输的,说白了就是用来放数据的,不用它来涉及逻辑操作。关于这几个领域模型的实体类我会通过一个具体的接口来展示他们的功能。
2、下面我们来梳理以下书写RESTFUL风格的接口时的流程:
就按MVC模式的开发模式来,我们项目中包含的结构层分别是view,controller,service,dao。
view是前台页面,用户发送请求时从前端的页面开始的,前端get到这个请求后会把请求和顺带参数信息传送到后台,后台接受这个请求找到对应的接口去执行对应的controller里的对应的方法,然后执行,然后controller会调用service层的业务逻辑,service有会去访问dao层来连接数据库。
Controller层,这里以UserController编写为例,这一层是要把具体的信息返回给前端的,要调用Service里面的接口拿取数据返回给前端,具体编写如下:
这里我们自动注入了UserService,然后调用了它的getUserById方法,通过指定id获取用户信息并通过UserModel返回给前端(其实这样时不符合企业级应用开发规范的,),下面我们来看一下UserService里面的getUserById方法。
Service层:这里以UserService为例:
Service层我们一般只写接口方法,具体的逻辑实现放到ServiceImpl里面实现。下面我们去ServiceImpl里面看一下具体的实现。
ServiceImpl层:这里以UserServiceImpl为例:
我们来分析一下这几段代码:
首先我们注入了dao层中的UserDOMapper和UserPasswordDOMapper,是我们用mybatis逆向工程生成的mapper层,mapper,其实就是dao层。对数据库进行数据持久化操作,它的方法语句是直接针对数据库操作的。
例如我们来看一下UserDOMapper中的代码,这里面都是一些增删改查的方法:
再回到我们的UserServiceImpl,在这里我们实现了UserService里面的方法 getUserById,我们看一下这个方法:
首先通过userDOMapper的方法根据id获取用户信息UserDO。现在我们来考虑一下如何将用户信息表的用户密码表相互关联。其实我们在设计表的时候已经将他们关联了,在用户密码表我们设计了一个user_id的字段:
现在我们可以通过用户id来获取用户的密码信息,但是我们来看一下userPasswordDOMpper里面的方法:
这里面查询的方法只有通过PrimaryKey查询,即只有通过表的主键ID进行查询,没有通过用户id进行查询用户密码的方法,不要着急,我们可以自己去写这个方法!打开UserPasswordDOMapper.xml文件找到如下SQL:
我们完全可以根据这个SQL重新写一个根据用户ID查询用户信息的语句如下:
写完这个SQL以后记得去dao层的UserPasswordDOMapper里面实现这个方法如下:
这样我们就可以通过userDO的getId方法获取用户的userId,再通过userPasswordDOMpper的方法通过用户id获取用户密码。
现在我们得到了UserDO和UserPasswordDO,这是数据传输层数据,我们要把他们转换成逻辑层Model数据。
这个方法就是将DO数据转换为Model数据的:
使用了Java自带的BeanUtils方法先将UserDO里面的数据copy到UserModel中,另外UserDo里面是没有密码信息的,这里单独将密码信息通过userModel.setEncrptPassword放入Model中,密码的具体获取通过userPasswordDO.getEncrptPassword()。
最后ServiceImpl将Model数据返回。
这是一个接口的完整编写流程,综合业务逻辑为:
Controller-->service接口-->serviceImpl-->dao-->mapper-->db。
再直白一些说就是:
Controller接收前端的参数告诉Service我要增加用户或者删除用户,并且要返回给前端结果;
Service:负责处理增加或者删除用户的逻辑,一般通过ServiceImpl实现
Dao层:负责把service交代的东西真正的删掉,即在数据库中删除。
下面我们测试我们写的这个接口,启动程序。
启动成功,进入网页测试一下接口:
OK,这个接口测试成功!
接口是测试成功了,但是现在我们来想一下更深层次的东西,前端直接拿到了用户的密码,如果你是用户,你乐意吗?所以这样直接把Model层直接返回给前端对系统用户来说是极度不负责的!下面我们要改进这一块!
首先我们在controller包下面新建一个viewobject包,并且在这个包下面新建一个UserVO类如下图:
这里我们只将前端需要的信息返回给它,不需要的或者敏感的信息不再返回。
下面再去Controller层改写一下返回给前端的数据:
这里我们将最后返回给前端的数据换成了我们刚才定义的UserVO,这样用户的密码等信息就不会返回给前端了,下面我们来测试一下:
启动程序,然后在网页上登录接口:
经过测试,密码信息没有返回给前端,满足了我们的要求!
这样,一个健壮的优雅的接口我们就写好了!!!
这一部分就先到这儿,下一部分我们会定义一下通用的接口返回对象和编写用户模块开发的剩余接口!
记得将我们这一部分写的代码提交一下:
git add .
git commit -m 'user_develop'
git push