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;}
}
                
            
            
            
            
            
            

相关内容

热门资讯

安卓p系统如何使用,功能亮点与... 你升级到安卓P系统了吧?是不是有点小激动,想要立刻探索这个新系统的所有酷炫功能呢?别急,让我带你一步...
多多安卓系统app下载,一站式... 你有没有发现,最近手机上多了一个超级酷炫的系统——多多安卓系统!是不是已经跃跃欲试,想要下载体验一番...
r801 安卓系统,深度解析新... 你有没有听说过R801安卓系统?这可是最近在数码圈里炒得火热的一个话题呢!想象你的手机突然变得像一台...
安卓系统国外能用吗,探讨安卓系... 你有没有想过,当你拿着那部心仪的安卓手机,准备出国旅行或者工作的时候,会不会突然发现,哎呀妈呀,这安...
健康怀仁安卓系统下载,健康相伴 你有没有想过,在这个信息爆炸的时代,拥有一款健康、稳定的操作系统是多么重要的事情呢?今天,就让我带你...
手机系统模拟安卓5.0,系统革... 你有没有想过,如果手机系统可以像安卓5.0那样模拟出来,会是怎样的体验呢?想象你手中的设备瞬间变身成...
关闭安卓电池检测系统,解锁续航... 你有没有发现,手机用久了,电池续航能力好像越来越不给力了?是不是觉得安卓系统的电池检测系统太烦人了?...
安卓系统变ios永久,探索系统... 你知道吗?最近在科技圈里可是掀起了一股热潮呢!那就是安卓系统用户纷纷转向iOS系统的现象。这究竟是怎...
安卓系统虚拟按键失灵,原因排查... 手机里的安卓系统突然间出了点小状况,虚拟按键失灵了!这可真是让人头疼不已。想象你正沉浸在游戏的世界里...
安卓北京交警系统繁忙,揭秘安卓... 最近北京的小伙伴们有没有发现,打开手机上的安卓交警系统,那可真是忙得不亦乐乎啊!不信?那就跟着我一起...
苹果和安卓互用系统,共创未来 你有没有想过,为什么你的苹果手机上的应用,有时候也能在安卓手机上顺畅运行呢?这背后,其实有一个神奇的...
安卓系统强制内置相机,隐私与安... 你知道吗?最近在安卓系统上,有一个让人有点摸不着头脑的小变化引起了大家的关注。那就是安卓系统竟然开始...
安卓系统读书app推荐,安卓系... 你有没有发现,随着智能手机的普及,阅读变得越来越方便了呢?尤其是在安卓系统上,各种各样的读书app层...
安卓系统新出的机型,探索【型号... 最近手机圈可是热闹非凡呢!安卓系统新出的机型层出不穷,简直让人眼花缭乱。今天,就让我带你一起探索这些...
安卓与苹果系统游戏,游戏生态对... 你有没有发现,现在手机游戏越来越流行了?不管是走在路上,还是在公交车上,总能看到大家低头玩着手机,那...
闭源系统和安卓开源系统,揭秘闭... 你有没有想过,为什么你的手机里装了那么多应用,却总感觉少了点什么?没错,就是那股自由自在的“玩”劲儿...
小米安卓系统密码破解,揭秘安全... 小米安卓系统密码破解:一场技术与道德的较量在数字化时代,手机已经成为我们生活中不可或缺的一部分。小米...
ios系统游戏转安卓系统游戏,... 你有没有想过,为什么有些游戏在iOS系统上玩得那么顺畅,一到安卓系统上就卡得跟什么似的?今天,就让我...
安卓90系统怎么下载,体验流畅... 你有没有发现,安卓90系统最近可是火得一塌糊涂呢!不少小伙伴都在问,安卓90系统怎么下载?别急,今天...
安卓系统主题免费字体,个性化你... 你有没有发现,手机里的字体有时候真的能改变心情呢?想象当你打开手机,看到那一个个活泼可爱的字体,是不...