Mysql分頁的存儲過程

        最近在學習Mysql存儲過程,寫了一個分頁的Demo,記錄一下。


        該存儲過程用於返回表中總記錄數,會在分頁的存儲過程中調用它。
        /*查詢表中記錄總條目數*/
        DELIMITER $
        DROP PROCEDURE IF EXISTS proc_count;
        CREATE PROCEDURE proc_count(tab_name VARCHAR(100),OUT num FLOAT(10))
        BEGIN
        SET @tabSql = CONCAT('SELECT COUNT(*) INTO @Total FROM ',tab_name);/*此處 @Total爲 記錄的總條目數*/
        PREPARE tabSql FROM @tabSql;
        EXECUTE tabSql;
        SET num = @Total;/*Total變量的值賦給num,並在調用該存儲過程時OUT*/
        END $ 
        DELIMITER ;


        該存儲過程爲分頁的邏輯,參數說明:
         tab(表的名稱)startItem (查詢第幾頁)pageSize (每頁查詢的條目數)sortRule (排序規則“asc”"desc",若無需排序輸入 ‘ ’ )order_field (要排序的字段,若無需排序輸入 ‘ ’)totalElements (輸出表中總記錄數量)pageCount (按當前每頁查詢條目數,所計算出的頁碼總數)
                
         DELIMITER $
         DROP PROCEDURE IF EXISTS proc_page;
         CREATE PROCEDURE proc_page (
              tab VARCHAR(100),
              startItem INT(10),
              pageSize INT(10),
              sortRule VARCHAR(100),
              order_field VARCHAR(100),
              OUT totalElements INT(10),
              OUT pageCount INT(10))
        BEGIN
        CALL proc_count(tab,@param);/*調用上面的存儲過程,得到表中總記錄數*/
        SET totalElements = @param;
        SET pageCount = CEIL(totalElements/pageSize);/*頁碼數=總條目數/每頁條目數*/
        IF sortRule <> ' ' THEN /*判斷是否需要排序*/
        IF sortRule = 'asc' THEN
        SET @pageSql = CONCAT(
        'SELECT * FROM ',
        tab,
        ' ORDER BY ',
        order_field,
        ' asc ',
        ' LIMIT ',
        (startItem - 1) * pageSize,
        ' , ' ,
        pageSize ) ;
        ELSE
        SET @pageSql = CONCAT(
        'SELECT * FROM ',
        tab,
        ' ORDER BY ',
        order_field,
        ' desc ',
        ' LIMIT ',
        (startItem - 1) * pageSize,
        ' , ' ,
        pageSize ) ;
        END IF;
        ELSE
        SET @pageSql = CONCAT('SELECT * FROM ' ,tab, ' LIMIT ' ,(startItem - 1) * pageSize, ' , ' ,pageSize);
        END IF;

        PREPARE pageSql FROM @pageSql;
        EXECUTE pageSql;
        END $
        DELIMITER ;

        調用該存儲過程:
         CALL proc_page('people',4,1000,'asc','id',@totalElements,@pageCount);
        /*表名,起始記錄,條目數,排序的方式或空,排序的字段或空,總條目數,總頁碼數*/
        SELECT @totalElements,@pageCount;


本想把這個分頁的存儲過程用到項目中,但是公司項目用的是SpringBoot + JPA,由於EJB3不能調用以OUT參數返回值的存儲過程所以就gg了。如果朋友們有什麼好的解決辦法,可以留言告訴我一下,大家共同學習。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章