java中如何灵活使用mysql中的json类型字段存储数据

日常数据库存储数据时经常会碰见一对多的数据结构类型,例如一笔订单中包含多个商品数据,一般情况下,可能会设计一个order表,一个sku表,但如果就想用一个表去存储这些订单和商品数据,那么应该如何去设计order表呢?这种情况下就可以使用万能json类型字段进行存储订单与商品一对多的数据结构了.

建表语句:

CREATE TABLE `bd_order` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `orderId` varchar(55) DEFAULT NULL COMMENT '订单id',
  `nick` varchar(55) DEFAULT NULL COMMENT '用户昵称',
  `skuInfo` json DEFAULT NULL COMMENT '商品信息',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='订单表';

数据如下:

存入数据:

商品实体类:

@Data
public class SkuInfo {
    
    private String name;
    private String price;
    private String skuId;

}

订单实体类:

@Data
public class BdOrder {
    private Long id;
    private String orderId;
    private String nick;
    @TableField(value = "skuInfo",typeHandler = FastjsonTypeHandler.class)
    private Object skuInfo;

}

存入数据库: 直接构造数据结构,插入数据库即可

List<SkuInfo> list = new ArrayList<>();
SkuInfo skuInfo = new SkuInfo();
skuInfo.setName("华为mate70");
skuInfo.setPrice("6000.00");
skuInfo.setSkuId("12345678");
list.add(skuInfo);

BdOrder bdOrder = new BdOrder();
bdOrder.setOrderId("111");
bdOrder.setNick("张三");
bdOrder.setSkuInfo(list);
//执行插入sql

从数据库查询数据:  需要通过json去解析转为list

//查询bd_order表得到如下数据
BdOrder bdOrder = 查询的数据
JSONArray jsonArray = JSONUtil.parseArray(bdOrder.getSkuInfo);
List<SkuInfo> skuInfoList = jsonArray.toList(SkuInfo.class);
//这样就得到了skuInfoList ,也是订单对应的多个商品数据

 上述使用的json工具类是hutool工具,如果想使用可以在pom引入依赖:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.3</version>
</dependency>

以上就是mysql的json类型存储数据的插入和查询。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 JSON 类型字段存储动态数据时,操作该字段的 SQL 语句需要使用 MySQL 提供的 JSON 函数。在 MyBatis ,可以使用 XML 映射文件或注解来编写 SQL 语句,具体操作步骤如下: 1. 创建实体类 首先,需要创建一个实体类来表示包含 JSON 类型字段的表。例如,创建一个名为 `MyEntity` 的实体类: ```java public class MyEntity { private Integer id; private String dynamicData; // getter and setter } ``` 其,`id` 表示主键字段,`dynamicData` 表示存储动态数据JSON 类型字段。 2. 创建 XML 映射文件或注解 使用 XML 映射文件或注解来编写 SQL 语句,操作 `dynamic_data` 字段数据。例如,以下是一个使用 XML 映射文件的示例: ```xml <!-- MyEntityMapper.xml --> <mapper namespace="com.example.MyEntityMapper"> <resultMap id="myEntityMap" type="com.example.MyEntity"> <id property="id" column="id"/> <result property="dynamicData" column="dynamic_data" jdbcType="JSON"/> </resultMap> <select id="findById" resultMap="myEntityMap"> SELECT * FROM my_table WHERE id = #{id} </select> <insert id="insert" parameterType="com.example.MyEntity"> INSERT INTO my_table (id, dynamic_data) VALUES (#{id}, #{dynamicData, jdbcType=JSON}) </insert> <update id="update" parameterType="com.example.MyEntity"> UPDATE my_table SET dynamic_data = #{dynamicData, jdbcType=JSON} WHERE id = #{id} </update> </mapper> ``` 以上示例,定义了一个 `resultMap` 来映射查询结果到 `MyEntity` 实体类使用 `jdbcType=JSON` 来指定 `dynamicData` 字段数据类型JSON。然后,定义了 `findById`、`insert` 和 `update` 三个 SQL 语句,分别用于查询、插入和更新数据。 如果使用注解来编写 SQL 语句,则可以在实体类添加对应的注解,例如: ```java public interface MyEntityMapper { @Select("SELECT * FROM my_table WHERE id = #{id}") @Results({ @Result(property = "dynamicData", column = "dynamic_data", jdbcType = JdbcType.JSON) }) MyEntity findById(Integer id); @Insert("INSERT INTO my_table (id, dynamic_data) VALUES (#{id}, #{dynamicData, jdbcType=JSON})") int insert(MyEntity entity); @Update("UPDATE my_table SET dynamic_data = #{dynamicData, jdbcType=JSON} WHERE id = #{id}") int update(MyEntity entity); } ``` 3. 使用 MyBatis 操作数据 最后,在代码使用 MyBatis 操作数据。例如,以下是一个查询 `MyEntity` 实体类的示例: ```java public class MyService { private final SqlSessionFactory sqlSessionFactory; public MyService(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; } public MyEntity findById(Integer id) { try (SqlSession session = sqlSessionFactory.openSession()) { MyEntityMapper mapper = session.getMapper(MyEntityMapper.class); return mapper.findById(id); } } } ``` 在以上示例,首先创建了一个 `SqlSessionFactory` 对象,用于创建 `SqlSession` 对象和 `MyEntityMapper` 接口的实例。然后,使用 `session.getMapper(MyEntityMapper.class)` 方法获取 `MyEntityMapper` 的实例,并使用 `mapper.findById(id)` 方法执行查询操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值