Springboot下json存入数据库最佳方式

前端来的数据结构是这样的

{
    "name": "BeJson",
    "address": {
        "street": "科技园路.",
        "city": "江苏苏州",
        "country": "中国"
    },
    "links": [
        {
            "name": "Google",
            "url": "http://www.google.com"
        },
        {
            "name": "Baidu",
            "url": "http://www.baidu.com"
        },
        {
            "name": "SoSo",
            "url": "http://www.SoSo.com"
        }
    ]
}

上面name,address,links对应到数据库(mysql)各字段
Springboot一路处理到存到数据库,这三个数据项都该用什么数据类型好?vo层,do层,数据库字段类型 各用啥类型好?或许哪个阶段转换类型比较好?
没有Springboot开发经验,以前搞php都是json转字符串存数据库的text类型,

  • 如果使用mysql8这个版本,数据库字段可以直接存JSON。
  • name使用String类型
  • addreses定义一个Address类
  • links定义一个List<NameValuePair>,apache下有定义好类似这样的类,也可以自己写一个
  • 前端使用DTO与后端交互,内部对DTO与数据库模型做转换,可能DTO相当于你说的VO

如有帮助,请采纳,十分感谢!

springboot的话,使用阿里巴巴的JSON工具,转成JSONString再存入数据库,数据库表字段用txt,do用jsonObject格式,vo用String;前端接收用do,然后转成JSONString赋值给vo,再存入数据库;给前端的话,用vo取出来,转成jsonObject赋值给do。

数据库name声明为String类型,Address和Links字段声明为text或blob类型
方案思路:

1、后台声明一个XxxDto用于接收前端传值(XxxDto该名字可以自定义,此处只是为了演示),代码如下
/**
 * 前后端传值对象类,用于接收前端传过来的json对象
 */
public class XxxDto implements Serializable {

    private static final long serialVersionUID = 1L;

    private String name;

    private Address address;

    private List<Link> linkList;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public List<Link> getLinkList() {
        return linkList;
    }

    public void setLinkList(List<Link> linkList) {
        this.linkList = linkList;
    }
}

2、声明XxxDto对应的Address和Link类,代码如下

/**
 * 地址类
 */
public class Address implements Serializable {

    private static final long serialVersionUID = 1L;

    private String street;

    private String city;

    private String country;

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }
}
/**
 * Link类
 */
public class Link implements Serializable {

    private static final long serialVersionUID = 1L;

    private String name;

    private String url;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}

3、声明controller,代码如下,该业务需要自己写service类、mapper类以及入库的xml文件对应的sql语句,具体方案自己实现

@RestController
@RequestMapping(value = "xxx")
public class XxxController {

    private final Logger logger = Logger.getLogger(XxxController.class);

    @PostMapping(value = "/save")
    public boolean saveXxx(@RequestBody XxxDto xxxDto) {
        logger.debug("[ INPUT]");

        //此处为业务处理(后台利用前端传值,从xxxDto获取数据后进行业务操作,调用service方法保存进数据库)

        return true;//此处为演示,返回值视情况而定
    }
}

MySQL 5.7增加了对JSON类型的支持
mysql> CREATE TABLE t1 (jdoc JSON);
mysql> INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');
配置文件:pom.xml

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-55</artifactId>
    <version>${hibernate-types.version}</version>
</dependency>


要使用JSON Hibernate类型,我们必须使用注释:@TypeDef来声明它们

@TypeDefs({
    @TypeDef(name = "json", typeClass = JsonType.class)
})
@MappedSuperclass
public class BaseEntity {
    //Code omitted for brevity
}

实体映射看起来像这样:

@Entity(name = "Event")
@Table(name = "event")
public class Event extends BaseEntity {
 
    @Type(type = "json")
    @Column(columnDefinition = "json")
    private Location location;
 
    public Location getLocation() {
        return location;
    }
 
    public void setLocation(Location location) {
        this.location = location;
    }
}
 
@Entity(name = "Participant")
@Table(name = "participant")
public class Participant extends BaseEntity {
 
    @Type(type = "json")
    @Column(columnDefinition = "json")
    private Ticket ticket;
 
    @ManyToOne
    private Event event;
 
    public Ticket getTicket() {
        return ticket;
    }
 
    public void setTicket(Ticket ticket) {
        this.ticket = ticket;
    }
 
    public Event getEvent() {
        return event;
    }
 
    public void setEvent(Event event) {
        this.event = event;
    }
}

当插入以下实体时:

final AtomicReference<Event> eventHolder = new AtomicReference<>();
final AtomicReference<Participant> participantHolder = new AtomicReference<>();
 
doInJPA(entityManager -> {
    Event nullEvent = new Event();
    nullEvent.setId(0L);
    entityManager.persist(nullEvent);
 
    Location location = new Location();
    location.setCountry("Romania");
    location.setCity("Cluj-Napoca");
 
    Event event = new Event();
    event.setId(1L);
    event.setLocation(location);
    entityManager.persist(event);
 
    Ticket ticket = new Ticket();
    ticket.setPrice(12.34d);
    ticket.setRegistrationCode("ABC123");
 
    Participant participant = new Participant();
    participant.setId(1L);
    participant.setTicket(ticket);
    participant.setEvent(event);
 
    entityManager.persist(participant);
 
    eventHolder.set(event);
    participantHolder.set(participant);
});

返回是一个对象

其它数据库
Sql Server 建议用 text
oracle LONG 或者CLOB
json以字符串形式存储。