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 注解式声明、代码简洁、易扩展 需要额外引入依赖
相关推荐
程序猿DD5 小时前
OctaFuse Gateway 2.15.0:MCP 聚合、向量 Embeddings 与官方目录同步
后端·agent
蛋蛋的就会顺顺的7 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
余槐i7 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
需要8268 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡8 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
凤山老林9 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne10 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF10 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用
silvamux_10 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
pride.li11 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉