剛剛開始學習ibatis,在使用發(fā)現(xiàn)ibatis中一個重要特性會在未來版本取消!
這個就是分頁特性
現(xiàn)在在2.3中已經(jīng)設置SqlMapper.QueryForPaginatedList方法為Deprecated了.
剛開始我發(fā)現(xiàn)這個queryForPaginatedList這個方法,感覺眼前一亮,既然讓自己寫SQL語句,還可以為我們實現(xiàn)分頁,這不錯 ??!HIbernate中雖然可以實現(xiàn)分頁,是因為它知道我們使用的是什么數(shù)據(jù)庫,可以指定不同的分頁策略,但是ibatis中不會分辨數(shù)據(jù)庫。所以很想 了解它的實現(xiàn)方法。
然后發(fā)現(xiàn)這個方法被設置為了Deprecated,還以為提供了更好的方法,一般在程序中會是這樣。
在Google中搜索了一下,在官方網(wǎng)站上看到在未來版本中將要被刪除,甚是不解。
就自己在網(wǎng)上查找了一下,發(fā)現(xiàn)其中的奧秘。
一篇對queryForPaginatedList進行很好的分析的文章,使我茅塞頓開。
http://ivanl.javaeye.com/blog/24739
作者對這個方法的性能進行了分析,并對源代碼進行了分析,這種學習方式值得學習。
發(fā)現(xiàn)其中的問題,ibatis中的分頁并不是基于數(shù)據(jù)庫的分頁,而是一種基于JDBC驅(qū)動的分頁方式,所以其中的效率會跟驅(qū)動的性能有很大關系。和原生的數(shù)據(jù)庫分頁之間有很大的性能差別。
作者還列舉了這個方法的調(diào)用順序:
調(diào)用次序如下SqlMapClientImpl.queryForPaginatedList->SqlMapSessionImpl.queryForPaginatedList
->SqlMapExecutorDelegate.queryForPaginatedList->GeneralStatement.executeQueryForList
->GeneralStatment.executeQueryWithCallback->GeneralStatment.executeQueryWithCallback
->SqlExecutor.executeQuery->SqlExecutor.handleMultipleResults()
我估計ibatis的作者可能感覺這樣一個方法會開發(fā)者對起產(chǎn)生依賴,而忽略其中的系能問題,并經(jīng)常使用,但是這對應用程序并不是很好的一種做法,特別數(shù)據(jù)量較大的系統(tǒng)中。