我的App全栈之路(4)第一个接口的诞生

来源:互联网 发布:oa软件开发平台 编辑:程序博客网 时间:2024/05/13 21:20

接下来就是正式的代码开发了,在这里我先啰嗦一句,你们最好是把数据库先设计好,并且加入适量的测试数据,在刚开始进入代码开发的时候列好自己app里面基本要用到哪些接口,自己写一个接口文档,比如接口的地址,接口要用到什么参数,接口要返回什么数据,这样的好处就是,我们可以先在navicat里面走一遍基本的流程。


介于纯手写dao层文件,mapper文件以及model文件比较繁琐,所以这里扔一个链接关于mybatis-generator自动生成所需要的代码的方法

http://blog.csdn.net/fullbug/article/details/52879833

,可以省去很多的时间来自己写这些乱七八糟的代码,我这里还是一步步自己实现微笑



1.我在用户表里面插入了一些测试数据


我们先实现一个登陆的效果,在navicat中,我们执行一遍查找

SELECT * FROM mszd_user WHERE user_account='wanglijun'

查找结果如下


我们可以找到这条记录.但是到这里为止我们只能说明接口中的账号是正确的并不能保证密码正确,所以我们可以分析出登陆接口其实需要做两个判断一个是查找用户的结果,一个是判断密码的正确性.

接下来就好办了,我们在dao目录下新建一个UserDao.java文件,下面是我写好的代码

public interface UserDao {public User selectUserById(@Param("user_id")Integer user_id) ;public User selectUserByAccount(@Param("user_account")String user_account);public boolean insertUser(@Param("user_account") String user_account, @Param("user_password") String user_password,@Param("user_name") String user_name);public boolean updateUserPassword(@Param("user_id")int user_id,@Param("user_password")String user_password);public boolean updateUserName(@Param("user_id")int user_id,@Param("user_name")String user_name);public boolean updateUserSex(@Param("user_id")int user_id,@Param("user_sex")int user_sex);public boolean updateUserRemark(@Param("user_id")int user_id,@Param("user_remark")String user_remark);}
然后我们还需要在mapper目录下新建UserMapper.xml文件

<?xml version="1.0" encoding="UTF-8"?>    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"    "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.lin.dao.UserDao">    <!--设置domain类和数据库中表的字段一一对应,注意数据库字段和domain类中的字段名称不致,此处一定要! -->    <resultMap        id="BaseResultMap"        type="com.lin.domain.User">        <id            column="user_id"            property="user_id"            jdbcType="INTEGER" />        <result            column="user_account"            property="user_account"            jdbcType="CHAR" />        <result            column="user_name"            property="user_name"            jdbcType="CHAR" />        <result            column="user_password"            property="user_password"            jdbcType="CHAR" />        <result            column="user_remark"            property="user_remark"            jdbcType="CHAR" />        <result            column="user_sex"            property="user_sex"            jdbcType="INTEGER" />        <result            column="user_img"            property="user_img"            jdbcType="CHAR" />    </resultMap>    <!-- 通过id查询 -->    <select        id="selectUserById"        resultMap="BaseResultMap"> select * from mszd_user where user_id = #{user_id}    </select>    <!-- 通过account查询 -->    <select        id="selectUserByAccount"        resultMap="BaseResultMap"> select * from mszd_user where user_account = #{user_account}    </select>         <!-- 注册插入用户 -->    <insert id="insertUser"> insert into mszd_user (user_account,user_password,user_name) VALUES (#{user_account},#{user_password},#{user_name})    </insert>        <update id="updateUserPassword">    update mszd_user set user_password=#{user_password} where user_id=#{user_id}    </update>        <update id="updateUserName">    update mszd_user set user_name=#{user_name} where user_id=#{user_id}    </update>        <update id="updateUserSex">    update mszd_user set user_sex=#{user_sex} where user_id=#{user_id}    </update>    <update id="updateUserRemark">    update mszd_user set user_remark=#{user_remark} where user_id=#{user_id}    </update></mapper>

在这个 xml文件中<mapper namespace="com.lin.dao.UserDao">这一句就是和dao目录下的接口文件做映射,resultMap中列名,属性名和类型不要写错,不然会报错,这里不懂mybatisxml文件怎么写的可以先百度一波,我们在UserDao里面所有的参数都用@param注解,这样在xml文件中我们直接使用#{}来获取我们的参数,这里申明一下不只是这一种获取参数的方法,需要自己去看mybatis相关的文档.

接着我们在service目录下面创建UserService.java接口文件

public interface UserService {User selectUserById(Integer user_id);User selectUserByAccount(String user_account);boolean insertUser(String user_account, String user_password, String user_name);boolean updateUserPassword(int user_id, String user_password);boolean updateUserName(int user_id, String user_name);boolean updateUserSex(int user_id, int user_sex);boolean updateUserRemark(int user_id, String user_remark);}
在service.imp(这个目录是我创建出来的和教程中的不一样)目录下创建UserServiceImp.java类实现UserService

@Servicepublic class UserServiceImpl implements UserService{@Autowiredprivate UserDao userDao;@Overridepublic User selectUserById(Integer user_id) {// TODO Auto-generated method stubreturn userDao.selectUserById(user_id);}@Overridepublic User selectUserByAccount(String user_account){// TODO Auto-generated method stubreturn userDao.selectUserByAccount(user_account);}@Overridepublic boolean insertUser(String user_account,String user_password,String user_name) {// TODO Auto-generated method stubreturn userDao.insertUser( user_account, user_password,user_name);}@Overridepublic boolean updateUserPassword(int user_id, String user_password) {// TODO Auto-generated method stubreturn userDao.updateUserPassword(user_id, user_password);}@Overridepublic boolean updateUserName(int user_id, String user_name) {// TODO Auto-generated method stubreturn userDao.updateUserName(user_id, user_name);}@Overridepublic boolean updateUserSex(int user_id, int user_sex) {// TODO Auto-generated method stubreturn userDao.updateUserSex(user_id, user_sex);}@Overridepublic boolean updateUserRemark(int user_id, String user_remark) {// TODO Auto-generated method stubreturn userDao.updateUserRemark(user_id, user_remark);}}
这个service后面我们就可以在controller里面使用,注意service类要用@service注解,该类中有一个UserDao的属性userDao,使用@ @Autowired注解.相关的知识,大家可以百度,我们主要是奔着目的地去的.

最后是我们的重头戏 了,开始写我们的UserController,我们新建一个java类

@Controller@RequestMapping("/user")@ResponseBodypublic class UserController {@Resourceprivate UserService userService;@RequestMapping(value="/login.do",method=RequestMethod.POST)public BaseResponse<User> login(@RequestParam("user_account")String user_account,@RequestParam("user_password")String user_password){BaseResponse<User> baseResponse=new BaseResponse<>();try {User user=userService.selectUserByAccount(user_account);if(user!=null){if(user_password.equals(user.getUser_password())){baseResponse.setSuccess(true);baseResponse.setMessage("登录成功");baseResponse.setData(user);}else{baseResponse.setSuccess(false);baseResponse.setMessage("密码不正确");}}else{baseResponse.setSuccess(false);baseResponse.setMessage("用户名不正确");}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();baseResponse.setSuccess(false);baseResponse.setMessage(Constant.SERVER_ERROR);}return baseResponse;}@RequestMapping(value="/register.do",method=RequestMethod.POST)public BaseResponse register(@RequestParam("user_account")String user_account,@RequestParam("user_password")String user_password){BaseResponse baseResponse=new BaseResponse<>();if(user_account==null){baseResponse.setSuccess(false);baseResponse.setMessage("账号为空");return baseResponse;}if(user_password==null){baseResponse.setSuccess(false);baseResponse.setMessage("密码为空");return baseResponse;}try {User u=userService.selectUserByAccount(user_account);if(u!=null){baseResponse.setSuccess(false);baseResponse.setMessage("用户已存在");}else{String user_name="陌上紫丁"+user_account;if(userService.insertUser(user_account,user_password,user_name)){baseResponse.setSuccess(true);baseResponse.setMessage("注册成功");}else{baseResponse.setSuccess(false);baseResponse.setMessage("注册失败");}}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();baseResponse.setSuccess(false);baseResponse.setMessage(Constant.SERVER_ERROR);}return baseResponse;}@RequestMapping(value="/info.do",method=RequestMethod.GET)public BaseResponse<User> userInfo(@RequestParam("user_id")int user_id){BaseResponse<User> baseResponse=new BaseResponse<>();try {User u=userService.selectUserById(user_id);if(u!=null){baseResponse.setData(u);baseResponse.setSuccess(true);baseResponse.setMessage("请求成功");}else{baseResponse.setSuccess(false);baseResponse.setMessage("请求失败");}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();baseResponse.setSuccess(false);baseResponse.setMessage(Constant.SERVER_ERROR);}return baseResponse;}@RequestMapping(value="/updateRemark.do",method=RequestMethod.POST)public BaseResponse updateRemark(@RequestParam("user_id")int user_id,@RequestParam("user_remark")String user_remark){BaseResponse baseResponse=new BaseResponse<>();try {boolean success=userService.updateUserRemark(user_id, user_remark);if(success){baseResponse.setSuccess(true);baseResponse.setMessage("请求成功");}else{baseResponse.setSuccess(false);baseResponse.setMessage("请求失败");}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();baseResponse.setSuccess(false);baseResponse.setMessage(Constant.SERVER_ERROR);}return baseResponse;}}
controller类需要用@Controller注解,@RequestMapping("/user")的意思就是我们该类中的所有请求的地址都是在/user下面的,比如登陆接口就变成了项目基地址+/user+/login.do这个样子,@responseBody注解就是非常重要的了,因为这个我们可以直接返回json,很强大!

我们着重看下登陆接口的实现方法,参数为一个账号一个密码,这个不需要多说,我们先上来二话不说,通过这个user_account去查找这个用户是否存在,如果不存在改用户那么返回的信息可以是用户不存在之类的信息,如果用户存在我们就判断密码,如果密码不匹配那么就返回密码不正确.

这里我封装了一个统一返回的数据格式类BaseResonse,我们可以看下这个东西长什么样子

public class BaseResponse<T> {private boolean success;private String message;private T data;public boolean isSuccess() {return success;}public void setSuccess(boolean success) {this.success = success;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public T getData() {return data;}public void setData(T data) {this.data = data;}}

一共3个东西,做安卓的一下子就明白这是个啥了吧?大笑

最后我们运行下我们的程序,没有配置tomcat 的同学赶紧了,在我的这个程序跑起来之前,我遇到过很多很多的问题,但是都被我一个个解决了,我相信你们也是可以的,毕竟有百度,谷歌害羞,嗯,程序正常运行,我这里采用的一个post工具就是firefox自带的,长这样的一个东西


我们写好我们请求的地址和参数,然后查看接口返回的接口,我们先把账号写错,后面多写一个n


嗯,不错不错就是贼个样子,接着我们把密码写错,后面多写一个7


嗯嗯,不错不错,最后我们把账号密码都写正确看看???


呦西呦西,这就是我们想要的结果对不对????

最后申明一下,在接口中我没有进行空的判断因为我自己会在前端进行控制不让参数为空,但是在实际需求中你们自己要掂量着办!

代码和sql以及逻辑写的不好的地方,大佬路过的时候记得和我说,说不定我就请你吃饭了!其实后面的接口的开发都和这里差不多,后面我会更多的去和你们说这个SQL怎么写,其实主要就是写SQL,希望和大家一起探讨




原创粉丝点击