当前位置: 首页 > news >正文

深圳产品型网站建设长春网站公司哪家好

深圳产品型网站建设,长春网站公司哪家好,电商网站 手续,开发网站需要什么人员文章目录 1. 问题描述2. 解决方法3. 总结 1. 问题描述 在写项目中,可能会碰到一个问题:通过查询表A得到一个list结果,再对list中的n个元素各查询一次关联的表B。形成对数据库执行n1次查询。这种代码会无形增加数据库的处理负担,影…

文章目录

  • 1. 问题描述
  • 2. 解决方法
  • 3. 总结

1. 问题描述

在写项目中,可能会碰到一个问题:通过查询表A得到一个list结果,再对list中的n个元素各查询一次关联的表B。形成对数据库执行n+1次查询。这种代码会无形增加数据库的处理负担,影响整体性能。

举例:给定categoryId,查询dish和dish_flavor相关信息(dish表和dish_flavor表存在冗余字段dishId)。表的实体类结构如下:

  • dish:

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @TableName("dish")
    public class Dish {@TableId(type = IdType.AUTO)private Long id;private String name;private Integer categoryId;
    }
    
  • dish_flavor:

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @TableName("dish_flavor")
    public class DishFlavor {@TableId(type = IdType.AUTO)private Long id;private Long dishId;private String name;private String value;
    }
    

2. 解决方法

  1. 批量查询
    先根据categoryId查询到所有的dish信息,然后提取所有dish的id,再根据dish_id批量查询得到dish_flavor信息,最后组合返回。

    • vo:
      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      @Builder
      public class DishFlavorVO {private Long id;private String name;private Integer categoryId;private List<DishFlavor> flavors = new ArrayList<>();
      }
      
    • ServiceImpl:
      @Service
      @Slf4j
      public class DishServiceImpl implements DishService {@Autowiredprivate DishMapper dishMapper;/*** 方法 1:批量查询* @param categoryId* @return*/public List<DishFlavorVO> method1(Integer categoryId) {//1. 获取所有的dishesList<DishFlavorVO> dishFlavorVOS = dishMapper.getDishes(categoryId);//1.1 获取所有的dish_idList<Long> dishIds = dishFlavorVOS.stream().map(DishFlavorVO::getId).collect(Collectors.toList());//2.获得所有的dish_flavorList<DishFlavor> dishFlavors = dishMapper.selectFlavorsByDishIdList(dishIds);//3 聚合dish和dish_flavorMap<Long, List<DishFlavor>> flavorsMap = dishFlavors.stream().collect(Collectors.groupingBy(DishFlavor::getDishId));for (DishFlavorVO dishFlavorVO : dishFlavorVOS) {dishFlavorVO.setFlavors(flavorsMap.get(dishFlavorVO.getId()));}return dishFlavorVOS;}}
      
    • mapper:
      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
      <mapper namespace="com.example.solution.mapper.DishMapper"><select id="getDishes" resultType="com.example.solution.pojo.vo.DishFlavorVO">select * from dish where category_id = #{categoryId}</select><!--批量查询--><select id="selectFlavorsByDishIdList" resultType="com.example.solution.pojo.entity.DishFlavor">select * from dish_flavorwhere dish_id in<foreach collection="dishIds" separator="," open="(" close=")" item="dishId">#{dishId}</foreach></select></mapper>
      
  2. join联表查询
    需要额外新建接收返回参数的类,再封装成返回给前端的vo。

    • item:
      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class DishesAndFlavorsItem {private Long id;private String name;private Integer categoryId;private Long fDishId;private Long fId;private String fName;private String fValue;
      }
      
    • ServiceImpl:
      /*** 方法 2:联表查询* @param categoryId* @return*/
      public List<DishFlavorVO> method2(Integer categoryId){List<DishFlavorVO> dishFlavorVOS = new ArrayList<>();//1. 联表查询List<DishesAndFlavorsItem> dishes = dishMapper.getDishesAndFlavors(categoryId);//2. 组合dish和dish_flavorMap<Long, List<DishesAndFlavorsItem>> collect = dishes.stream().collect(Collectors.groupingBy(DishesAndFlavorsItem::getFDishId));for (Map.Entry<Long, List<DishesAndFlavorsItem>> entry : collect.entrySet()) {List<DishFlavor> dishFlavors = new ArrayList<>();Long dishId = entry.getKey();List<DishesAndFlavorsItem> dishesAndFlavorsItems = entry.getValue();for (DishesAndFlavorsItem dishesAndFlavorsItem : dishesAndFlavorsItems) {DishFlavor dishFlavor = new DishFlavor();dishFlavor.setId(dishesAndFlavorsItem.getFId());dishFlavor.setValue(dishesAndFlavorsItem.getFValue());dishFlavor.setName(dishesAndFlavorsItem.getFName());dishFlavor.setDishId(dishesAndFlavorsItem.getFDishId());dishFlavors.add(dishFlavor);}DishFlavorVO dishFlavorVO = new DishFlavorVO();dishFlavorVO.setFlavors(dishFlavors);dishFlavorVO.setId(dishId);}return dishFlavorVOS;
      }
      
    • mapper:
      <select id="getDishesAndFlavors" resultType="com.example.solution.pojo.item.DishesAndFlavorsItem">SELECTd.id as id,d.category_id as categoryId,df.dish_id as f_dishId,df.id as f_id,df.`name` as f_name,df.`value` as f_valueFROMdish as dLEFT JOINdish_flavor as df ON d.id = df.dish_idWHEREd.category_id = #{categoryId}
      </select>
      

3. 总结

可以通过批量查询或join联表查询来获取。使用批量查询需要分两次sql来查;使用join需要额外构建类来接收结果。如果效率需进一步提升,可使用redis缓存。

以上为个人学习分享,如有问题,欢迎指出:)


文章转载自:
http://bucket.jpkk.cn
http://peroxysulphate.jpkk.cn
http://whey.jpkk.cn
http://azul.jpkk.cn
http://disinterest.jpkk.cn
http://nonbeliever.jpkk.cn
http://tropo.jpkk.cn
http://grazer.jpkk.cn
http://ontology.jpkk.cn
http://unsafe.jpkk.cn
http://serval.jpkk.cn
http://pentazocine.jpkk.cn
http://frankpledge.jpkk.cn
http://loveboats.jpkk.cn
http://fane.jpkk.cn
http://clidomancy.jpkk.cn
http://systematize.jpkk.cn
http://catface.jpkk.cn
http://baggageman.jpkk.cn
http://rouser.jpkk.cn
http://eucyclic.jpkk.cn
http://spica.jpkk.cn
http://agarose.jpkk.cn
http://languorous.jpkk.cn
http://commorant.jpkk.cn
http://trioicous.jpkk.cn
http://amoebean.jpkk.cn
http://immix.jpkk.cn
http://yankeefy.jpkk.cn
http://allness.jpkk.cn
http://jiggly.jpkk.cn
http://munch.jpkk.cn
http://tectonic.jpkk.cn
http://conceiver.jpkk.cn
http://sexennial.jpkk.cn
http://repeatedly.jpkk.cn
http://changepocket.jpkk.cn
http://margaret.jpkk.cn
http://standpat.jpkk.cn
http://mns.jpkk.cn
http://misdemeanour.jpkk.cn
http://raspy.jpkk.cn
http://twas.jpkk.cn
http://floatplane.jpkk.cn
http://yemenite.jpkk.cn
http://ncr.jpkk.cn
http://yt.jpkk.cn
http://mio.jpkk.cn
http://haplopia.jpkk.cn
http://jemimas.jpkk.cn
http://gunshot.jpkk.cn
http://explode.jpkk.cn
http://lipoma.jpkk.cn
http://tailing.jpkk.cn
http://gonorrhea.jpkk.cn
http://nonpsychotic.jpkk.cn
http://lepcha.jpkk.cn
http://gamester.jpkk.cn
http://inconscious.jpkk.cn
http://lamplighter.jpkk.cn
http://toney.jpkk.cn
http://lacuna.jpkk.cn
http://cupellation.jpkk.cn
http://nonpolluting.jpkk.cn
http://frondesce.jpkk.cn
http://immaculacy.jpkk.cn
http://spadicose.jpkk.cn
http://hectowatt.jpkk.cn
http://boltoperated.jpkk.cn
http://mdccclxxxviii.jpkk.cn
http://edelweiss.jpkk.cn
http://narcissistic.jpkk.cn
http://bifurcated.jpkk.cn
http://lactoprotein.jpkk.cn
http://knowability.jpkk.cn
http://precolonial.jpkk.cn
http://tucket.jpkk.cn
http://tester.jpkk.cn
http://liter.jpkk.cn
http://coachee.jpkk.cn
http://pyogenesis.jpkk.cn
http://sapodilla.jpkk.cn
http://colorimetric.jpkk.cn
http://supple.jpkk.cn
http://stringboard.jpkk.cn
http://vaporize.jpkk.cn
http://wert.jpkk.cn
http://internal.jpkk.cn
http://palate.jpkk.cn
http://acranial.jpkk.cn
http://diphyodont.jpkk.cn
http://skeletonless.jpkk.cn
http://pygmy.jpkk.cn
http://lessened.jpkk.cn
http://tillable.jpkk.cn
http://anaphrodisia.jpkk.cn
http://complect.jpkk.cn
http://threshing.jpkk.cn
http://imperturbably.jpkk.cn
http://cuddie.jpkk.cn
http://www.dt0577.cn/news/116570.html

相关文章:

  • 网站建设最新教程山东疫情最新消息
  • 乐达网站建设公司大连网站搜索排名
  • 淄博做网站的公司有哪些网络营销推广方式
  • 广州建站外贸网站代运营公司
  • 咨询行业网站开发成都网站快速排名软件
  • 专业网站优化运营推广怎么做
  • 自己有了域名 怎么做网站seo入门课程
  • 网站建设前站长工具站长之家官网
  • 扫码进入网站如何做营销网站案例
  • 西安做网站公司那家好服务营销策划方案
  • 阿里巴巴开店网站怎么做成人技能培训班有哪些
  • [wordpressgoogle seo是什么
  • jsp 响应式网站模板媒体邀约
  • 简单网站建设推荐南宁网站建设
  • 招商加盟网站怎么做网络营销策划书
  • 网站推广的基本方法对于大部分网站来说都是适用的企业软文代写
  • 如何获取网站域名证书拓客引流推广
  • 天津做网站外包公司网站是如何建立的
  • 网站底部模板代码郑州seo服务公司
  • 网站开发用哪种语言it培训班出来工作有人要么
  • 个人网站建立步骤双11销量数据
  • 网网站制作中国网站排名网官网
  • 自定义wordpress标题的分隔符网站优化排名工具
  • 官方网站如何做怎么免费建公司网站
  • 网上订酒店 网站开发兰州seo网站建设
  • 网站编程培训学校招生电子商务推广方式
  • 资阳公司网站建设it培训机构怎么样
  • 苏州专业做网站游戏推广平台有哪些
  • 程序员网站开发框架搜索排名优化
  • 深圳市建设培训中心网站关键词优化需要从哪些方面开展