zoukankan      html  css  js  c++  java
  • select支持多查询,获取分页count

    在我们使用mybatis 时,当我们根据分页去查询数据集时,需要传入的参数有page(页码)和size(每页的条数),而我们期望获取到的数据有,小于或等于size的list数据集,同时我们还需要得到一个count,总共的数据条数。 

    官方提供了一个select sql_calc_found_rows 字段 from 表 ... ; 然后再调用select found_rows(); 获取总记录数。 那么如何在mybatis中同时执行两个sql获取结果集? 

    解决方法:
    (1)连接数据库的时候,指定可支持多查询“allowMultiQueries=true”,如配置文件中 jdbc.url=jdbc:mysql://localhost:3306/wash?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
    (2)mybatis的xml文件中查询语句添加一个结果集,并且用逗号隔开。 resultMap="BaseResultMap, countAdminResultMap"。同时select 之后添加一个关键字 sql_calc_found_rows (必须)。

     <resultMap type="Integer" id="countAdminResultMap">
        <result column="count" jdbcType="INTEGER" javaType="Integer" />
      </resultMap>
      <select id="listdata" resultMap="BaseResultMap, countAdminResultMap" parameterType="java.util.Map">
        select sql_calc_found_rows id, username, mobile, password, type
        from sys_admin where 1 = 1 
        <include refid="Base_If_Condition" /> 
             limit #{pageSizeBegin, jdbcType=INTEGER} , #{pageSize, jdbcType=INTEGER};
        SELECT found_rows() as count;
      </select>

    (3)mapper文件方法名

    List<?> listdata(Map<String, Object> paramMap);

    (4)service方法

    这里仅查看serviceImpl方法即可。 这里返回的List<?> 包含两个数据,一个是数据list,另一个是count。接收它们放入我们的Page对象即可。

    public Page<Map<String, Object>> listdata(Map<String, Object> paramMap) {
            List<?> list = adminMapper.listdata(paramMap);
            List<Map<String, Object> > listMaps = new ArrayList<>();   
            listMaps = (List<Map<String, Object> >) list.get(0);    //数据list
            int count = ((List<Integer>)list.get(1)).get(0);  //总记录数
            Page<Map<String, Object> > page = new Page<Map<String, Object> >();
            page.setData(listMaps);
            page.setCount(count);
            return page;
        }

    总结:通过这种方法,我们可以方便的获取到count,而不需要两次连接数据库,执行一次不必要的查询。 而以上这种方式主要利用的缓存,第二次查询直接从缓存中查出数据,花费时间可忽略不计。

    本文转载自 https://blog.csdn.net/qq_31122833/article/details/83894992 ,用自己的话整理了一遍。方便以后回顾使用。

  • 相关阅读:
    oracle 例外
    Help with Intervals(集合的交并补,线段树)
    Mex(线段树的巧妙应用)
    hdu4578Transformation(线段树多个lz标记)
    Coder(线段树)
    Ice-cream Tycoon9(线段树)
    Partition(线段树的离线处理)
    ACM学习大纲(转)
    Codeforces Round #250 (Div. 1)
    记次浙大月赛 134
  • 原文地址:https://www.cnblogs.com/greys/p/MultiQueries.html
Copyright © 2011-2022 走看看