Mybatis批量查询比较

导读:本篇文章讲解 Mybatis批量查询比较,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

Mybatis拼装

平时我们一般都是这种写法,传一个list对象进去foreach拼接

List<ProductDto> listByProductIds(@Param("productIds")List<Long> productIds);
<select id="listByProductIds" resultType="com.forlan.product.dto.ProductDto">
	select id,name
	from TB_PROD_PRODUCT
	where STATUS = 1
  	and id in
	<foreach collection="productIds" item="id" open="(" close=")" separator=",">
		#{id}
	</foreach>
</select>

手写代码拼装

优化后的写法,在代码组装好,然后直接传一个字符串进去拼接,直接把in的内容当做一个参数传进去,${}

List<ProductDto> listByCombinationProductIds(@Param("productIds") String productIds);
<select id="listByCombinationProductIds" resultType="com.forlan.product.dto.ProductDto">
	select id,name
	from TB_PROD_PRODUCT
	where STATUS = 1
  	and id in (${productIds});
</select>

效率比较

分别测试了10、100、1000、1W、10W、100W的量级
测试代码

@Autowired
private ProductDao productDao;
@Test
public void test() {
	long number = 10;
	for (int power = 1; power <= 6; power++) {
		List<Long> productIds = new ArrayList<>();
		long total = (long) Math.pow(number, power);
		for (long i = 1; i <= total; i++) {
			productIds.add(i);
		}
		StopWatch stopWatch = new StopWatch("测试" + total + "个拼接");
		
		stopWatch.start("mybatis拼装");
		productDao.listByProductIds(productIds);
		stopWatch.stop();
		
		stopWatch.start("手写代码拼装");
		productDao.listByCombinationProductIds(Joiner.on(",").join(productIds));
		stopWatch.stop();
		
		System.out.println(stopWatch.prettyPrint());
		System.out.println();
	}
}

运行结果

StopWatch '测试10个拼接': running time (millis) = 427
-----------------------------------------
ms     %     Task name
-----------------------------------------
00417  098%  mybatis拼装
00010  002%  手写代码拼装


StopWatch '测试100个拼接': running time (millis) = 21
-----------------------------------------
ms     %     Task name
-----------------------------------------
00012  057%  mybatis拼装
00009  043%  手写代码拼装


StopWatch '测试1000个拼接': running time (millis) = 39
-----------------------------------------
ms     %     Task name
-----------------------------------------
00026  067%  mybatis拼装
00013  033%  手写代码拼装


StopWatch '测试10000个拼接': running time (millis) = 218
-----------------------------------------
ms     %     Task name
-----------------------------------------
00160  073%  mybatis拼装
00058  027%  手写代码拼装


StopWatch '测试100000个拼接': running time (millis) = 1314
-----------------------------------------
ms     %     Task name
-----------------------------------------
00998  076%  mybatis拼装
00316  024%  手写代码拼装


StopWatch '测试1000000个拼接': running time (millis) = 13370
-----------------------------------------
ms     %     Task name
-----------------------------------------
09863  074%  mybatis拼装
03507  026%  手写代码拼装

通过对比不同量级,手写代码拼装的方式,效率高

总结

方式 效率
mybatis拼装
手写代码拼接
备注说明

mybatis拼装效率低的原因,实际上是foreach导致

select id,name
	from TB_PROD_PRODUCT
	where STATUS = 1
	and id in
	<foreach collection="productIds" item="id" open="(" close=")" separator=",">
		#{id}
	</foreach>

实际上是先解析成

select id,name 
	from TB_PROD_PRODUCT 
	where STATUS = 1 
	and id in (#{__frch_id_0},  #{__frch_id_1}, #{__frch_id_2})

然后通过PreparedStatment 的 setXXX来进行赋值,就是还要循环解析 #{__frch_item_0} 之类的占位符,foreach 的集合越大,解析越慢。
所以,我们直接使用手写代码拼接,效率就快了很多。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/88966.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!