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 ,用自己的話整理了一遍。方便以后回顧使用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM