前端来的数据结构是这样的
{
"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类型,
List<NameValuePair>
,apache下有定义好类似这样的类,也可以自己写一个如有帮助,请采纳,十分感谢!
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以字符串形式存储。