概述

在一些需求涉及到多张表,多个对象的时候,业务逻辑就会呈现出一定的复杂性,通常这时候你会需要返回多张表的多个对象给前端,这时候,如果设计好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}	
	]
  
}