最近在看iBatis時,想做用動態Sql做個分布。因為在做項目時用iBator工具產生沒有分頁的功能,只有一些我們常用的功能。所以要對產生後的代碼做修改。我在Java高手真經的一書中看到有做了MySql SqlServer Oracle的分頁。實現如下:
MySql-->
首先說說MySql的分頁語句 Sql代碼 select * from user where...order by... limit 10,25
根據以上的語句我們可以對ibator產生後的代碼進行修改。
第一修改User_sqlMap.xml
修改前 Xml代碼
<select id="ibatorgenerated_selectByExample" resultMap="ibatorgenerated_BaseResultMap" parameterClass="com.demo.ibatis.beans.UserExample"
> select ID, LOGIN_NAME, PASSWORD from user
<isParameterPresent> <include refid="user.ibatorgenerated_Example_Where_Clause"
/> <isNotNull property="orderByClause"
> order by $orderByClause$
</isNotNull> </isParameterPresent> </select>
修改後 Xml代碼 <select id="ibatorgenerated_selectByExample" resultMap="ibatorgenerated_BaseResultMap" parameterClass="com.demo.ibatis.beans.UserExample"> select ID, LOGIN_NAME, PASSWORD from user <isParameterPresent> <include refid="user.ibatorgenerated_Example_Where_Clause" /> <isNotNull property="orderByClause"> order by $orderByClause$ </isNotNull> [b]<isNotNull property="limitClauseStart"> limit $limitClauseStart$,$limitClauseCount$ </isNotNull>[/b] </isParameterPresent> </select>
重要的是黑色的字型是添加到原來的xml中的。接下來修改UserExample.java
在該類中添加兩個欄位和相應的getter/setter方法 Java代碼 protected String limitClauseStart;//起始參數 protected String limitClauseCount;//數量參數
接下來就可以通過Dao調用selectByExample()方法測試,好的以上就是MySql的分頁。SqlServer的分頁比較難了,因為 SqlServer中沒有limit的關鍵字。
看看SqlServer的分頁語句,那當然 SqlServer人分布方法有很多種。這裡我採用其中的一種。
語句如下: Sql代碼 SELECT TOP 頁大小 * FROM TestTable WHERE (ID NOT IN (SELECT TOP 頁大小*頁數 id FROM 表 ORDER BY id)) ORDER BY ID
接下來和上面的MySql一樣也進行修改
修改xml Xml代碼 <select id="ibatorgenerated_selectByExample" resultMap="ibatorgenerated_BaseResultMap" parameterClass="com.demo.ibatis.beans.UserExample"> [b] <isNotNull property="limitClauseStart"> SELETE TOP $limitClauseCount$ * FROM user where (ID NOT IN (SELECT TOP $limitClauseStart$ ID </isNotNull>[/b] <isNull property="limitClauseStart"> SELETE * </isNull> FROM user from user <isParameterPresent> <include refid="user.ibatorgenerated_Example_Where_Clause" /> <isNotNull property="orderByClause"> order by $orderByClause$ [b] <isNotNull property="limitClauseStart"> ))order by $orderByClause$ </isNotNull>[/b] </isNotNull> </isParameterPresent> </select>
接下來是ORacle的,和上面都是差不多的這裡不多說。
文法:
select* from(select rownum tid,user.* FROM (select * from user where id>1 order by ID desc)user where where rownum<35) where tid>10;
修改Xml, Xml代碼
<select id="ibatorgenerated_selectByExample" resultMap="ibatorgenerated_BaseResultMap" parameterClass="com.demo.ibatis.beans.UserExample"
> [b]
<isNotNull property="limitClauseStart"
> select* from(select rownum tid,user.* FROM (
</isNotNull>[/b] select * from user
<isParameterPresent> <include refid="user.ibatorgenerated_Example_Where_Clause"
/> <isNotNull property="orderByClause"
> order by $orderByClause$
</isNotNull> [b]
<isNotNull property="limitClauseStart"
> <![[CDATA )user where where rownum<$limitClauseCount$+$limitClauseStart$+1) where tid>$limitClauseStart$;]]>
</isNotNull>[/b]
</isParameterPresent> </select>