在一些管理系統中,常常有一些需求須要對產生的列表數據進行上移、下移、置頂與置底操做,此時須要必定的SQL功底,下面介紹一下在Mybatis技術下的使用。mysql
首先設計的表須要有一些要求,此處以一個菜單樹爲例進行說明。sql
表名MENU_TREE,數據庫採用MYSQL5.7,建表語句以下:數據庫
CREATE TABLE MENU_TREE ( SID VARCHAR(20), CODE VARCHAR(20), NAME VARCHAR(50), GRADE CHAR(1), PRENT_ID VARCHAR(20), ORDER_VAL NUMERIC(22,0), STATE CHAR(1), DEL_TAG VARCHAR(1) DEFAULT '0', CRT_OPT VARCHAR(20), CRT_TIME TIMESTAMP, UPD_OPT VARCHAR(20), UPD_TIME TIMESTAMP ) ;
能夠任意插入數據,本例插入數據後排序以下:設計
要求將「人力資源部」放到「會員部」以前,此時須要上移「人力資源部」。3d
SQL實現code
update MENU_TREE st set st.ORDER_VAL= 4 where st.ORDER_VAL= 3 AND prent_id='0'; update MENU_TREE st set st.ORDER_VAL= 3 where st.SID='4';
在Oracle數據庫中須要增長BEGIN...END語句。對象
Mybatis的XML文件blog
<update> update MENU_TREE st set st.ORDER_VAL=':orderVal' where st.ORDER_VAL=':orderVal'-1 AND prent_id=':prentId'; update MENU_TREE st set st.ORDER_VAL=':orderVal'-1 where st.SID=':sid'; </update>
Oracle時須要增長BEGIN...END語句(後文再也不贅述)。此處 :參數,代表是外部傳入的參數,這些參數是當前操做對象(「人力資源部」)的相應值(後文再也不贅述)。排序
上移後結果資源
能夠看到「人力資源部」移到了「會員部」前面。
這是跟數據上移相反的操做,咱們將「會員部」下移,實現以下:
SQL實現
update MENU_TREE st set st.ORDER_VAL=4 where st.ORDER_VAL=5 AND st.prent_id='0'; update MENU_TREE st set st.ORDER_VAL=5 where st.SID='3';
Mybatis的XML文件
<update> update MENU_TREE st set st.ORDER_VAL=':orderVal' where st.ORDER_VAL=':orderVal'+1 AND st.prent_id=':prentId'; update MENU_TREE st set st.ORDER_VAL=':orderVal'+1 where st.SID=':sid'; </update>
下移後結果
將「戰略發展部」置頂,實現以下:
SQL實現
update MENU_TREE st set st.ORDER_VAL=st.ORDER_VAL+1 where st.ORDER_VAL<6 AND st.prent_id='0'; update MENU_TREE st set st.ORDER_VAL='1' where st.SID='6';
Mybatis的XML文件
<update> update MENU_TREE st set st.ORDER_VAL=st.ORDER_VAL+1 where st.ORDER_VAL<':orderVal' AND st.prent_id=':prentId'; update MENU_TREE st set st.ORDER_VAL='1' where st.SID=':sid'; </update>
置頂後效果
將「總裁辦」置底,實現以下:
SQL實現
這是MySQL環境下的實現
update MENU_TREE st set st.ORDER_VAL=st.ORDER_VAL-1 where st.ORDER_VAL>'3' AND st.prent_id='0'; update MENU_TREE st INNER JOIN (select max(ORDER_VAL)+1 max from MENU_TREE WHERE prent_id='0') pt SET st.ORDER_VAL=pt.max where st.SID='2';
mysql中update直接使用select的結果的處理方式須要注意。
Oracle或SqlServer下實現:
update MENU_TREE st set st.ORDER_VAL=st.ORDER_VAL-1 where st.ORDER_VAL>'3' AND st.prent_id='0'; update MENU_TREE st set st.ORDER_VAL=(select max(ORDER_VAL)+1 from MENU_TREE WHERE prent_id='0' ) where st.SID='2';
Mybatis的XML文件
這是MySQL環境下的實現
<update> update MENU_TREE st set st.ORDER_VAL=st.ORDER_VAL-1 where st.ORDER_VAL>':orderVal' AND st.prent_id=':prentId'; update MENU_TREE st INNER JOIN (select max(ORDER_VAL)+1 max from MENU_TREE WHERE prent_id=':prentId') pt SET st.ORDER_VAL=pt.max where st.SID=':sid'; </update>
Oracle下實現:
<update> begin update MENU_TREE st set st.ORDER_VAL=st.ORDER_VAL-1 where st.ORDER_VAL>':orderVal' AND st.prent_id=':prentId'; update MENU_TREE st set st.ORDER_VAL=(select max(ORDER_VAL)+1 from MENU_TREE WHERE prent_id=':prentId' ) where st.SID=':sid'; end; <update>
置底後效果
以上就是對上移、下移、置頂和置底的實現。下面來講一下Mybatis中對大於小於的處理上文中有用到。
此處有兩種處理方式,第一種處理方式:
原符號 < <= > >= & ' " 替換符號 < <= > >= & ' "
例如:sql以下: publish_time >= #{startTime} and publish_time <= #{endTime}
第二種處理方式:
大於等於 <![CDATA[ >= ]]> 小於等於 <![CDATA[ <= ]]>
例如:sql以下: create_date_time <![CDATA[ >= ]]> #{startTime} and create_date_time <![CDATA[ <= ]]> #{endTime}
此一細節在使用Mybatis時須要注意。