跳至主要內容

检查名字是否重复

JavaMySQLDaily

检查名字是否重复

检查名字是否重复是很常用的业务需求,本文推荐一种更省心、更少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!")
  }

实践的经验表明:改得多,错的多!

上次编辑于:
贡献者: levy