检查名字是否重复
检查名字是否重复
检查名字是否重复是很常用的业务需求,本文推荐一种更省心、更少bug的做法。
推荐做法
借助数据库的来实现,执行以下语句:
ALTER TABLE my_table ADD UNIQUE(name);
然后,在程序里添加全局异常处理类:
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = org.springframework.dao.DuplicateKeyException.class)
public ResponseEntity<?> SQLIntegrityConstraintViolationExceptionHandler(Exception ex, HttpServletRequest webRequest) {
String[] strings = ex.getMessage().split("java.sql.SQLIntegrityConstraintViolationException: ");
String msg = strings[strings.length - 1];
return errorHandler(ex, webRequest,"400", msg);
}
}
示例返回:
Why
为什么这样做呢?因为这样只需要改一次代码。后续再有类似的需求时,只需要增加 SQL 即可,不需要再修改码、不需要重新编译、构建、部署。
如果选择修改代码,则每次至少要修改两个地方:新增、修改都要处理。
示例代码如下:
- 检查是否存在
public Boolean exists(Request req) {
// 新增与修改的查询语句是不一样的
return mapper.exists(new LambdaQueryWrapper<Entity>()
.eq(Entity::getName, req.getName())
.ne(Objects.nonNull(req.getId()), Entity::getId, req.getId())
);
}
- 新增接口
public boolean create(Request req) {
if (exists(req)) throw ApplicationException("Duplication!")
}
- 修改接口
public boolean update(Request req) {
if (exists(req)) throw ApplicationException("Duplication!")
}
实践的经验表明:改得多,错的多!