對於小數據量,我們的分頁可以通過ibatis來完成,但是對於萬級以上的數據來說,這就是個不現實的事情了。
首先,ibatis的分頁是通過一次性將數據提取到內存中,再根據需要篩選數據。所以,對於百萬、千萬級的數據量這是一個相當不靠譜的事情,所以網上關於ibatis分頁的討論也相當的少,這也算是大家一個共識吧。
其次,對於不同的數據庫它們都有自己的讀取行信息的方法,例如:mysql可以通過limit n to m 來完成。oracle 可以通過 rownum > n and rownnum < m來完成等等。而對於sybase來說,它只有一個top可以控制行信息,但是當我們需要讀取中間數據的時候,這個top就顯得力不從心了,那麼我們如何來實現分頁呢??答案是:臨時表。這也算是sybase特有的吧!!
書說簡短,我們通過配置文件來說明!!
<!-- 導出積分對賬數據-分頁獲取 -->
<procedure id="exportReconData" resultMap="IntegralItemResult" parameterClass="java.util.Map">
<![CDATA[
DECLARE @start int, @limit int
set @start= #start#
set @limit= #count#
if @start <=0
set @start=1
if @start = 1
begin
select top $count$ * from
]]>
<dynamic>
<include refid="fromIntegralItem" />
</dynamic>
order by usertime sac
<![CDATA[
end
else
begin
DECLARE @maxrow int
set @maxrow = @start+@limit -1
set rowcount @maxrow
select rownum=identity(12),* into tempdb..$table_tmp$ from
]]>
<dynamic>
para_map.put("table_tmp", "integral_temp_" + now_time);
<include refid="fromIntegralItem" />
</dynamic>
order by usertime asc
<![CDATA[
set rowcount 0
select * from tempdb..$table_tmp$ where rownum >= @start
DROP TABLE tempdb..$table_tmp$
end
]]>
</procedure>