实战 Java 第3天:开发注册、登录接口

前言

在前面的《实战 Java 第2天》学习了如何连接数据库,今天开始编写正式的业务接口,实现注册和登录功能。

一、创建 entity 实体类

注册接口和登录接口需要用到的属性就是用户名 username、密码 password、手机号 phone。

新建 entity 文件包

  • 在此文件包下面新建 User 类,来用抽象用户信息,内容如下:
package com.dingding.entity;

/**
 * Created by xpwu on 2019/6/18.
 */
public class User {
    public String username;
    public int password;
    public String phone;

    public User(){}
    public User(String username, int password, String phone) {
        this.username = username;
        this.password = password;
        this.phone = phone;
    }

    public String getName(){
        return  username;
    }
    public void setName(String username){
        this.username = username;
    }
    public int getPassword(){
        return  password;
    }
    public void setPassword(int password){
        this.password = password;
    }
    public String getPhone(){
        return phone;
    }
    public void setPhone(String phone){
        this.phone= phone;
    }
}
  • 在此文件包下面新建 Response 类,用来返回接口调用信息描述(成功与否)。内容如下:
package com.dingding.entity;

/**
 * Created by xpwu on 2019/6/28.
 */
public class Response {
    String msg;
    int code;
    Boolean isSuc = true;
    public Response(){}
    public Response(Boolean isSuc,String msg, int code) {
        this.msg = msg;
        this.code = code;
        this.isSuc = isSuc;
    }
    public Boolean getIsSuc() {
        return isSuc;
    }
    public void setIsSuc(Boolean isSuc) {
        this.isSuc = isSuc;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public int getCode() {
        return code;
    }
    public void setCode(int code) {
        this.code = code;
    }
}

所以 entity 下面有两个实体类,User 类和 Response 类。

二、创建 service 服务类

根据业务场景,需要提供一个注册服务与登录服务。分别为增加用户信息与根据用户名查询用户信息。

  • 新建 service 文件包,在此文件包下新建 UserService 类编写接口,内容如下:
package com.dingding.service;
import com.dingding.entity.User;
import java.util.List;

/**
 * Created by xpwu on 2019/6/18.
 */
public interface UserService{
    int addUser(String username,int password,String phone);//用于注册时,添加用户
    List<User> queryByUsername(String username);//用于登陆时,验证用户
}
  • 在 service 文件包下面新建 impl 文件包,在 impl 文件包下新建 UserServiceImpl 类来实现 UserService 接口。
package com.dingding.service.impl;
import com.dingding.entity.User;
import com.dingding.mapper.UserMapper;
import com.dingding.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

/**
 * Created by xpwu on 2019/6/28.
 */
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    UserMapper userMapper;
    public int addUser(String username,int password,String phone){
        User user = new User(username,password,phone);
        int count = userMapper.addUser(user);
        return count;
    }
    public List <User> queryByUsername(String username){
        List <User> userList = userMapper.queryByUsername(username);
        return userList;
    }
}

三、创建 mapper 类

根据 service 服务类创建对应的 mapper 类。
新建 mapper 文件包,在此文件包下新建 UserMapper 类,内容如下:

package com.dingding.mapper;
import com.dingding.entity.User;
import org.springframework.stereotype.Repository;
import java.util.List;

/**
 * Created by xpwu on 2019/6/27.
 */
@Repository
public interface UserMapper{
   int addUser(User user);
   List<User> queryByUsername(String username);
}

四、创建 sql 语句

在 resources 文件夹下,新建 mapper 文件夹,在此文件夹下新建相关的 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.dingding.mapper.UserMapper">
    <resultMap id="BaseResultMap" type="com.dingding.entity.User">
        <result column="username" jdbcType="VARCHAR" property="username" />
        <result column="password" jdbcType="INTEGER" property="password" />
        <result column="phone" jdbcType="VARCHAR" property="phone" />
    </resultMap>
    <insert id="addUser" parameterType="com.dingding.entity.User">
        INSERT INTO `user` VALUES(#{username},#{password},#{phone})
    </insert>
    <select id="queryByUsername" resultType="com.dingding.entity.User">
        SELECT * FROM `user` WHERE username = #{username}
    </select >
</mapper>

五、调用服务,处理业务逻辑

新建 controller 文件包,在此文件包下新建 UserController 类,在此类中调用调用相关服务并处理逻辑,内容如下:

  • 注册接口的逻辑处理
  1. 判断用户名、密码、手机号是否为空,如果为空,注册失败;
  2. 如果都不为空,根据用户名查询是否有重复用户名,如果有,注册失败;
  3. 如果没有重复用户名,注册成功。
  • 登录接口的逻辑处理
  1. 判断用户名、密码是否为空;
  2. 如果都不为空,根据用户名查询数据库对应的密码;
  3. 如果密码有误,登陆失败;
  4. 如果密码正确,登陆成功。
package com.dingding.controller;
import com.dingding.entity.Response;
import com.dingding.entity.User;
import com.dingding.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;

/**
 * Created by xpwu on 2019/6/18.
 */
@RestController
public class UserController {
    @Autowired
   private UserService service;
   @RequestMapping(value = "/register",method = RequestMethod.POST)
   public Response register(@RequestBody Map<String, String> person){
       String username = person.get("username");
       int password = Integer.parseInt(person.get("password"));
       String phone = person.get("phone");
       //1.判断用户名、密码、手机号是否为空
       if(username != null && password != 0 && phone != null){
           List<User> users =  service.queryByUsername(username);
            //2.判断是否有重复用户名
           if(users!=null && users.size()>0){
               return new Response(true,"注册失败,用户名重复,请更换",-1);
           }else {
               int count = service.addUser(username,password,phone);
               if(count>0){
                  //3.没有重复用户名,注册成功
                   return new Response(true,"注册成功",1);
               }else {
                   return new Response(true,"注册失败",-1);
               }
           }
       }else{
           return new Response(true,"注册失败,请检查用户名、密码、手机号是否为空",-1);
       }
   }
    @RequestMapping(value = "/login",method = RequestMethod.POST)
    public Response login(@RequestBody Map<String, String> person){
        String username = person.get("username");
        int password =Integer.parseInt(person.get("password"));      
        //1. 判断用户名、密码是否为空
        if(username != null && password != 0 ){
         List<User> users =  service.queryByUsername(username);
         //2. 判断用户名是否存在
            if(users!=null && users.size()>0){
                User user = users.get(0);
                  //3. 判断密码是否正确
                if(password == user.getPassword()){
                   //4. 密码正确,登陆成功
                    return new Response(true,"登陆成功",1);
                }else {
                    return new Response(false,"登陆失败,密码错误",-1);
                }
            }else {
                return new Response(true,"登陆失败,用户名不存在",-1);
            }
        }else {
            return new Response(true,"登陆失败,请检查用户名、密码是否为空",-1);
        }
    }
}

六、测试接口是否成功

  1. 使用 postman 验证接口。
  • 验证注册接口
    1)选择请求方式为 POST, 在地址栏中输入 http://localhost:8080/register 在 Body 中添加相关参数。
    在这里插入图片描述
    2)执行 Send,选择 Params,选择Body,得到如下结果,验证成功。
    在这里插入图片描述
  • 验证登录接口
    1)将地址改为登录接口地址,输入用户名和密码;
    在这里插入图片描述
    2)选择 send,查看结果。
    在这里插入图片描述
  1. 查看数据库是否添加成功。
    在这里插入图片描述

七、总结

以下是需要注意的几点。

  1. 使用 postman 进行验证的时候,相应的请求方式,接口地址,请求参数一定要看清楚,一 一对应。
  2. 因为参数对象是 json 格式,所以记得对象末尾的,不能有。
    在这里插入图片描述
  3. 在接收参数时,如果对象是 int 类型,需要进行转换,如int password =Integer.parseInt(person.get("password"));
  4. 在写 xml 文件的时候,int 类型的 jdbcType 为 INTEGER。即 <result column="password" jdbcType="INTEGER" property="password" />
  5. mapper 包的接口名与 xml 中的 id 保持一致。
    在这里插入图片描述
    在这里插入图片描述
  • 81
    点赞
  • 225
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
Java接口自动化测试实战案例可以以某电商网站的商品信息接口为例进行说明。首先,我们可以编写一个Java接口自动化测试框架,使用RestAssured库来发送HTTP请求并验证返回的数据。接着,我们编写测试用例,验证商品信息接口的各种情况,比如查询存在的商品、查询不存在的商品、查询商品详情等。在测试用例中,我们可以通过断言来验证接口返回的状态码、响应数据的格式、特定字段的值等。为了保证测试用例的健壮性,我们可以加入参数化、数据驱动等技术,让测试用例可以反复运行,并覆盖不同的场景。 在实际执行测试用例时,我们可以使用Jenkins等持续集成工具来定时触发接口自动化测试,并能够及时发现接口的异常情况。如果出现异常,我们可以通过发送报警邮件或者集成到项目管理工具,比如JIRA,来及时通知开发人员和相关负责人。 另外,在测试用例编写过程中,我们还可以加入Mock服务,模拟第三方服务的响应,以便测试某些特定场景,比如测试接口超时、异常返回等情况。还可以结合断言库、日志打印等技术,来提高测试用例的可维护性和可读性。 通过这样的java接口自动化测试实战案例,我们可以全面覆盖接口的各种场景,验证接口的健壮性和稳定性,保证接口在不断迭代过程中保持高质量。同时,也能提高自动化测试的效率,减少重复的人工测试,将更多的精力放在提升产品质量和用户体验上。
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值