一、注册接口开发流程
完整流程:明确需求 → 接口文档 → 思路分析 → 开发实现 → 测试
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 | 注解式声明、代码简洁、易扩展 | 需要额外引入依赖 |

