mysql json类型映射查询
admin
2024-01-17 14:44:28
0

业务场景

在mysql中在有些业务场景下可能会有 json 格式的使用,而 json 数据格式比较灵活多变,而 mybatisjson 类型的映射是通过 object 进行映射关系,在查询出来进行获取时使用会很麻烦, 在这里我们可以通过 json + jackson 框架的多态序列化方式实现将 json 格式映射成接口数据

实战

1. json结构

有以下两种数据结构需要存储到数据库中,数据库中设计了一个 value 字段为 json 类型

{"type": 1,"rule": "aaaaaaaa"
}
{"cron": "0 0 0/1 * * ? *","type": 0
}

2. 接口

JsonTypeInfo 的使用方法可以参考我的这篇博客 https://blog.csdn.net/weixin_43915643/article/details/127313547?spm=1001.2014.3001.5501

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,include = JsonTypeInfo.As.PROPERTY,property = "type"
)
@JsonSubTypes({@JsonSubTypes.Type(value = DeviceValue0DTO.class, name = "0"),@JsonSubTypes.Type(value = DeviceValue0DT1.class, name = "1")}
)
//忽略掉json中没有的set方法
@JsonIgnoreProperties(ignoreUnknown = true)
public interface ITriggerConditionValue {//type类型Integer getType();
}

3. 实现类

@Data
public class DeviceValue1DTO implements ITriggerConditionValue, Serializable {/** serialVersionUID */private static final long serialVersionUID = 3491976287068028239L;/** Rule sql */private String rule;@Overridepublic Integer getType() {return ConditionType.DEVICE.getValue();}
}
@Data
public class DeviceValue0DTO implements ITriggerConditionValue, Serializable {/** serialVersionUID */private static final long serialVersionUID = 3491976287068028239L;/** Cron */private String cron;@Overridepublic Integer getType() {return ConditionType.DEVICE.getValue();}
}

4. 实体类

下面使用的是 mybatis-plus 提供的注解相当于在 xml 文件中的 resultMap 里面映射字段后面加上 typeHandler 类型处理器

public class TriggerCondition {private String name;@TableField(typeHandler = JacksonTypeHandler.class, value = "value")private ITriggerConditionValue value;
}

5. typeHandler

自定义实现的 TypeHandler,通过使用 jackson 框架的多态实现,这里是使用的 mybatis-plus 实现的类型处理器,如果是 mybatis 可以复制下面代码

public abstract class AbstractJsonTypeHandler extends BaseTypeHandler {public AbstractJsonTypeHandler() {}public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, this.toJson(parameter));}public T getNullableResult(ResultSet rs, String columnName) throws SQLException {String json = rs.getString(columnName);return StringUtils.isBlank(json) ? null : this.parse(json);}public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {String json = rs.getString(columnIndex);return StringUtils.isBlank(json) ? null : this.parse(json);}public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {String json = cs.getString(columnIndex);return StringUtils.isBlank(json) ? null : this.parse(json);}protected abstract T parse(String json);protected abstract String toJson(T obj);
}
public class JacksonTypeHandler extends AbstractJsonTypeHandler {private static final Logger log = LoggerFactory.getLogger(JacksonTypeHandler.class);private static ObjectMapper objectMapper = new ObjectMapper();private final Class type;public JacksonTypeHandler(Class type) {if (log.isTraceEnabled()) {log.trace("JacksonTypeHandler(" + type + ")");}Assert.notNull(type, "Type argument cannot be null", new Object[0]);this.type = type;}protected Object parse(String json) {try {return objectMapper.readValue(json, this.type);} catch (IOException var3) {throw new RuntimeException(var3);}}protected String toJson(Object obj) {try {return objectMapper.writeValueAsString(obj);} catch (JsonProcessingException var3) {throw new RuntimeException(var3);}}public static void setObjectMapper(ObjectMapper objectMapper) {Assert.notNull(objectMapper, "ObjectMapper should not be null", new Object[0]);JacksonTypeHandler.objectMapper = objectMapper;}
}
                
            
            
            
            
            
            

相关内容

热门资讯

安卓系统app和ios系统的区... 你有没有发现,手机里的APP就像是个大杂烩,各有各的特色,各有各的玩法。今天,咱们就来聊聊安卓系统和...
宿迁综合办公系统安卓,便捷高效... 你有没有听说最近宿迁市推出了一款超级方便的安卓应用——宿迁综合办公系统?这可是个大新闻,让我来给你详...
小米平板4系统安卓下载,畅享智... 亲爱的数码爱好者们,你是否在寻找一款性价比超高、性能稳定的平板电脑呢?小米平板4绝对是你的不二之选!...
安卓系统易用性盘点,人性化设计... 你有没有发现,手机里的安卓系统就像一个万能的小助手,无论你是喜欢玩游戏、看视频,还是处理工作,它都能...
鸿蒙系统中出现安卓代码 鸿蒙系统中的安卓代码奇缘在当今科技飞速发展的时代,智能手机已经成为了我们生活中不可或缺的一部分。而在...
安卓系统的双开免费的,免费畅享... 《探索安卓系统的双开免费新世界》在数字化时代,智能手机已经成为我们生活中不可或缺的一部分。而在这众多...
转国外的安卓系统,探索国外安卓... 你有没有想过,让你的安卓手机体验一下国外的风味呢?想象那些国外的应用、游戏,还有那独特的系统设置,是...
安卓系统韩国能用吗,兼容性与使... 你有没有想过,如果你去韩国旅游或者工作,你的安卓手机还能不能用呢?这个问题可真是让人好奇啊!毕竟,每...
安卓手机系统占多少储存 你有没有发现,你的安卓手机越来越慢了?是不是觉得存储空间不够用,连个新应用都装不下?别急,今天就来给...
freemeos是安卓系统吗,... 你有没有听说过freemeOS这个系统?是不是好奇它是不是安卓系统呢?今天,我就来给你揭秘这个神秘的...
安卓系统其他应用耗电大,那些默... 手机电量总是不够用?是不是觉得安卓系统的其他应用耗电特别大?别急,今天就来给你揭秘这个谜团,让你手机...
华为os系统怎么换安卓系统,轻... 你有没有想过,你的华为手机里那个自家的OS系统,突然间想换换口味,试试安卓的精彩世界呢?别急,今天就...
诺基亚回用安卓系统吗,新篇章的... 你有没有听说最近的大消息?诺基亚,那个曾经手机界的巨头,竟然有可能会重新启用安卓系统!这可不是开玩笑...
安卓软件开发考勤系统 你有没有想过,在忙碌的安卓软件开发工作中,如何轻松管理团队考勤呢?别急,今天就来给你揭秘一款特别实用...
炉石传说安卓系统要求,解锁全新... 亲爱的玩家们,你是否已经迫不及待地想要在安卓设备上畅玩《炉石传说》了呢?别急,在这之前,你得先确保你...
安卓手机刷掌阅系统 你有没有想过,你的安卓手机可以变成一个掌阅小能手呢?没错,就是那种随时随地都能畅读各种电子书的掌阅系...
飞车手游ios系统跟安卓系统,... 你有没有发现,最近手机上的一款飞车手游特别火呢?这款游戏不仅画面精美,操作流畅,而且玩法多样,吸引了...
安卓平板显示系统不兼容,安卓平... 你有没有遇到过这种情况?买了一款心仪的安卓平板,满怀期待地想要体验各种精彩应用,结果却发现有些应用显...
安卓系统安装破解app病毒,安... 你知道吗?在安卓系统上安装破解版的APP,听起来是不是有点刺激?但别高兴得太早,这背后可是隐藏着不少...
安卓版桌面操作系统,探索安卓桌... 你有没有想过,你的安卓手机桌面操作系统,其实就像是一个小小的魔法世界呢?在这个世界里,你可以随意布置...