• 不使用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

  • 相关阅读:
    《开源框架那点事儿23》:采用TinyDB组件方式开发
    《开源框架那些事儿22》:UI框架设计实战
    《开源框架那些事儿21》:巧借力与借巧力
    logstash 添加nginx日志
    ossfs 使用挂在到ecs -centos 6.8
    Django JWT Token RestfulAPI用户认证
    install scrapy
    Django 1.9 + celery + django-celry 实现定时任务
    celery
    ansible常用模块用法
  • 原文地址:https://www.cnblogs.com/qitian1/p/6463075.html
Copyright © 2020-2023  润新知