MyBatis分页剖析

    对于Mybatis的分页,selectList方法是通过传一个RowBounds对象过去实现的。如:session.selectList("com.wheat.dao.UserDao.returnAllUser",null, new RowBounds(10,20)); 运行起来没有问题。在调优的时候发现,怎么后台的打印信息怎么那么多的?我分页大小是20,log4j却常常打印一整版。我调用出错了?查了下一切正常。

    今天决定在机器上试验下。我写了两种方式的分页。一种是Mybatis内置的分页,另一种是自己写SQL的分页。数据库依然是MySQL,测试环境Junit。

    上码,Mybatis内置的分页:

	@Test
	@SuppressWarnings("rawtypes")
	public void TestUserDaoPagingWithMybatisWay() throws IOException{
		String resource = "META-INF/conf/mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		SqlSession session = sqlSessionFactory.openSession();
		List result = session.selectList("com.wheat.dao.UserDao.returnAllUser", null, new RowBounds(10,20));
		if(result!=null){
			for(Object o:result){
				Map map = (Map) o;
				System.out.print(map.get("ID")+",");
				System.out.print(map.get("USERNO")+",");
				System.out.println(map.get("USERNAME"));
			}
			System.out.println("success!");
		}
	}

    SQL的分页:

	@Test
	@SuppressWarnings("rawtypes")
	public void TestUserDaoPagingWithMyWay() throws IOException{
		String resource = "META-INF/conf/mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		SqlSession session = sqlSessionFactory.openSession();
		HashMap<String, Object> requestParameters = new HashMap<String, Object>();
		requestParameters.put("begin", 10);
		requestParameters.put("pageSize", 20);
		List result = session.selectList("com.wheat.dao.UserDao.returnAllUserWithPaging",requestParameters);
		if(result!=null){
			for(Object o:result){
				Map map = (Map) o;
				System.out.print(map.get("ID")+",");
				System.out.print(map.get("USERNO")+",");
				System.out.println(map.get("USERNAME"));
			}
			System.out.println("success!");
		}
	}

    对应的Mapper文件代码:

	<select id="returnAllUser" resultType="java.util.HashMap" >
		<![CDATA[
			SELECT ID, USERNAME, USERNO FROM USERINFO
		]]>
	</select>
	<select id="returnAllUserWithPaging" resultType="java.util.HashMap" parameterType="java.util.HashMap">
		<![CDATA[
			SELECT ID, USERNAME, USERNO FROM USERINFO
		]]>
		<trim prefix="LIMIT" prefixOverrides=",">
			<if test="begin != null">#{begin,jdbcType=NUMERIC}</if>
			<if test="pageSize != null">,#{pageSize,jdbcType=NUMERIC}</if>
		</trim>
	</select>

     运行的控制台信息:

     Mybatis内置的分页:

     SQL的分页:

    从上面可以看到,Mybatis内置方式的分页其实是先将表中的前面 (初始位置+分页大小)行返回,再从中截取最后面分页大小行数据返回给我们。而不是像我之前所想的那样,Mybatis先将分页语句按语言特性重写再执行。

    所以在使用MyBatis开发时,分页语句还是得自己写。如果涉及到上万行的查询。这个性能瓶颈将变得很明显。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis分页查询在处理大量数据时可能会变得越来越慢的原因有以下几点。 首先,当分页查询的页数逐渐增加时,数据库需要处理更多的数据,这会导致查询的执行时间逐渐增加。特别是当查询条件没有有效的索引或索引不匹配查询语句时,数据库需要扫描更多的数据页,这将导致查询效率降低。 其次,如果数据库的数据量逐渐增加,查询可能会变得越来越慢。当数据量增加时,数据库需要更多的时间来读取、输和处理数据。此外,如果数据表存在大量的重复数据、未使用的索引或复杂的连接查询,都会导致查询变慢。 另外,单个查询的数据量也会影响查询速度。如果查询结果集有大量的数据需要输给应用程序,会导致查询变慢。此时,可以考虑对查询结果进行分批处理,减少一次性输的数据量。 还有可能的原因是查询语句的性能优化不充分,没有使用合适的索引或优化的查询语句。可以通过分析查询语句的执行计划,找出导致查询变慢的原因,并对查询语句进行调优,如添加合适的索引、优化SQL语句的写法等。 总结起来,MyBatis分页查询变慢的原因可能是页数增加导致的查询数据量增大、数据库数据量增加、单次查询数据量大以及查询语句性能优化不充分。为了提升查询性能,可以考虑使用合适的索引、优化查询语句、分批处理查询结果以及合理控制查询数据量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值