数据库JSON范例到映射JAVA上

王柳  金牌会员 | 2024-7-12 19:35:27 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 880|帖子 880|积分 2640

Mysql存放JSON数据如何映射JAVA实体类

概述:最近写在写SKU模块中,必要表中字段存放JSON范例数据,mybatis-plus在查询的时候如何跟JSON范例所匹配呢?再次记录一下。
直接上代码,后面有解释到底如何映射上的。
Mysql表数据

JAVA实体类
  1. @Data
  2. public class TSku {
  3.     private Long id;
  4.     private Long bookId;
  5.     private Long inventory;
  6.     private BigDecimal oldPrice;
  7.     private String picture;
  8.     private BigDecimal price;
  9.     private String skuCode;
  10.     // 自定义类型处理器,表示java类型与数据库类型双向转换
  11.     @TableField(typeHandler = FastjsonTypeHandler.class)
  12.     private JSONObject skuProperties;
  13.     private String specs1;
  14.     private String specsValue1;
  15.     private String specs2;
  16.     private String specsValue2;
  17.     // 自定义类型处理器,表示java类型与数据库类型双向转换
  18.     @TableField(typeHandler = FastjsonTypeHandler.class)
  19.     private JSONArray skuPropertiesName;
  20.     @TableField(exist = false)
  21.     private List<SkusSpec> specs;
  22. }
复制代码
XML查询SQL
  1. <select id="getTSkuList" resultMap="skuList">
  2.         select * from t_sku
  3.         where book_id = #{bookId}
  4.     </select>
  5.     <resultMap id="skuList" type="org.dromara.library.domain.TSku">
  6.         <!-- 转换JSONObject-->
  7.         <result column="sku_properties"
  8.                 property="skuProperties"
  9.         jdbcType="OTHER" javaType="com.alibaba.fastjson.JSONObject"
  10.         typeHandler="com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler" />
  11.         <!-- 转换JSONArray-->
  12.         <result column="sku_properties_name"
  13.                 property="specs"
  14.                 jdbcType="OTHER" javaType="com.alibaba.fastjson.JSONArray"
  15.                 typeHandler="com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler" />
  16.     </resultMap>
复制代码
属性名称作用column数据库表中列名propertyJava实体类中的属性名jdbcType数据库字段的JDBC范例,这里是OTHER表示字段的范例不是JDBC标准范例javaType映射到Java实体类属性范例typeHandler自界说范例处置惩罚器,主要负责Java范例和JDBC范例之间举行转换 java返回效果展示
  1. "code": 200,
  2.     "msg": "操作成功",
  3.     "data": [
  4.         {
  5.             "id": 1,
  6.             "bookId": 11,
  7.             "inventory": 10,
  8.             "oldPrice": "100.00",
  9.             "picture": "http://xx.xx.xxx.xx:xx/ttbook/2024/02/28/bc4d02cc21974b85aceb9c4aa55b8b66.jpg",
  10.             "price": "49.00",
  11.             "skuCode": "TT001",
  12.             "skuProperties": {
  13.                 "1": "1",
  14.                 "2": "3"
  15.             },
  16.             "specs1": "1",
  17.             "specsValue1": "1",
  18.             "specs2": "2",
  19.             "specsValue2": "3",
  20.             "skuPropertiesName": null,
  21.             "specs": [
  22.                 {
  23.                     "valueName": "十宗罪1",
  24.                     "name": "系列"
  25.                 },
  26.                 {
  27.                     "valueName": "不恐怖",
  28.                     "name": "版本"
  29.                 }
  30.             ]
  31.         }
复制代码
起首,要知道一个概念,就是mybatis-plus实行SQL查询的过程

  • 构建SQL语句:编写SQL语句,在xml中或使用注解界说SQL。参数占位符:使用#{}或 ${}来插入动态参数
  • 参数绑定:在实行SQL查询之前,使用TypeHandler将Java范例转换成JDBC范例。比方String -> varchar, Date -> TIMESTAMP
  • 预编译SQL:使用PreparedStatement预编译SQL语句,将参数更换成占位符。
  • 实行SQL:实行预编译后的SQL语句,从 数据库中获取效果集
  • 结构映射:

    • mybatis:通过ResultMap设置,将数据库效果会集的列值映射到Java对象的属性上
    • 效果映射中同样会使用TypeHandler来处置惩罚从数据库范例到Java范例的转换
    • 如果效果 会集的列是一个JSON字符串,而你想映射到一个com.alibaba.fastjson.JSONObject对象,这时可以使用自界说的TypeHandler(FastjsonTypeHandler 针对JSON字段使用)来举行转换

  • 构建对象:根据映射设置,mybatis会遍历效果集,并为每一行数据创建一个Java对象实例,将效果会集对应的列填充到对象的属性中。
知道这个概念之后,只要利用typeHandler来指定javaType范例为JSONObject或JSONArray就可以实现映射了!!
附加功能: Mybatis 一对多映射
SQL效果集
  1. 3        系列        十宗罪1        6        第一部          1        测试地址
  2. 3        系列        十宗罪2        7        第二部          1 测试地址
  3. 4        版本        恐怖             8         真恐怖   1 测试地址
  4. 4        版本        不恐怖            9        真不恐怖  1        测试地址
复制代码
最终效果:
  1. "data": [
  2.         {
  3.             "id": "3",
  4.             "name": "系列",
  5.             "values": [
  6.                 {
  7.                     "id": "6",
  8.                     "name": "十宗罪1",
  9.                     "picture": "测试地址",
  10.                     "available": "1",
  11.                     "desc": "第一部"
  12.                 },
  13.                 {
  14.                     "id": "7",
  15.                     "name": "十宗罪2",
  16.                     "picture": "测试地址",
  17.                     "available": "1",
  18.                     "desc": "第二部"
  19.                 }
  20.             ]
  21.         },
  22.         {
  23.             "id": "4",
  24.             "name": "版本",
  25.             "values": [
  26.                 {
  27.                     "id": "8",
  28.                     "name": "恐怖",
  29.                     "picture": "测试地址",
  30.                     "available": "1",
  31.                     "desc": "真恐怖"
  32.                 },
  33.                 {
  34.                     "id": "9",
  35.                     "name": "不恐怖",
  36.                     "picture": "测试地址",
  37.                     "available": "1",
  38.                     "desc": "真不恐怖"
  39.                 }
  40.             ]
  41.         }
  42.     ]
复制代码
resultMap实现一对多
  1. <!--    查询规格 属性值 -->
  2.     <select id="getSpecsList" resultMap="specsList">
  3.         SELECT
  4.             t4.id  as id,
  5.             t4.`name` as name,
  6.             t3.`name` as nameValue,
  7.             t3.id as idValue,
  8.             t3.`desc` as `desc`,
  9.             t3.available as available,
  10.             t3.picture as picture
  11.         FROM
  12.             book_specs_value t2
  13.                 JOIN t_specs_value t3 ON t2.specs_value_id = t3.id
  14.                 JOIN t_specs t4 ON t2.specs_id = t4.id
  15.         WHERE
  16.             t2.book_id = #{bookId}
  17.     </select>
  18.     <!-- 一对多 -->
  19.     <resultMap id="specsList" type="org.dromara.app.appojo.aojo.details.Specs">
  20.         <id property="id" column="id"></id>
  21.         <result property="name" column="name"></result>
  22.         <collection property="values" ofType="org.dromara.app.appojo.aojo.details.SpecsValue">
  23.             <id column="idValue" property="id" ></id>
  24.             <result column="nameValue" property="name"></result>
  25.             <result column="desc" property="desc"></result>
  26.             <result column="picture" property="picture"></result>
  27.             <result column="available" property="available"></result>
  28.         </collection>
  29.     </resultMap>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表