跳至主要內容

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
评论
  • 按正序
  • 按倒序
  • 按热度