一个很常见的需求,某表中的数据不能重复,我闲每次都要多加几行代码去查数据库,所以自定义了个注解
代码
/**
* <p>
* 数据库字段唯一值
* </p>
*
* @author duguotao
* @version 1.0.0
* @since Created in 2022/1/26
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = TableDataUnique.TableDataUniqueConstraintValidator.class)
public @interface TableDataUnique {
// 表明
String table();
// 字段
String column();
String message() default "参数错误";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
class TableDataUniqueConstraintValidator implements ConstraintValidator<TableDataUnique, String>, ApplicationContextAware {
String table;
String column;
static ApplicationContext application;
@Override
@SuppressWarnings("all")
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
application = applicationContext;
}
@Override
public void initialize(TableDataUnique tableDataUnique) {
table = tableDataUnique.table();
column = tableDataUnique.column();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (StrUtil.isEmpty(table) || StrUtil.isEmpty(column)) {
return false;
}
String solitary = "'";
String sql = "select count(1) 'count' from " + table + " where " + column + " = " + solitary + value + solitary;
JdbcTemplate jdbcTemplate = application.getBean("jdbcTemplate", JdbcTemplate.class);
Map<String, Object> map = jdbcTemplate.queryForMap(sql);
return map.get("count").equals(0L);
}
}
}
使用
角色表中 名称不允许重复