前端入门JAVA:Spring-web项目实现登录、注册接口

0 阅读6分钟

专栏前言

作为一名前端开发,为了扩展自身技能,准备入门级的学习一下java后端相关知识。虽然岗位是前端,但我觉得不能算是卷。

因为我们日常开发中几乎每天都要和后端同学打交道,如果能够掌握后端基本知识的话,我相信在前端开发工作中也会有很大作用。 技多不压身,如果这个过程让你感到痛苦那大可不必;反之,学习新事物的过程中能让自己更加自信、有成就感时,我觉得是有意义的!

记得是2年前学习过一个入门级的java项目,但现在可以说是忘记的差不多了。最近打算从0开始学习,并输出文章,方便自己日后复习查阅,也希望帮助到其他同学。

专栏往期推荐:
前端入门JAVA:基础开发环境配置
前端入门JAVA:创建第一个java项目
前端入门JAVA:Spring-web项目实现第一个本地接口
前端入门JAVA:Spring-web项目配置数据库连接

前言

上篇文章中我们成功配置连接好 mysql 数据库、新建好了数据库表。本篇将实现账号注册、登陆接口。

实现注册、登陆接口

根据框架特点,我们自底向上开发,所以将按照:entity->service->serviceImpl->controller 的顺序逐步开发。

目录结构:

image.png

entity(实体类)

接上篇 User 实体类。

service(服务层(包含业务逻辑层))

定义 UserService 接口,定义addUser、queryByUsername方法

  • UserService.java
package com.example.demomaven.service;
import com.example.demomaven.entity.User;
import java.util.List;
public interface UserService {
    public User getUserInfo();
    int addUser(String username, int password);
    List<User> queryByUsername(String username);
}

serviceImpl(实现接口)

实现 UserService 接口的所有方法。 实现时该类时必须加 @Service 注解。

  • UserServiceImpl.java
package com.example.demomaven.service.impl;

import com.example.demomaven.mapper.UserMapper;
import org.springframework.stereotype.Service;
import com.example.demomaven.entity.User;
import com.example.demomaven.service.UserService;

import javax.annotation.Resource;
import java.util.List;

// 实现 UserService 接口, 实现时该类必须加 @Service 注解
@Service
public class UserServiceImpl  implements UserService {
//    通过 @Resource 注解帮助我们实例化 User 对象
    @Resource
    private UserMapper userMapper;
//    实现 UserService 接口的 getUserInfo 获取用户信息方法
    @Override
    public User getUserInfo() {
        User user = new User();
        user.setUsername("张三");
        user.setPassword(3333);
        return user;
    }
//   实现 业务逻辑
    @Override
    public int addUser(String username, int password) {
        User user = new User(username, password);
//        使用 mapper映射
        return userMapper.addUser(user);
    }
    @Override
    public List<User> queryByUsername(String username) {
        return userMapper.queryByUsername(username);
    }
}

controller(控制http请求)

在controller包中创建UserController类

登陆的控制

@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.isEmpty()){
            User user = users.get(0);
            //3. 判断密码是否正确
            if(password == user.getPassword()){
                //4. 密码正确,登陆成功
                return new Response("登陆成功", 1, true);
            }else {
                return new Response("登陆失败,密码错误", -1, false);
            }
        }else {
            return new Response("登陆失败,用户名不存在", -1, true);
        }
    }else {
        return new Response("登陆失败,请检查用户名、密码是否为空", -1, true);
    }
}

@RequestMapping(value = "/login",method = RequestMethod.POST) 表示接口路由 /login请求方式 POST

注册的控制

@PostMapping("/register")
public Response register(@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.isEmpty()){
            return new Response("注册失败,用户名已存在,请更换!", -1, true);
        }else {
            int count = service.addUser(username,password);
            if(count>0){
                //3.没有重复用户名,注册成功
                return new Response("注册成功", 1, true);
            }else {
                return new Response("注册失败", -1, true);
            }
        }
    }else{
        return new Response("注册失败,请检查用户名、密码", -1, true);
    }
};

这里的@PostMapping("/register")表示处理post请求,路由为 /register 简写 @RequestMapping

UserController.java 完整代码

package com.example.demomaven.controller;

import com.example.demomaven.utils.Response;
import com.example.demomaven.entity.User;
import com.example.demomaven.service.UserService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;

@RestController
//注解@RequestMapping中的"/user"是这个控制器类的基路由
//@RequestMapping("/user")
public class UserController {
    @Resource
    private UserService service; // 正确注入 UserService
    @RequestMapping(value = "/userInfo",method = RequestMethod.GET)
    public String getUserItem(){
        User user = service.getUserInfo(); // 调用 UserService 方法获取用户信息
        return user.toString();
    }

//    实现注册接口的控制
    @PostMapping("/register")
    public Response register(@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.isEmpty()){
                return new Response("注册失败,用户名已存在,请更换!", -1, true);
            }else {
                int count = service.addUser(username,password);
                if(count>0){
                    //3.没有重复用户名,注册成功
                    return new Response("注册成功", 1, true);
                }else {
                    return new Response("注册失败", -1, true);
                }
            }
        }else{
            return new Response("注册失败,请检查用户名、密码", -1, true);
        }
    };

//    实现登陆接口

    @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.isEmpty()){
                User user = users.get(0);
                //3. 判断密码是否正确
                if(password == user.getPassword()){
                    //4. 密码正确,登陆成功
                    return new Response("登陆成功", 1, true);
                }else {
                    return new Response("登陆失败,密码错误", -1, false);
                }
            }else {
                return new Response("登陆失败,用户名不存在", -1, true);
            }
        }else {
            return new Response("登陆失败,请检查用户名、密码是否为空", -1, true);
        }
    }
}

创建Mapper关联数据库

resources 文件夹下,新建 mapper 文件夹,在此文件夹下新建 UserMapper.xml 文件。 关联数据库,写 sql 语句。

  • 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">

<!--映射 UserMapper 类-->
<mapper namespace="com.example.demomaven.mapper.UserMapper">
    <resultMap id="BaseResultMap" type="User">
        <result column="username" jdbcType="VARCHAR" property="username" />
        <result column="password" jdbcType="INTEGER" property="password" />
    </resultMap>

<!--    查询用户-->
    <select id="queryByUsername" resultType="User">
        SELECT * FROM `user` WHERE username = #{username}
    </select >
<!--    插入用户-->
    <insert id="addUser" parameterType="User">
        INSERT INTO `user` VALUES(#{username},#{password})
    </insert>
</mapper>

重点:

mapper 包的接口名要和 xml 中的 id 保持一致:

image.png

接口测试

image.png

在测试接口时遇到了各种报错,一路踩坑,具体参考: xxx

在一路踩坑后,最终接口成功:

  • 注册接口 image.png

  • 登陆接口 image.png

注解相关

@Mapper 注解

用于 MyBatis@Mapper 是 MyBatis 提供的注解,用于指示一个接口是一个 Mapper 接口,MyBatis 会自动生成该接口的实现,并将其作为 Spring Bean 注册。
使用 @Mapper 注解后,MyBatis 将能够扫描该接口并生成 SQL 操作实现。通常在 Mapper 接口上使用它,以便 MyBatis 知道如何处理该接口。

@Repository 注解

用于 Spring@Repository 是 Spring 框架的注解,用于标识一个数据访问层的组件,通常用于 JPA 或 Spring Data。
使用 @Repository 注解可以使 Spring 捕获数据访问层抛出的异常,并将其转换为 Spring 的数据访问异常层次结构。然而,@Repository 本身不会生成任何实现,它只是用于标识一个组件,让 Spring 知道这是一个数据访问对象。

总结

至此,完成了注册、登录接口。从最开始创建项目、本地接口开发到配置数据库连接、开发真实接口也算是一个完整流程跑通了。虽然在工作中不会让前端去写后端项目,但最起码我们了解了一个最基础的 java spring-web项目实现接口的流程。