0、Sybase數據存儲過程分頁

分頁存儲過程SQL:

IF OBJECT_ID ('dbo.QueryPageList') IS NOT NULL
 DROP PROCEDURE dbo.QueryPageList
 GO

 create procedure dbo.QueryPageList
 (
 @sqlStr varchar(8000), --sql語句 select id,name from t1
 @start int,  -- 從那行開始(偏移量)
 @limit int	-- 每頁數量大小
 )
 as
 DECLARE @dt varchar(10)
 BEGIN

 -- rand() 生成隨機數字轉換成字符,從3位開始截取,最後保留10位長度的字符
 SELECT @dt= substring(convert(varchar, rand()), 3, 10)
 
 -- 在select語句中增加行號
 -- 最終效果:select rownum=identity(12),id,name from t1
 SELECT @sqlStr = stuff(@sqlStr, 1, 7, 'select rownum=identity(12), ')
 
 -- charindex() 查詢 FROM 位置做截取
 -- 最終效果:select rownum=identity(12),id,name  into tempdb..Lining1234 from t1
 -- 特別注意:大數量查詢時,一定要給查詢條件!!!因爲,數據量大時,會直接影響到數據 into 插入臨時表中的性能
 SELECT @sqlStr = stuff(@sqlStr, charindex(' FROM ', upper(@sqlStr)), 6 ,' into tempdb..Lining' + @dt + ' from ')
 commit
 execute (@sqlStr)

 -- 根據行號在臨時表裏面取數據
 select @sqlStr = 'select * from tempdb..Lining' + @dt + ' where rownum > '+convert(varchar, @start)+' and rownum <= '+convert(varchar, (@start+@limit))
 execute (@sqlStr)

 -- 刪除臨時表,釋放查詢資源
 SELECT @sqlStr = 'DROP TABLE tempdb..Lining'+@dt
 EXECUTE (@sqlStr)
 END

GO

Java JDBC方式調用:

package com.yandype.test;

import java.math.BigDecimal;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import com.cong.core.jdbc.ConnManager;

public class JdbcRowCountSybase {

	public static void main(String[] args) {  
		   
	 ConnManager connManager = new ConnManager();	
	 Connection con = null;  
	 Statement stmt = null;  
	 ResultSet rs = null;
	
         /**
          * 特別注意:大數量查詢時,一定要給查詢條件!!!
          * 因爲,數據量大時,會直接影響到數據 into 插入臨時表中的性能
          */
	 try {  
	   StringBuffer sb = new StringBuffer("select id,goods_name,goods_price,create_time from tb_test_goods");
       sb.append(" where ").append(" goods_price = ").append(new BigDecimal("1.0000"));
	   con = connManager.getConn(1);
	   CallableStatement prepareCall = con.prepareCall("{call QueryPageList(?,?,?)}");
	   prepareCall.setString(1, sb.toString());
	   prepareCall.setInt(2, 0);
	   prepareCall.setInt(3, 10);
	   rs = prepareCall.executeQuery();
		while(rs.next()){
			System.out.println(rs.getString("id"));
			System.out.println(rs.getString("goods_name"));
			System.out.println(rs.getString("goods_price"));
		}
	 } catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				connManager.closeConn(rs, stmt, con);
			} catch (Exception e) {
				e.printStackTrace();
			}
		} 
	}
}

 

 與 mybatis plus 整合:

插件包提取地址:

鏈接: https://pan.baidu.com/s/1mUx4rdXItOAaIEGs2rf3HQ 提取碼: vkaf

下載插件包,解壓後。直接拷貝到你項目工程即可:

編寫配置類: 

@Configuration
@MapperScan("com.yandype.mapper")
public class MybatisPlusConfig {

    // Sybase分頁插件 (按存儲過程分頁)
    @Bean
    public SybasePaginationInterceptor sybasePaginationInterceptor(){
        return new SybasePaginationInterceptor(new SybaseDialect());
    }
}

 測試:

@Test
    public void testPage(){
        Page<TestGoods> page = new Page<>(1,5);
        QueryWrapper<TestGoods> queryWrapper = new QueryWrapper<>();
        //queryWrapper.eq("goods_price",new BigDecimal("1.0000"));
        //queryWrapper.eq("goods_name","商品_1");
        Page<TestGoods> goodsPage = this.testGoodsMapper.selectPage(page,queryWrapper);
        System.out.println(goodsPage.getTotal());
        List<TestGoods> goodsList = goodsPage.getRecords();
        for (TestGoods mideaTestGoods : goodsList) {
            System.out.println(testGoods);
        }
    }

插件分頁資料參考:

https://gitee.com/zycmgit/mybatis-pagehelp-sybase

 

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