文章的前提是使用了MyBatis-Plus框架,下面的注解都是框架内部的。
今天在网上看了很多教程都没有办法实现这个需求,然后请教了老师终于解决了困扰我一天的难题。需求如下,数据库中的字段是下面这种:
每一个都是JSON类型,然后我要读取这个JSON类型,然后将其以数组的形式返回给前端。JAVA中没有JSON类型,所以接收这个要么用String(返回前端是一大串字符串,剩下让前端处理也行)要么就是用下面的方法将其转化为JSON数组。
1、创建一个类,对应上面数组中每一个对象的属性:
package io.github.talelin.latticy.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SpecKeyValueDO {
@JsonProperty(value = "key_id")
private Integer keyId;
@JsonProperty(value = "value_id")
private Integer valueId;
private String value;
private String key;
}
2、因为上面是一个数组,所以用List<>泛型接收,如果是单纯JSON对象,直接用上面创建的对象接收即可。
1、在属性上打@TableField(typeHandler = JacksonTypeHandler.class)
2、在类上添加 @TableName(value = "sku", autoResultMap = true)让其自动映射
package io.github.talelin.latticy.model;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.Data;
/**
* sku
* @author
*/
@Data
@TableName(value = "sku", autoResultMap = true) //一定要写好这个 autoResultMap = true
public class SkuDO extends BasePojo implements Serializable {
private Integer id;
/*省略很多属性*/
@TableField(typeHandler = JacksonTypeHandler.class)
private List<SpecKeyValueDO> specs;
}
3、Controller层:
使用这种查询必须使用MyBatis-plus自带的查询方式,即不写SQL语句,因为写SQL语句时还要进行结果映射,所以直接使用条件查询即可。
@GetMapping("/ids/{id}") //@Positive表示必须是整数
public List<Sku> getDetails(@PathVariable @Positive Long id) {
return skuService.lambdaQuery().eq(Sku::getSpuId,id).list();
}
最终就会返回数组啦:
否则它的返回值是这样的: