【问题描述】
假设现在有一个服务器,上面有一个数据库一个程序,你不能直接远程连接它然后SQL查询,但是可以通过发送请求的方式调用接口进行数据查询。但是一个接口对应一张单表,接口只有查询该接口对应的表的信息。
现在有一个问题就是,如果我要查询多表连接的数据,在服务器上的程序代码无法更改的情况下该如何实现?
【问题分析】
首先,了解该场景中的限制条件:
1、每个接口只能针对一张表进行查询。
2、多表连接包括外连接、内连接、交叉连接:
左外连接:
select * from table1 a left out join table2 b on a.name = b.name
右外连接
select * from table1 a right out join table2 b on a.name = b.name
完全外连接
select * from table1 a full out join table2 b on a.name = b.name
内连接
select * from table1 a inner join table2 b on a.name = b.name
交叉连接
select * from table1 a cross join table2 b where a.name = b.name
【解决方案】
在了解了多表连接的所有类型以后,剩下的就是怎么实现的问题。
最直接的方式就是创建一个查询类,在类中创建以上的多表连接方法,分别进行具体代码的实现即可。当然也可以通过策略模式,为每一个类型的多表连接创建一个类,分别进行代码实现。
以左外连接为例:
做外连接查询的查询结果要求 属于左表的所有行数据都必须查询出来,而右表则需要根据条件查询出结果与左表进行匹配,若左表中的数据在右表中找不到对应结果,则最终结果属于右表的字段要用null表示。
所以:
1、创建一个结果类Result,包括table1,table2的所有字段。
2、创建一个Map集合,key为条件字段值,value为Result
3、首先根据条件查询出左表table1的所有数据,并写入集合Map<String,Result>中。
4、根据条件查询出右表table2的所有数据,并根据key值,将所有值写入Result类中。
5、获取集合的value,并返回。