zoukankan      html  css  js  c++  java
  • MyBatis分页剖析

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

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

        上码,Mybatis内置的分页:

    1. <span style="font-family:SimSun;font-size:14px;">   @Test  
    2.     @SuppressWarnings("rawtypes")  
    3.     public void TestUserDaoPagingWithMybatisWay() throws IOException{  
    4.         String resource = "META-INF/conf/mybatis-config.xml";  
    5.         InputStream inputStream = Resources.getResourceAsStream(resource);  
    6.         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);  
    7.         SqlSession session = sqlSessionFactory.openSession();  
    8.         List result = session.selectList("com.wheat.dao.UserDao.returnAllUser"nullnew RowBounds(10,20));  
    9.         if(result!=null){  
    10.             for(Object o:result){  
    11.                 Map map = (Map) o;  
    12.                 System.out.print(map.get("ID")+",");  
    13.                 System.out.print(map.get("USERNO")+",");  
    14.                 System.out.println(map.get("USERNAME"));  
    15.             }  
    16.             System.out.println("success!");  
    17.         }  
    18.     }</span>  

        SQL的分页:

    1. <span style="font-family:SimSun;font-size:14px;">   @Test  
    2.     @SuppressWarnings("rawtypes")  
    3.     public void TestUserDaoPagingWithMyWay() throws IOException{  
    4.         String resource = "META-INF/conf/mybatis-config.xml";  
    5.         InputStream inputStream = Resources.getResourceAsStream(resource);  
    6.         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);  
    7.         SqlSession session = sqlSessionFactory.openSession();  
    8.         HashMap<String, Object> requestParameters = new HashMap<String, Object>();  
    9.         requestParameters.put("begin"10);  
    10.         requestParameters.put("pageSize"20);  
    11.         List result = session.selectList("com.wheat.dao.UserDao.returnAllUserWithPaging",requestParameters);  
    12.         if(result!=null){  
    13.             for(Object o:result){  
    14.                 Map map = (Map) o;  
    15.                 System.out.print(map.get("ID")+",");  
    16.                 System.out.print(map.get("USERNO")+",");  
    17.                 System.out.println(map.get("USERNAME"));  
    18.             }  
    19.             System.out.println("success!");  
    20.         }  
    21.     }</span>  

        对应的Mapper文件代码:

    1. <span style="font-family:SimSun;font-size:14px;">   <select id="returnAllUser" resultType="java.util.HashMap" >  
    2.         <![CDATA[ 
    3.             SELECT ID, USERNAME, USERNO FROM USERINFO 
    4.         ]]>  
    5.     </select>  
    6.     <select id="returnAllUserWithPaging" resultType="java.util.HashMap" parameterType="java.util.HashMap">  
    7.         <![CDATA[ 
    8.             SELECT ID, USERNAME, USERNO FROM USERINFO 
    9.         ]]>  
    10.         <trim prefix="LIMIT" prefixOverrides=",">  
    11.             <if test="begin != null">#{begin,jdbcType=NUMERIC}</if>  
    12.             <if test="pageSize != null">,#{pageSize,jdbcType=NUMERIC}</if>  
    13.         </trim>  
    14.     </select></span>  

         运行的控制台信息:

         Mybatis内置的分页:

         SQL的分页:

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

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

  • 相关阅读:
    两种方式创建Maven项目【方式二】
    两种方式创建Maven项目【方式一】
    《Java程序设计》第二周学习记录(1)
    《Java程序设计》第一周学习记录(2)
    《Java程序设计》第一周学习记录(1)
    《Java程序设计》第一周学习总结
    Python isinstance
    笔记:Struts2 Action 非泛型集合元素类型转换
    笔记:Struts2 输入校验
    笔记:Struts2 国际化
  • 原文地址:https://www.cnblogs.com/robbychan/p/3786516.html
Copyright © 2011-2022 走看看