一张表有uid,code,code_name等字段根据uid修改属性要求同一个code下面的code_name不能相同,使用mybatis-plus实现
时间: 2023-05-20 20:03:59 浏览: 191
结合mybatis-plus实现简单不需要写sql的多表查询
5星 · 资源好评率100%
可以使用Mybatis-plus提供的@SqlParser注解来实现这个需求。具体实现步骤如下:
1. 在实体类中添加@TableName注解,指定表名和主键字段。
2. 在Mapper接口中添加@Mapper注解,并继承BaseMapper接口。
3. 在Mapper接口中添加@SqlParser注解,指定要拦截的SQL语句类型和要执行的SQL解析器类。
4. 在SQL解析器类中实现修改属性的逻辑,包括查询同一个code下的所有code_name,判断是否有重复,如果有则抛出异常。
5. 在Service层中调用Mapper接口的方法,实现修改属性的功能。
下面是一个示例代码:
实体类:
@TableName("my_table")
public class MyEntity {
@TableId(type = IdType.AUTO)
private Long uid;
private String code;
private String codeName;
// getter和setter方法省略
}
Mapper接口:
@Mapper
@SqlParser(type = SqlParserType.UPDATE, parser = MyUpdateSqlParser.class)
public interface MyMapper extends BaseMapper<MyEntity> {
}
SQL解析器类:
public class MyUpdateSqlParser extends AbstractJsqlParser {
@Override
public void processMappedStatement(MappedStatement ms, Map<String, Object> paramMap, BoundSql boundSql) {
if (SqlCommandType.UPDATE.equals(ms.getSqlCommandType())) {
String sql = boundSql.getSql();
if (sql.contains("my_table")) {
String code = (String) paramMap.get("code");
String codeName = (String) paramMap.get("codeName");
List<MyEntity> entities = selectList(new QueryWrapper<MyEntity>().eq("code", code));
for (MyEntity entity : entities) {
if (!entity.getCodeName().equals(codeName)) {
throw new RuntimeException("同一个code下的code_name不能相同");
}
}
}
}
}
}
Service层:
@Service
public class MyService {
@Autowired
private MyMapper myMapper;
public void updateProperty(Long uid, String code, String codeName) {
MyEntity entity = new MyEntity();
entity.setUid(uid);
entity.setCode(code);
entity.setCodeName(codeName);
myMapper.updateById(entity);
}
}
阅读全文