不使用left-join等多表关联查询,只用单表查询和Java程序,简便实现“多表查询”效果
上次我们提到,不使用left-loin关联查询,可能是为了提高效率或者配置缓存,也可以简化一下sql语句的编写。只写单表查询,sql真得太简单了。问题是,查询多个表的数据还是非常需要的。
因此,存在这么一个强烈的需求:查询2个集合,怎么合并2个集合中的数据为1个集合,且数据关联要正确。在实践中,我提炼了如下流程和工具方法:
流程
先查询第1个集合,根据第1个集合的结果,查询第2个集合,合并2个集合
public PageVo listPage(PageVo form) {
List<Map<String, Object>> list = transferDao.listPage(form);
if (list != null && list.size()>0) {
List<Map<String, Object>> loanList = loanInfoService.batchList(list);
MergeUtilmerge(list, loanList);
form.setList(list);
}
return form;
}
合并集合的工具方法
/**
* 合并关联数据集合到主表集合中,把2个集合中的数据合并到一个集合中,通过某个key关联,从而替代数据库的left-join等关联查询。
*
* 方法分3类:合并2个元素为Map的集合、合并2个Map、查找1个Map在另外一个元素为集合的关联Map。
*
* 可选参数:2个map的关联key可能是1个,也可能是2个;合并2个Map时,可以为关联Map的key分别加上前缀prefix,防止重名,也可以不加上。
*
* 不适用场景:多表查询搜索且查询条件在关联表中且需要分页的时候,只使用单表查询+Merge工具,是不够的。
* @author fansunion@qq.com 2014年11月26日
*/
public class MergeUtil {
// ///////////////////////合并2个集合中的所有Map/////////////////////
/**
* 合并关联数据集合到主表结合中,把2个集合中的数据合并到一个集合中,通过某个主键关联(不用数据库left join)
*/
// 合并2个集合,先查找关联map,再合并2个单独的map,2个map中的关联key是同一个
public static void merge(List<Map<String, Object>> mainList,
List<Map<String, Object>> relationList, String relationKey,
String prefix) ;
// 合并2个集合,先查找关联map,再合并2个单独的map,合并map的key加上前缀,2个map中的关联key是2个
public static void merge(List<Map<String, Object>> mainList,
String mainKey, List<Map<String, Object>> relationList,
String relationKey, String prefix) ;
// 合并2个集合,先查找关联map,再合并2个单独的map,2个map中的关联key是同1个
public static void merge(List<Map<String, Object>> mainList,
List<Map<String, Object>> relationList, String relationKey) ;
// 合并2个集合,2个集合中的map通过key关联
public static void merge(List<Map<String, Object>> mainList,
String mainKey, List<Map<String, Object>> relationList,
String relationKey) ;
// ////////////合并2个Map,前缀prefix可要可不要,不要的情况下,key重名时,会覆盖/////////////////////
// 合并2个map,relation中的会放到main总,key都加上prefix
public static void merge(Map<String, Object> mainMap,
Map<String, Object> relation, String prefix) ;
// 合并2个map,如果存在重复,relationMap会覆盖main中的
public static void merge(Map<String, Object> mainMap,
Map<String, Object> relationMap) ;
// ///////////////////////寻找一个Map在一个集合中的关联Map/////////////////////
/**
* 从一个集合中找到目标对象,如果没有找到,返回null
*
* @param 2个map共同的key
*/
public static Map<String, Object> relationMap(Map<String, Object> mainMap,
List<Map<String, Object>> list, String relationKey) ;
// 找到1个map在集合list中需要关联的对象,分别指定各自的key
public static Map<String, Object> relationMap(Map<String, Object> mainMap,
String mainKey, List<Map<String, Object>> list, String relationKey) ;
工具方法的源码就不提供了,Java Web开发的流程和基础库还在持续积累中。
原文首发:http://fansunion.cn/article/detail/540.html
不使用left-join等多表关联查询,只用单表查询和Java程序,简便实现“多表查询”效果的更多相关文章
- java程序获得SqlServer数据表的表结构
/** * 取得一张表的结构信息 * 使用DatabaseMetaData与ResultSetMetaData结合的方式获取全部属性 * @param conn 数据连接 * @p ...
- SQL语句分组排序,多表关联排序
SQL语句分组排序,多表关联排序总结几种常见的方法: 案例一: 在查询结果中按人数降序排列,若人数相同,则按课程号升序排列? 分析:单个表内的多个字段排序,一般可以直接用逗号分割实现. select ...
- Oracle\MS SQL Server Update多表关联更新
原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表 ...
- MapRedece(多表关联)
多表关联: 准备数据 ******************************************** 工厂表: Factory Addressed BeijingRedStar 1 Shen ...
- Yii2中多表关联查询(join、joinwith)
我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name ...
- Oracle数据库,join多表关联方式、union结果集合并
join on : 多表关联 内连接 :与其他表连接 from 表1 t join 表2 s on t.字段1 =s.字段2 join 表3 n on n.字段3=t.字段1 或 from 表1 ...
- [moka同学笔记]Yii2中多表关联查询(join、joinwith) (摘录)
表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name cu ...
- Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)(转)
我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_ ...
- Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)
我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_ ...
- [NewLife.XCode]扩展属性(替代多表关联Join提升性能)
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示 ...
随机推荐
- Windows平台上的pip安装
写在前面 pip 是 Python 的包管理工具,在 Python 开发中必不可少.作为一名python菜鸟,本文在踩坑无数的基础上尽可能详细地解释pip的安装过程.在安装之前需要明确两点: 1.pi ...
- 【例题 8-7 UVA - 11572】Unique Snowflakes
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 类似尺取法. 用set判断这段区间有没有重复的数字. 有的话,就把头节点的那个数字删掉,直到没有为止. [代码] /* 1.Shou ...
- SpringMVC 传递相同名称的参数的最佳方法
华为云4核8G,高性能云服务器,免费试用 >>> SpringMVC 多个对象的相同字段参数传递解决方案,在SpringMVC中,有时需要传递多个对象(除了Model和web元素 ...
- mysql测试spring事务是否生效
同时对三张表进行插入操作,事务保证完整性.下面进行简单测试: 1. 锁定表 锁定用户表 LOCK TABLES user WRITE; 查看表是否锁定: show ; 显示被锁定的表. 2. 验证在同 ...
- springMVC视图解析器——InternalResourceViewResolver(转)
springmvc在处理器方法中通常返回的是逻辑视图,如何定位到真正的页面,就需要通过视图解析器. springmvc里提供了多个视图解析器,InternalResourceViewResolver就 ...
- [appium]-9宫格解锁方法
from appium.webdriver.common.touch_action import TouchAction TouchAction(self.driver).press(x=228,y= ...
- windows下配置mycat与常见问题解决
mycat官网:http://www.mycat.org.cn/ wiki:https://github.com/MyCATApache/Mycat-Server/wiki MyCat使用Mysql的 ...
- 洛谷—— P1069 细胞分裂
https://www.luogu.org/problem/show?pid=1069#sub 题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细 ...
- 洛谷 P2069 松鼠吃果子
P2069 松鼠吃果子 题目描述 有N个一种松鼠喜欢吃的果子由下向上串排成一列,并标号1,2,...N.一只松鼠从最下果子开始向上跳,并且第i次跳可以一次跳过i*i*i除以5的余数+1个果子(=i*i ...
- (转)oracle表空间使用率统计查询
转自:http://www.cnblogs.com/xwdreamer/p/3511047.html 参考文献 文献1:http://blog.itpub.net/24104518/viewspace ...