概述
在一些需求涉及到多张表,多个对象的时候,业务逻辑就会呈现出一定的复杂性,通常这时候你会需要返回多张表的多个对象给前端,这时候,如果设计好Java对象,以能给到前端正确的对象呐?下面,来介绍一些较好用的方法,供参考
基于JSON格式的Java对象设计
首先看这样一个JSON格式:
{
“tbSpecification”:{“specName”:“test1”},
“tbSpecificationOptionList”:[
{“optionName”:“test11”,“orders”:111},
{“optionName”:“test66”,“orders”:666}
]
}
从最外层来看它是一个对象,这个对象里有tbSpecification和tbSpecificationOptionList两个属性,那么来构造它的第一个雏形:
public class test{
private TbSpecification tbspecification;
}
再来看tbSpecificationOptionList与tbspecification,不同之处在于它是一个数组对象,根据数组,想到什么,没错List,JSON中的数组对应于JAVA中的List,对于其中的对象用什么表示?没错把它看成一个类,取个名字,创建出来,就好了,就叫TbSpecificationOption吧,得到什么?
public class test{
private TbSpecification tbspecification;
private List<TbSpecificationOption> tbSpecificationOptionList;
}
但是两个属性,都报红了。我们创建一下,就不报红了,好了建好TbSpecification,和TbSpecificationOption对象了,该怎么填充呐?
public class TbSpecification{}
public class TbSpecificationOption{}
我们看到tbSpecification总有一个属性,specName,并且根据"test1",知道它是String类型
“tbSpecification”:{“specName”:“test1”},
那么在类中,就把specName属性创建出来就好了,记得加上set/get方法,
public class TbSpecification{
private String specName;
public String getSpecName() {
return specName;
}
public void setSpecName(String specName) {
this.specName = specName == null ? null : specName.trim();
}
}
而TbSpecificationOption中有optionName和orders两个属性,也同样创建出来
{“optionName”:“test11”,“orders”:111}
得到:
public class {
private String optionName;
private Long specId;
private Integer orders;
}
最后不报错了,格式也有了,从JSON到Java类的设计也就结束了,可以看到的是,基本是根据JSON格式一步一步往下构造,就可以完成了,对于数组就用List来转换,对于对象,就用类来构造,然后把属性填上,设好get、set方法。
像上面那样,一个对象里面包含多个对象的对象,通常叫做组合实体类,组合实体类通常用来封装从多表中获得的数据,然后返回给前端,想List的对象,一般用mybatis从数据库中拿数据。
既然学了这么多,在来一个格式,运用运用,来看,
{
"wa":[
{"time":"20201002"},
{"number":2}
],
"ct":[
{"time":"20201002"},
{"number":2}
]
}
当我们看到这样的JSON格式时会怎样转换为Java对象呐,按照开始的思考,
public class test{
private List<Wa> wa;
private List<Ct> ct;
}
public class Wa{
private String time;
private Integer number;
}
public class Ct{
private String time;
private Integer number;
}
这样建,对吗? 没错,这样是可以正确返回的,没有问题,那么问题在哪呐?有没有发现类Wa和类Ct的属性都是一样的,而SpringBoot做JSON返回的时候是根据属性名进行对象返回,那么可不可以,只建一个类,属性名不同呐?答案是可以的,因为SpringBoot做JSON返回的时候是根据属性名进行对象返回的
升级版
public class test{
private List<FrontData> wa;
private List<FrontData> ct;
}
public class FrontData{
private String time;
private Integer number;
}
记得加上get/set方法,厉害吧,那么还有没有其他办法呐?
答案是有的,在回顾一下,
{
"wa":[
{"time":"20201002"},
{"number":2}
],
"ct":[
{"time":"20201002"},
{"number":2}
]
}
其实两个对象数组中,只有什么不同,wa和ct对吗,而在Java集合中有一个集合是根据key就可以获取到对象的,是什么?Map对吗?好的,我们可以将wa、ct看成是key存在Map中,而将
[ {"time":"20201002"},{"number":2} ]
看成对象存在Map中,只不过这是个List的对象,
我们看如何设计、运用
public class FrontData{
private String time;
private Integer number;
}
public void test(){
Map<String,List<FrontData>> map = new HashMap<>();
List<FrontData> waData = Wamapper.selectList();
List<FrontData> ctData = Ctmapper.selectList();
map.put("wa",waData);
map.put("ct",ctData);
}
完美,这样玩也是可以的,根据自己实际情况选择吧
在说一点,就是如果涉及到该实体的写入、更新前端传参也按照给定的格式传过来就好了能写入的,在写入和更新接口上记得加上@RequestBody注解
{
"wa":[
{"time":"20201002"},
{"number":2}
],
"ct":[
{"time":"20201002"},
{"number":2}
]
}