在一些管理系统中,常常有一些需求须要对产生的列表数据进行上移、下移、置顶与置底操做,此时须要必定的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时须要注意。