不使用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. 整个系列教程会大量结合示 ...
随机推荐
- material风格前端CSS框架——Materialize
官方网站:http://materializecss.com/(有中文,翻译不全) 中文学习站:http://www.materializecss.cn/(翻译较全)
- Redmine安装
http://www.itnpc.com/news/web/146433249372595.html http://www.cnblogs.com/iluzhiyong/p/redmine.html ...
- Quick Sort Algorithm
快速排序算法实现代码: //============================================================================ // Name : ...
- VC 常见问题百问
http://www.cnblogs.com/cy163/archive/2006/06/19/429796.html 经典Vc书 Charles Petzold 的<Programming W ...
- [Angular] Http Custom Headers and RequestOptions
updatePassenger(passenger: Passenger): Observable<Passenger> { let headers = new Headers({ 'Co ...
- Spring Boot集成EHCache实现缓存机制
SpringBoot 缓存(EhCache 2.x 篇) SpringBoot 缓存 在 Spring Boot中,通过@EnableCaching注解自动化配置合适的缓存管理器(CacheManag ...
- 希捷硬盘扩容软件-----DiscWizard
SeagateDiscWizard可为Seagate磁盘驱动器的使用提供便利.DiscWizard可帮助您迅速安装新的磁盘驱动器.并通过安装向导指导您在磁盘驱动器上完毕分区的创建和格式化. DiscW ...
- Visual studio编译器窗体重置
针对vs2003: 第一种方法 在"工具"->"选项"对话框里面: 在"选项"以下的"常规"有个"重置 ...
- 使用wepy开发微信小程序商城第二篇:路由配置和页面结构
使用wepy开发微信小程序商城 第二篇:路由配置和页面结构 前言: 最近公司在做一个微信小程序的项目,用的是类似于vue的wepy框架.我也借此机会学习和实践一下. 小程序官方文档:https://d ...
- OC学习篇之---文件的操作
今天我们来介绍OC中文件操作,在之前的文章中,已经接触到了文件的创建了,但是那不是很具体和详细,这篇文章我们就来仔细看一下OC中是如何操作文件的: 第一.首先来看一下本身NSString类给我们提供了 ...