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 注解式声明、代码简洁、易扩展 需要额外引入依赖
相关推荐
京师20万禁军教头1 小时前
47-常用类-八大包装类(Wrapper Classes)
java
come112341 小时前
剪映零基础教程
java·linux·运维
16月6日-晴1 小时前
Java面向对象——接口
java·开发语言
geovindu1 小时前
CSharp: Wordcloud
开发语言·后端·c#·.net·.netcore·词云
苏生Susheng1 小时前
【软件实施】Windows 服务器运维实战
java·运维·服务器·windows·spring boot·javaweb·实施
Java小白笔记1 小时前
Java 实现 ZIP 压缩包生成方案
java·开发语言·网络·7-zip
霸道流氓气质2 小时前
Spring AI 多模态开发指南:图片理解与语音合成
java·人工智能·spring
en.en..2 小时前
Linux mmap 内存映射深度解析:基于帧缓冲 /dev/fb0
java·服务器·前端
geovindu2 小时前
CSharp: Command Pattern
开发语言·后端·c#·.net·.netcore·命令模式·行为模式
洋不写bug2 小时前
链表补充练习,双链表的模拟实现
java·数据结构·链表·双链表·底层实现