spring boot 6

一、注册接口开发流程

完整流程:明确需求 → 接口文档 → 思路分析 → 开发实现 → 测试

1. 分层开发逻辑

表格

层级 作用 核心代码
Controller 接收请求、参数校验、调用 Service /register 接口,接收 username/password
Service 业务逻辑(查重、密码加密、注册) findByUsername 查询用户、register 加密 + 存库
Mapper 数据库操作 select 查询用户、insert 插入新用户

2. 核心代码实现

Controller 层(改造前的繁琐写法)

java

运行

复制代码
@PostMapping("/register")
public Result register(String username, String password){
    // 手动校验参数(很繁琐,不推荐)
    if (username!=null && username.length()>=5 && username.length()<=16 &&
        password!=null && password.length()>=5 && password.length()<=16){
        
        // 查询用户名是否存在
        User u = userService.findByUsername(username);
        if (u == null){
            // 用户名未占用,执行注册
            userService.register(username, password);
            return Result.success();
        } else {
            return Result.error("用户名已被占用");
        }
    } else {
        return Result.error("参数不合法");
    }
}

二、Spring Validation 参数校验(推荐)

1. 依赖引入(pom.xml)

xml

复制代码
<!-- Spring Validation 起步依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2. 改造步骤

① Controller 类添加 @Validated

java

运行

复制代码
@RestController
@RequestMapping("/user")
@Validated // 开启参数校验
public class UserController {
    @Autowired
    private UserService userService;
}
② 接口参数添加 @Pattern 注解

java

运行

复制代码
@PostMapping("/register")
public Result register(
    @Pattern(regexp = "^\\w{5,16}$", message = "用户名必须是5-16位字母/数字/下划线") String username,
    @Pattern(regexp = "^\\w{5,16}$", message = "密码必须是5-16位字母/数字/下划线") String password
){
    // 校验失败会直接抛异常,由全局异常处理器处理
    User u = userService.findByUsername(username);
    if (u == null){
        userService.register(username, password);
        return Result.success();
    } else {
        return Result.error("用户名已被占用");
    }
}

三、全局异常处理器(处理校验失败)

java

运行

复制代码
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public Result handleException(Exception e){
        e.printStackTrace();
        // 有错误信息就返回,否则返回默认提示
        return Result.error(
            StringUtils.hasLength(e.getMessage()) ? e.getMessage() : "操作失败"
        );
    }
}

四、Service & Mapper 层代码

1. Service 层

java

运行

复制代码
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    @Override
    public User findByUsername(String username) {
        return userMapper.findByUsername(username);
    }
    @Override
    public void register(String username, String password) {
        // MD5加密密码
        String encryptPwd = MD5Util.md5(password);
        // 插入数据库
        userMapper.add(username, encryptPwd);
    }
}

2. Mapper 层(接口 + SQL)

java

运行

复制代码
@Mapper
public interface UserMapper {
    // 根据用户名查询用户
    @Select("select * from user where username = #{username}")
    User findByUsername(String username);
    // 插入新用户
    @Insert("insert into user(username,password,create_time,update_time) " +
            "values(#{username},#{password},now(),now())")
    void add(String username, String password);
}

五、两种校验方式对比

表格

方式 优点 缺点
手动 if 判断 直观易懂 代码繁琐、耦合度高、难以维护
Spring Validation 注解式声明、代码简洁、易扩展 需要额外引入依赖
相关推荐
非优秀程序员7 小时前
第07章 孙德良的阳谋|《互联网产品恩仇录》
javascript·后端
非优秀程序员7 小时前
第06章 浙江帮的内战|《互联网产品恩仇录》
后端
非优秀程序员7 小时前
第08章 马云的反击|《互联网产品恩仇录》
后端
非优秀程序员7 小时前
题记|《互联网产品恩仇录》
后端·程序员·创业
非优秀程序员7 小时前
第04章 邮箱大战,163 与 QQ 的暗战|《互联网产品恩仇录》
java·vue.js·架构
知已难寻8 小时前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
文丑颜不良啊10 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang11 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
Gopher_HBo11 小时前
Go CPU 剖析的"地基":信号、CAS、写屏障、无锁环形缓冲
后端
panbook11 小时前
从0到1实现一个分布式时序数据库(二):写入成功之后,如何用 WAL 找回数据
后端