分頁存儲過程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