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 注解式声明、代码简洁、易扩展 需要额外引入依赖
相关推荐
zhangxingchao1 小时前
AI应用开发二:Embedding与向量数据库
前端·人工智能·后端
倒流时光三十年1 小时前
Java String.split() 方法陷阱:为什么你应该始终使用 split(regex, -1)
后端
johnrui2 小时前
JUC之AQS
java·开发语言·jvm
Full Stack Developme2 小时前
Spring 模块介绍
java·后端·spring
Mahir082 小时前
Redis 核心机制:数据过期策略与淘汰策略深度解析
数据库·redis·后端·缓存·面试
多敲代码防脱发2 小时前
Spring进阶(BeanFactory与ApplicationContext)
java·数据库·spring boot·后端·spring
吴声子夜歌2 小时前
Java——反射
java·反射
zhangxingchao2 小时前
AI应用开发一: AI 编程、大模型调用和 Agent
前端·人工智能·后端
JAVA面经实录9172 小时前
完整版JVM 深度学习体系(二)
java·jvm