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 注解式声明、代码简洁、易扩展 需要额外引入依赖
相关推荐
程序员黑豆2 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
GreenTea3 小时前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
风流 少年3 小时前
Spring AI 2.0:Memory
java·后端·spring
码匠许师傅3 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
万少4 小时前
给 DeepSeek Harness 装个"应用商店":一条命令,595 个插件随你逛
前端·javascript·后端
小席是个热心肠4 小时前
AI相关的自我学习
java·人工智能·学习
数智化管理手记6 小时前
海量数据如何沉淀有效数据资产?数据标准化治理方案如何搭建?
java·大数据·人工智能
cfm_29147 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
鲸采云SRM采购管理系统8 小时前
采购管理系统哪家好?2026最新测评对比
java·服务器·数据库
IT_陈寒8 小时前
Python的GIL让我多写了500行代码
前端·人工智能·后端