Mybatis實現數據上移、下移、置頂與置底

介紹

在一些管理系統中,常常有一些需求須要對產生的列表數據進行上移、下移、置頂與置底操做,此時須要必定的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&lt;':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&gt;'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&gt;'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&gt;':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&gt;':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中對大於小於的處理上文中有用到。

Mybatis中大於小於的處理

此處有兩種處理方式,第一種處理方式:

原符號 < <= > >= & ' "
替換符號 &lt; &lt;= &gt; &gt;= &amp; &apos; &quot;

例如:sql以下: publish_time >= #{startTime} and publish_time <= #{endTime}

第二種處理方式:

大於等於
<![CDATA[ >= ]]>
小於等於
<![CDATA[ <= ]]>

例如:sql以下: create_date_time <![CDATA[ >= ]]> #{startTime} and create_date_time <![CDATA[ <= ]]> #{endTime}

此一細節在使用Mybatis時須要注意。

相關文章
相關標籤/搜索