专栏前言
作为一名前端开发,为了扩展自身技能,准备入门级的学习一下java后端相关知识。虽然岗位是前端,但我觉得不能算是卷。
因为我们日常开发中几乎每天都要和后端同学打交道,如果能够掌握后端基本知识的话,我相信在前端开发工作中也会有很大作用。 技多不压身,如果这个过程让你感到痛苦那大可不必;反之,学习新事物的过程中能让自己更加自信、有成就感时,我觉得是有意义的!
记得是2年前学习过一个入门级的java项目,但现在可以说是忘记的差不多了。最近打算从0开始学习,并输出文章,方便自己日后复习查阅,也希望帮助到其他同学。
专栏往期推荐:
前端入门JAVA:基础开发环境配置
前端入门JAVA:创建第一个java项目
前端入门JAVA:Spring-web项目实现第一个本地接口
前端入门JAVA:Spring-web项目配置数据库连接
前言
上篇文章中我们成功配置连接好 mysql 数据库、新建好了数据库表。本篇将实现账号注册、登陆接口。
实现注册、登陆接口
根据框架特点,我们自底向上开发,所以将按照:entity->service->serviceImpl->controller
的顺序逐步开发。
目录结构:
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
保持一致:
接口测试
在测试接口时遇到了各种报错,一路踩坑,具体参考: xxx
在一路踩坑后,最终接口成功:
-
注册接口
-
登陆接口
注解相关
@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
项目实现接口的流程。