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

c 网站做微信支付功能手机网站建设策划

c 网站做微信支付功能,手机网站建设策划,wordpress 教育类主题,多用户商城系统的效果解决MyBatis的N1问题 N1问题通常出现在一对多关联查询中。当我们查询主表数据#xff08;如订单#xff09;并希望获取关联的从表数据#xff08;如订单的商品#xff09;时#xff0c;如果每获取一条主表记录都要执行一次从表查询#xff0c;就会产生N1次查询的问题。假…解决MyBatis的N1问题 N1问题通常出现在一对多关联查询中。当我们查询主表数据如订单并希望获取关联的从表数据如订单的商品时如果每获取一条主表记录都要执行一次从表查询就会产生N1次查询的问题。假设有10个订单主查询执行1次从查询执行10次总共执行了11次查询。这种情况显然会导致性能低下。 这个问题比较傻可能只有刚接触编程的人才会犯这么初级的错误最近在面试的过程中被问到了这个问题给我搞的一愣一愣的。所以记录一下。 示例 假设我们有两个表orders订单表和items商品表一个订单可以有多个商品。传统的MyBatis配置可能会这样写 select idgetOrders resultMaporderResultMapSELECT * FROM orders /selectselect idgetItemsByOrderId resultMapitemResultMap parameterTypeintSELECT * FROM items WHERE order_id #{orderId} /select在Java代码中调用 ListOrder orders orderMapper.getOrders(); for (Order order : orders) {ListItem items orderMapper.getItemsByOrderId(order.getId());order.setItems(items); }这种方式会导致N1问题。 解决方法 1. 使用嵌套查询Subqueries 嵌套查询通过在一个查询中嵌套其他查询可以减少查询次数。这个方法通常在SQL语句中使用IN子句。例如 select idgetOrdersWithItems resultMaporderWithItemsResultMapSELECT * FROM orders WHERE id IN(SELECT DISTINCT order_id FROM items WHERE order_id IS NOT NULL) /selectresultMap idorderWithItemsResultMap typeOrderid propertyid columnid/result propertyorderName columnorder_name/collection propertyitems ofTypeItemid propertyid columnitem_id/result propertyitemName columnitem_name/result propertyorderId columnorder_id//collection /resultMap2. 使用JOIN查询 JOIN查询通过一次性获取所有需要的数据避免了多次查询的问题。这个方法通常在SQL语句中使用LEFT JOIN或INNER JOIN等连接操作。例如 select idgetOrdersWithItems resultMaporderWithItemsResultMapSELECT o.*, i.* FROM orders oLEFT JOIN items i ON o.id i.order_id /selectresultMap idorderWithItemsResultMap typeOrderid propertyid columnid/result propertyorderName columnorder_name/collection propertyitems ofTypeItemid propertyid columnitem_id/result propertyitemName columnitem_name/result propertyorderId columnorder_id//collection /resultMap3. 使用批量查询Batch Query 批量查询可以将多个查询合并为一个查询减少查询次数。例如 select idgetOrders resultMaporderResultMapSELECT * FROM orders /selectselect idgetItemsByOrderIds resultMapitemResultMap parameterTypelistSELECT * FROM items WHERE order_id INforeach itemorderId collectionlist open( separator, close)#{orderId}/foreach /select在Java代码中批量查询 ListOrder orders orderMapper.getOrders(); ListInteger orderIds orders.stream().map(Order::getId).collect(Collectors.toList()); ListItem items orderMapper.getItemsByOrderIds(orderIds);// 处理查询结果将items分配给对应的order MapInteger, ListItem itemsMap items.stream().collect(Collectors.groupingBy(Item::getOrderId)); for (Order order : orders) {order.setItems(itemsMap.get(order.getId())); }4. 使用缓存Caching 缓存可以减少数据库的查询次数特别是在数据变化不频繁的情况下。MyBatis提供了一级缓存和二级缓存机制。例如 settingssetting namecacheEnabled valuetrue/ /settingscache/在Mapper文件中使用缓存 cache/ select idgetOrders resultMaporderResultMap useCachetrueSELECT * FROM orders /selectselect idgetItemsByOrderId resultMapitemResultMap parameterTypeint useCachetrueSELECT * FROM items WHERE order_id #{orderId} /select5. 使用懒加载Lazy Loading MyBatis支持懒加载当访问到关联对象时才执行查询。可以通过以下方式开启懒加载 settingssetting namelazyLoadingEnabled valuetrue/setting nameaggressiveLazyLoading valuefalse/ /settings在Mapper文件中设置 resultMap idorderResultMap typeOrderid propertyid columnid/result propertyorderName columnorder_name/association propertyitems javaTypeList selectgetItemsByOrderId fetchTypelazy/ /resultMap参考链接 MyBatis官方文档
http://www.hkea.cn/news/14298429/

相关文章:

  • 云建站淘宝客吉林市做网站的公司
  • 简述什么是网站做问答的网站
  • 网站推广要多少钱给网站做网络安全的报价
  • 台州市椒江建设工程机械厂网站西安网站建设公司哪有
  • 求个网站你懂我意思是网络文化经营许可证图片
  • 网站友情链接很重要吗做的网站很卡是什么原因呢
  • php网站源码模板wordpress 数据库错误
  • sql与网站开发山东闪电建站网
  • 怎么建设网站网站百度官网首页登录
  • 网站建设英文字体格式番禺 网站建设
  • 拖拽建设网站源码免费广告设计素材
  • 做音乐的网站设计微信网站 详解
  • 深圳集团网站建设专业个人博客网站logo
  • 聊城做企业网站大宗商品最新交易平台
  • 网站被恶意点击怎么办汽车网站建设目的
  • 工厂 网站建设嵌入式软件开发工作内容
  • 达州市住房和建设厅网站网站建设科技公司外部环境分析
  • 网站统计关键词wordpress 导入demo
  • dedecms 网站导航门户网站建设存在的问题
  • 呼和浩特市手机网站如何建立公司网站意味着什么
  • 武隆网站建设费用ftp wordpress
  • 卫浴网站源码wordpress 7牛云
  • 网站建设南京公司什么是营销型网站设计
  • 太原网站建设360wordpress付费显示
  • 网站备案 做网站时就需要吗html5网站搭建
  • 手机电视网站大全wordpress获取图片id
  • 网站建设不能在淘宝发布二次开发公司
  • 汽车网站策划思行做网站
  • 域名拦截检测网站完整网站开发步骤
  • 做网站需要的执照南昌简单做网站