在表中创建一个字段来接收多个字符串组成的数组信息,这是一个很常见的方法,有优点也有缺点,我们暂且不论,就如何实现和遇到问题的解决方案展开
一、数据库设计

我们可以将该字段类型为json

举例:

表 product 其中有一个字段为 labels,为json类型。

二、实体类设计

在创建实体类的时候,将labels字段设置成为

@TableField(typeHandler = JacksonTypeHandler.class, jdbcType = JdbcType.VARCHAR)
private List<String> labels
三、使用(CRUD)

详情:获取对象信息后,通过getLabels()方法拿到该参数List<labels> labels,然后for循环处理

列表:将详情步骤写入列表的for循环内即可

新增:结合mybatis-plus,使用insert()方法即可

修改:结合mybatis-plus,使用update()方法即可,记得要传主键参数

删除:根据ID删除,不用多说了

以上是针对存储的信息是以字符串为数组的,如果是以k-v键值对的对象数组(集合)呢
方法一:

第一步,维持不变

第二步,如果是已经创建了该键值对对应的对象

比如

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ProductImages{

    private String url;

    private Integer sort;

}

已经有了实体类,则在Product实体中按如下方式创建

@TableField(typeHandler = JacksonTypeHandler.class, jdbcType = JdbcType.VARCHAR)
private List<ProductImages> images;

第三步,使用也会有很大的变化

需要对数组(集合)中的数据做处理,就要注意了,如果按照以往的处理方式,我们可以直接获取实体类对象中的该属性,比如

ProductInfo productInfo = productInfoMapper.selectProductInfoById(id);

List<ProductImages> images = productInfo.getImages();

但是问题来,如果你直接for循环处理images就会报错关于LinkHashMap,

至此,我们需要使用Object转换,上代码

ObjectMapper objectMapper = new ObjectMapper();
if(images!=null){
  List<ProductImages> list = new ArrayList<>();
  for (Object image : images) {
      //转换
      ProductImages productImages = objectMapper.convertValue(image, ProductImages.class);
                       
      if(productImages!=null&&productImages.getUrl()!=null&&productImages.getSort()!=null){
                    ProductImages productImage = new ProductImages();
                    String url = productImages.getUrl();
                    productImage.setSort(productImages.getSort());
                    productImage.setUrl(aliyunOSSUtils.getFileName(url));
                    list.add(productImage);
      }
  }
            productInfo.setImages(list);
}

这样就可以解决遇到的问题,在需要处理json字段的地方使用类似方法即可。

方法二:

使用Map

第一步,维持不变

第二步,实体类属性如下

@TableField(typeHandler = JacksonTypeHandler.class, jdbcType = JdbcType.VARCHAR)
private List<Map<String,Object>> images;

第三步,使用

使用Map接收就不用考虑转换的问题,但是后端同学要和前端同学统一传值规则,即字段名称,后端在使用Map,get()方式的时候注意非空判断即可。

希望本文章对你有用,如果有用的话,不妨给个免费的赞和收藏,感谢,共勉!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐