非Spring环境下原生SQL增改前的轻量数据验证方案求推荐
原生SQL操作前的轻量级非Spring数据验证方案
1. Apache Commons Validator
这是Apache官方的轻量级通用验证工具包,完全独立于Spring生态,适合快速实现常见规则的校验:
- 内置大量开箱即用的校验规则:非空判断、邮箱格式、手机号格式、日期合法性等,无需手动编写
if(String.isBlank(...))这类重复代码。 - 支持两种使用方式:
- 直接调用工具类方法做单字段校验,比如:
// 校验邮箱格式 boolean isEmailValid = EmailValidator.getInstance().isValid(user.getEmail()); // 校验字符串非空(配合Commons Lang) boolean isUsernameValid = StringUtils.isNotBlank(user.getUsername()); - 通过配置文件(XML)或代码定义对象的校验规则,实现批量字段校验,减少重复逻辑。
- 直接调用工具类方法做单字段校验,比如:
2. Hibernate Validator(独立使用)
它是JSR-380(Bean Validation)标准的实现,常与Spring配合,但完全可以脱离Spring单独使用,是轻量且功能完善的选择:
- 用法:给实体类字段添加标准校验注解,然后通过Validator实例一次性校验整个对象,自动收集所有错误信息。
- 示例代码:
首先给实体类加注解:
然后执行校验:public class User { @NotNull(message = "邮箱不能为空") @Email(message = "邮箱格式不符合要求") private String email; @NotBlank(message = "用户名不能为空") @Size(min = 2, max = 20, message = "用户名长度需在2-20字符之间") private String username; // getter、setter方法 }
这种方式能一次性完成所有字段的规则校验,无需逐个编写判断逻辑。// 初始化Validator工厂(全局只需初始化一次) ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); User user = new User(); user.setEmail("wrong-email-format"); // 执行校验,获取所有违规信息 Set<ConstraintViolation<User>> violations = validator.validate(user); for (ConstraintViolation<User> violation : violations) { // 处理错误信息,比如收集到列表返回 System.out.println(violation.getMessage()); }
3. 自定义轻量校验工具(极简场景)
如果不想引入第三方依赖,可以自己实现一个基于反射+自定义注解的极简校验工具,代码量小且灵活:
- 步骤1:定义自定义校验注解
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface NotEmpty { String message() default "字段不能为空"; } @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface ValidEmail { String message() default "邮箱格式不正确"; } - 步骤2:实现校验工具类
import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; public class SimpleValidator { // 邮箱正则 private static final Pattern EMAIL_PATTERN = Pattern.compile("^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$"); public static List<String> validate(Object obj) throws IllegalAccessException { List<String> errors = new ArrayList<>(); Field[] fields = obj.getClass().getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); Object value = field.get(obj); // 校验@NotEmpty注解 if (field.isAnnotationPresent(NotEmpty.class)) { NotEmpty anno = field.getAnnotation(NotEmpty.class); if (value == null || (value instanceof String && String.isBlank((String) value))) { errors.add(anno.message()); } } // 校验@ValidEmail注解 if (field.isAnnotationPresent(ValidEmail.class)) { ValidEmail anno = field.getAnnotation(ValidEmail.class); if (value != null && value instanceof String) { if (!EMAIL_PATTERN.matcher((String) value).matches()) { errors.add(anno.message()); } } } } return errors; } } - 使用时直接调用:
User user = new User(); user.setEmail("invalid-email"); List<String> errors = SimpleValidator.validate(user); // 处理错误列表
内容的提问来源于stack exchange,提问作者testjava dev
相关产品推荐
相关产品推荐

