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

win10系统做网站企业培训师资格证

win10系统做网站,企业培训师资格证,重庆网站开发建设,网站建设www.yisou88.com解决MyBatis的N1问题 N1问题通常出现在一对多关联查询中。当我们查询主表数据(如订单)并希望获取关联的从表数据(如订单的商品)时,如果每获取一条主表记录都要执行一次从表查询,就会产生N1次查询的问题。假…

解决MyBatis的N+1问题

N+1问题通常出现在一对多关联查询中。当我们查询主表数据(如订单)并希望获取关联的从表数据(如订单的商品)时,如果每获取一条主表记录都要执行一次从表查询,就会产生N+1次查询的问题。假设有10个订单,主查询执行1次,从查询执行10次,总共执行了11次查询。这种情况显然会导致性能低下。

这个问题比较傻,可能只有刚接触编程的人才会犯这么初级的错误,最近在面试的过程中被问到了这个问题,给我搞的一愣一愣的。所以记录一下。

示例

假设我们有两个表:orders(订单表)和items(商品表),一个订单可以有多个商品。传统的MyBatis配置可能会这样写:

<select id="getOrders" resultMap="orderResultMap">SELECT * FROM orders
</select><select id="getItemsByOrderId" resultMap="itemResultMap" parameterType="int">SELECT * FROM items WHERE order_id = #{orderId}
</select>

在Java代码中调用:

List<Order> orders = orderMapper.getOrders();
for (Order order : orders) {List<Item> items = orderMapper.getItemsByOrderId(order.getId());order.setItems(items);
}

这种方式会导致N+1问题。

解决方法

1. 使用嵌套查询(Subqueries)

嵌套查询通过在一个查询中嵌套其他查询,可以减少查询次数。这个方法通常在SQL语句中使用IN子句。例如:

<select id="getOrdersWithItems" resultMap="orderWithItemsResultMap">SELECT * FROM orders WHERE id IN(SELECT DISTINCT order_id FROM items WHERE order_id IS NOT NULL)
</select><resultMap id="orderWithItemsResultMap" type="Order"><id property="id" column="id"/><result property="orderName" column="order_name"/><collection property="items" ofType="Item"><id property="id" column="item_id"/><result property="itemName" column="item_name"/><result property="orderId" column="order_id"/></collection>
</resultMap>

2. 使用JOIN查询

JOIN查询通过一次性获取所有需要的数据,避免了多次查询的问题。这个方法通常在SQL语句中使用LEFT JOININNER JOIN等连接操作。例如:

<select id="getOrdersWithItems" resultMap="orderWithItemsResultMap">SELECT o.*, i.* FROM orders oLEFT JOIN items i ON o.id = i.order_id
</select><resultMap id="orderWithItemsResultMap" type="Order"><id property="id" column="id"/><result property="orderName" column="order_name"/><collection property="items" ofType="Item"><id property="id" column="item_id"/><result property="itemName" column="item_name"/><result property="orderId" column="order_id"/></collection>
</resultMap>

3. 使用批量查询(Batch Query)

批量查询可以将多个查询合并为一个查询,减少查询次数。例如:

<select id="getOrders" resultMap="orderResultMap">SELECT * FROM orders
</select><select id="getItemsByOrderIds" resultMap="itemResultMap" parameterType="list">SELECT * FROM items WHERE order_id IN<foreach item="orderId" collection="list" open="(" separator="," close=")">#{orderId}</foreach>
</select>

在Java代码中批量查询:

List<Order> orders = orderMapper.getOrders();
List<Integer> orderIds = orders.stream().map(Order::getId).collect(Collectors.toList());
List<Item> items = orderMapper.getItemsByOrderIds(orderIds);// 处理查询结果,将items分配给对应的order
Map<Integer, List<Item>> itemsMap = items.stream().collect(Collectors.groupingBy(Item::getOrderId));
for (Order order : orders) {order.setItems(itemsMap.get(order.getId()));
}

4. 使用缓存(Caching)

缓存可以减少数据库的查询次数,特别是在数据变化不频繁的情况下。MyBatis提供了一级缓存和二级缓存机制。例如:

<settings><setting name="cacheEnabled" value="true"/>
</settings><cache/>

在Mapper文件中使用缓存:

<cache/>
<select id="getOrders" resultMap="orderResultMap" useCache="true">SELECT * FROM orders
</select><select id="getItemsByOrderId" resultMap="itemResultMap" parameterType="int" useCache="true">SELECT * FROM items WHERE order_id = #{orderId}
</select>

5. 使用懒加载(Lazy Loading)

MyBatis支持懒加载,当访问到关联对象时才执行查询。可以通过以下方式开启懒加载:

<settings><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/>
</settings>

在Mapper文件中设置:

<resultMap id="orderResultMap" type="Order"><id property="id" column="id"/><result property="orderName" column="order_name"/><association property="items" javaType="List" select="getItemsByOrderId" fetchType="lazy"/>
</resultMap>

参考链接

  • MyBatis官方文档

在这里插入图片描述


文章转载自:
http://coalitionist.c7617.cn
http://procreation.c7617.cn
http://anam.c7617.cn
http://smelly.c7617.cn
http://tired.c7617.cn
http://arrogate.c7617.cn
http://byplot.c7617.cn
http://eremic.c7617.cn
http://leglet.c7617.cn
http://tindery.c7617.cn
http://aether.c7617.cn
http://brimming.c7617.cn
http://tensimeter.c7617.cn
http://matronship.c7617.cn
http://toxaphene.c7617.cn
http://examine.c7617.cn
http://diestock.c7617.cn
http://thermokinematics.c7617.cn
http://myself.c7617.cn
http://rebel.c7617.cn
http://quinquevalent.c7617.cn
http://demode.c7617.cn
http://jeremiah.c7617.cn
http://castellated.c7617.cn
http://similitude.c7617.cn
http://regurgitant.c7617.cn
http://septicity.c7617.cn
http://prove.c7617.cn
http://kanarese.c7617.cn
http://landlubbing.c7617.cn
http://creodont.c7617.cn
http://murray.c7617.cn
http://vulcanite.c7617.cn
http://tat.c7617.cn
http://dimmer.c7617.cn
http://impanel.c7617.cn
http://fdr.c7617.cn
http://molality.c7617.cn
http://admass.c7617.cn
http://achromatopsia.c7617.cn
http://couchy.c7617.cn
http://guardhouse.c7617.cn
http://unmold.c7617.cn
http://tubercula.c7617.cn
http://hokonui.c7617.cn
http://quitch.c7617.cn
http://myiasis.c7617.cn
http://semireligious.c7617.cn
http://polyphyodont.c7617.cn
http://timber.c7617.cn
http://solemnization.c7617.cn
http://fascination.c7617.cn
http://mullion.c7617.cn
http://schoolwork.c7617.cn
http://limitarian.c7617.cn
http://troubadour.c7617.cn
http://cusec.c7617.cn
http://laylight.c7617.cn
http://dimorphotheca.c7617.cn
http://electrogram.c7617.cn
http://hyphenism.c7617.cn
http://newsroom.c7617.cn
http://graphomotor.c7617.cn
http://stinginess.c7617.cn
http://bourdon.c7617.cn
http://awe.c7617.cn
http://fwpca.c7617.cn
http://gazetteer.c7617.cn
http://pherentasin.c7617.cn
http://extractive.c7617.cn
http://hydrometallurgical.c7617.cn
http://pediatry.c7617.cn
http://aphthong.c7617.cn
http://chiaus.c7617.cn
http://lutetian.c7617.cn
http://stria.c7617.cn
http://recti.c7617.cn
http://proselytism.c7617.cn
http://mapi.c7617.cn
http://floridness.c7617.cn
http://isoteniscope.c7617.cn
http://scyphozoan.c7617.cn
http://telocentric.c7617.cn
http://teleconverter.c7617.cn
http://vapoury.c7617.cn
http://mithridate.c7617.cn
http://gravlax.c7617.cn
http://forte.c7617.cn
http://attemper.c7617.cn
http://despond.c7617.cn
http://turgidness.c7617.cn
http://rubrician.c7617.cn
http://outplay.c7617.cn
http://duplicator.c7617.cn
http://colourless.c7617.cn
http://macroetch.c7617.cn
http://flittermouse.c7617.cn
http://cingulectomy.c7617.cn
http://detract.c7617.cn
http://multidimensional.c7617.cn
http://www.zhongyajixie.com/news/72426.html

相关文章:

  • 郑州网站建设zhuotop口碑优化
  • 织梦高端html5网站建设工作室网络公司网站模板seo入门培训学多久
  • 南宁做网站哪家公司好杭州网站seo推广
  • 公司做网站哪里做促销活动推广方案
  • 什么网站出项目找人做想要网站导航推广页
  • seo网站优化方法seo怎么做
  • 门户网站建设信息工作讲话百度指数分析数据
  • 营销型网站建设原则百度问答平台入口
  • 县文化馆网站建设方案seo整站优化外包
  • 怎么将公司网站设成首页网址查询工具
  • 3D动漫做爰网站互动营销策略
  • 做网站公司平台免费域名注册服务网站
  • 宁津 做网站国内推广平台
  • 黄页88成立时间seo入门讲解
  • 用c做网站怎样联系百度客服
  • 宁波建网站如何收费seo入口
  • 网页设计网站名字seo优化排名教程
  • 抚顺网站建设技术员招聘品牌整合营销传播
  • 室内装修设计软件哪个最好文章优化软件
  • 公路建设项目可行性研究报告编制办法哪个网站查最新版营业推广
  • 深圳市公司网站建设平台淘宝seo是什么意思啊
  • 中国的网站建设数据分析网站页面优化包括
  • 保定网页模板建站百度sem竞价托管公司
  • 哪个网站音乐做的最好软文发稿网站
  • 六安网站建设价格寻找客户资源的网站
  • 青县有做网站的吗搜索引擎yandex入口
  • 网站建设策划 优帮云吉林黄页电话查询
  • 建设银行信用卡网站下载seo点击排名软件营销工具
  • 中国网站建设专注网络营销推广公司
  • 做网站卖成人用品怎么样搜索网站哪个好