29日
...
29日
自定义一个MyBatis的Handler
MyBatis Plus的Handler只支持Object类型,不支持Map和List
而JSONObject的底层实际是一个Map,所以需要自己实现一个Handler
先写Handler
package org.skynet.service.provider.smp.handler;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@MappedTypes({JSONObject.class})
@MappedJdbcTypes({JdbcType.LONGNVARCHAR})
public class JSONObjectTypeHandler extends AbstractJsonTypeHandler<JSONObject> {
private static final Logger log = LoggerFactory.getLogger(JSONObjectTypeHandler.class);
private final Class<?> type;
public JSONObjectTypeHandler(Class<?> type) {
if (log.isTraceEnabled()) {
log.trace("FastjsonTypeHandler(" + type + ")");
}
Assert.notNull(type, "Type argument cannot be null", new Object[0]);
this.type = type;
}
protected JSONObject parse(String json) {
return JSONUtil.parseObj(json);
}
protected String toJson(JSONObject obj) {
return JSONUtil.toJsonStr(obj);
}
}
在实体类中标注
@TableName(value = "nacos_config", autoResultMap = true)
@TableField(value = "content", typeHandler = JSONObjectTypeHandler.class)
package org.skynet.service.provider.smp.dao.entity;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import org.skynet.commons.core.domain.BaseEntity;
import org.skynet.service.provider.smp.handler.JSONObjectTypeHandler;
/**
* 配置对象 nacos_config
*
* @author shenkeqiu
* @date 2024-03-26
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@TableName(value = "nacos_config", autoResultMap = true)
public class NacosConfig extends BaseEntity {
@TableField(value = "content", typeHandler = JSONObjectTypeHandler.class)
private JSONObject content;
}
在yaml中配置Hander的路径
mybatis-plus:
type-handlers-package: org.skynet.service.provider.smp.handler
事务嵌套
每一次嵌套开启一个新事务
使用 @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
嵌套的方法可以不标注@Transactional
/**
* 批量删除配置
*/
@SneakyThrows
@Override
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid, String tenant) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
for (Long id : ids) {
deleteById(id);
};
return true;
}
@SneakyThrows
public Boolean deleteById(Long id) {
// 1.删除命名空间与配置的关系
tenantConfigMapper.delete(Wrappers.<NacosTenantConfig>lambdaQuery().eq(NacosTenantConfig::getConfigId, id));
// 2.删除配置与权限的关系
configPermissionMapper.delete(Wrappers.<SysConfigPermission>lambdaQuery().eq(SysConfigPermission::getConfigId, id));
// 3.删除配置
Boolean flag = baseMapper.deleteById(id) > 0;
// 4.删除Nacos中的配置
if (flag) {
NacosConfigVo nacosConfigVo = configMapper.selectVoById(id);
Boolean result = nacosApi.deleteConfig(getNacosAccessTokenUtil.getAccessToken(), nacosConfigVo.getName(), nacosConfigVo.getGroup()).execute().body();
if (!result) {
throw new CommonException(NacosExceptionEnum.CREATE_FAIL.getMsg());
}
}
return flag;
}
事务中先删再查
是查不到的!
你认为这篇文章怎么样?
- 0
- 0
- 0
- 0
- 0
- 0