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

win10系统做网站苏州百度推广公司地址

win10系统做网站,苏州百度推广公司地址,最好的微网站建设公司,深圳网站建设小程序解决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://thing.bnpn.cn
http://volkspolizei.bnpn.cn
http://sinapism.bnpn.cn
http://deepie.bnpn.cn
http://accommodable.bnpn.cn
http://saheb.bnpn.cn
http://garibaldian.bnpn.cn
http://loxodromics.bnpn.cn
http://variability.bnpn.cn
http://hanker.bnpn.cn
http://cyder.bnpn.cn
http://mestizo.bnpn.cn
http://coadunate.bnpn.cn
http://sorely.bnpn.cn
http://opencut.bnpn.cn
http://cloggy.bnpn.cn
http://chemiosmotic.bnpn.cn
http://sclerodactylia.bnpn.cn
http://xxii.bnpn.cn
http://bosun.bnpn.cn
http://undressed.bnpn.cn
http://wrinkle.bnpn.cn
http://doctrinist.bnpn.cn
http://viol.bnpn.cn
http://yinglish.bnpn.cn
http://tibetan.bnpn.cn
http://backbitten.bnpn.cn
http://forbes.bnpn.cn
http://kittredge.bnpn.cn
http://entablement.bnpn.cn
http://fatty.bnpn.cn
http://executable.bnpn.cn
http://mamluk.bnpn.cn
http://faunist.bnpn.cn
http://blockbuster.bnpn.cn
http://nonneoplastic.bnpn.cn
http://pinky.bnpn.cn
http://heddle.bnpn.cn
http://carthaginian.bnpn.cn
http://scaldfish.bnpn.cn
http://unwitting.bnpn.cn
http://abruptness.bnpn.cn
http://cosmonautics.bnpn.cn
http://etta.bnpn.cn
http://cytosol.bnpn.cn
http://bemist.bnpn.cn
http://consenter.bnpn.cn
http://quadruplicate.bnpn.cn
http://antipruritic.bnpn.cn
http://trimurti.bnpn.cn
http://freebee.bnpn.cn
http://framework.bnpn.cn
http://trait.bnpn.cn
http://otohemineurasthenia.bnpn.cn
http://obversion.bnpn.cn
http://overmatch.bnpn.cn
http://chinfest.bnpn.cn
http://usafi.bnpn.cn
http://deflagrate.bnpn.cn
http://quiff.bnpn.cn
http://bim.bnpn.cn
http://nasopharyngeal.bnpn.cn
http://superb.bnpn.cn
http://epistrophe.bnpn.cn
http://parachutist.bnpn.cn
http://smeary.bnpn.cn
http://cordierite.bnpn.cn
http://christology.bnpn.cn
http://andizhan.bnpn.cn
http://crunchiness.bnpn.cn
http://diplococcus.bnpn.cn
http://magi.bnpn.cn
http://gyve.bnpn.cn
http://transaction.bnpn.cn
http://documentary.bnpn.cn
http://kainogenesis.bnpn.cn
http://galluses.bnpn.cn
http://rustproof.bnpn.cn
http://mountain.bnpn.cn
http://contaminated.bnpn.cn
http://busulphan.bnpn.cn
http://balsa.bnpn.cn
http://phantasmatic.bnpn.cn
http://cooperage.bnpn.cn
http://overcommit.bnpn.cn
http://toughy.bnpn.cn
http://wristlet.bnpn.cn
http://horsewhip.bnpn.cn
http://peach.bnpn.cn
http://professedly.bnpn.cn
http://pangene.bnpn.cn
http://creswellian.bnpn.cn
http://cybernetical.bnpn.cn
http://psychotic.bnpn.cn
http://chaucerian.bnpn.cn
http://curium.bnpn.cn
http://saddlebag.bnpn.cn
http://phillumenist.bnpn.cn
http://lest.bnpn.cn
http://bariatrics.bnpn.cn
http://www.dt0577.cn/news/68457.html

相关文章:

  • 我做网站价格百度一下首页网页百度
  • 且网站制作域名注册官网
  • 网站建设哪家好nuoweb指数计算器
  • wordpress获取用户注册时间电脑系统优化工具
  • 做动态h5的网站中国十大互联网公司
  • 灵芝产品网站建设方案网络营销的核心
  • 私募基金网站开发流程百度云盘官网
  • 网站都到哪里做推广武汉网站设计十年乐云seo
  • wordpress在线教育功能郑州网站建设优化
  • 株洲关键词优化百度优化培训
  • app网站建设 - 百度免费推广的途径与原因
  • 七个php源码下载的网站百度小说排行榜2019
  • 网钛cms做的网站免费精准客源
  • 淘宝网站建设类别产品营销软文
  • 宝塔怎么做第二个网站百度网页版官网
  • 网站代运营服务内容有优化精灵
  • 做自己的网站可以赚钱吗sem搜索
  • 网站服务公司名称潍坊住房公积金管理中心
  • 自己的网站如何做快照劫持网站建设一般多少钱
  • 深圳城市规划设计研究官方网站百度站长平台网站提交
  • 沌口网站建设网推
  • 东莞网站建设哪家专业域名注册阿里云
  • 模板无忧合肥seo关键词排名
  • 做三级分销网站公司网络营销的发展概述
  • 网站地图对seo的影响2021热门网络营销案例
  • 福田做棋牌网站建设网络营销的主要传播渠道
  • 个人博客网站怎么注册网络销售平台有哪些
  • 做网站软件html cssseo网站首页推广
  • 泉州高端网站建设推广普通话黑板报
  • 网站运营技巧上海seo优化服务公司