MyBatis對動態SQL的支援
1.MyBatis動態SQL
動態SQL是MyBatis框架中特性之一,在一些組合查詢頁面需要根據
使用者輸入的條件生成不同的查詢SQL語句,在JDBC中需要在程式碼中
拼接sql,容易出錯,MyBatis可以解決這種問題
動態SQL標籤與JSTL相似,它允許在XML中構建不同sql語句,常用
SQL標籤如下:
判斷標籤:if,choose
關鍵字標籤:where,set,trim
迴圈標籤:foreach
if標籤是簡單條件判斷邏輯,滿足指定條件時追加if標籤內sql語句,
不滿足時不追加,使用格式如下:
<select>
sql語句1
<if test="條件表示式">
sql語句2
</if>
</select>
if標籤最常見的使用在where字句部分,根據不同情況追加不同的
sql語句
choose標籤的作用相當於Java的switch語句,基本上跟JSTL中的
choose的作用是一樣的,通常與when和otherwise搭配使用,使
用格式如下:
<select>
sql語句1
<choose>
<when test="條件表示式">
sql語句2
</when>
<when test="條件表示式">
sql語句3
</when>
<otherwise>
sql語句4
</otherwise>
</choose>
</select>
where標籤可以在<where>所在的位置輸出一個where關鍵字,而
且還可以將後面多餘的and或者or關鍵字去除,使用格式如下:
<select>
select * from emp
<where>
<if test="deptno != null">
deptno = #{deptno}
</if>
<if test="salary != null">
and salary = #{salary}
</if>
</where>
</select>
set標籤主要是用在更新操作時,它的主要功能和where標籤相似,
主要是在<set>所在的位置輸出一個set關鍵字,而且還可以去除
內容結尾中無關的逗號,使用格式如下:
<updat>
update emp
<set>
<if test="ename != null">
ename=#{ename},
</if>
<if test="salary != null">
salary=#{salary},
</if>
<if test="hiredate != null">
hiredate=#{hiredate}
</if>
</set>
where empno = #{empno}
</update>
trim標籤主要功能如下:
1)可以在自己包含的內容前加上某些字首,也可以在其後加上某
些字尾,與之對應的屬性是prefix和suffix
2)可以把包含內容首部的某些內容過濾,即忽略,也可以把尾部
的某些內容過濾,對應的屬性是prefixOverrides和suffixOverrides
即trim標籤可以替代where標籤和set標籤
<!-- 等價於where標籤 -->
<trim prefix="where" prefixOverrides="and|or">
......
</trim>
<!-- 等價於set標籤 -->
<trim prefix="set" suffixOverrides=",">
......
</trim>
foreach標籤實現迴圈邏輯,可以進行一個集合的迭代,主要用在
構建IN條件中,使用格式如下:
<select>
select * from emp where empno in
<foreach collection="集合" item="迭代變數"
open="(" close=")" separator=",">
#{迭代變數}
</foreach>
</select>
foreach標籤它允許指定一個集合,宣告集合項和索引變數,變數
可以用在標籤體內,它允許指定開放和關閉的字串,在迭代項之
間放置分隔符
補充:在XML檔案中處理特殊符號
第一種方法:採用XML轉義字元
< <
> >
& &
' '
" "
空格
第二種方法:採用<[!CDATA[]]>進行說明,將此內容不進行解析
<if test="">
and <![CDATA[salary < 50000.0]]>
</if>
2.MyBatis關聯對映
1)主鍵對映
在做插入操作時,可以由資料庫負責主鍵值生成
主鍵欄位部分的對映可以分為兩種情況:
資料庫支援自動遞增:例如MySQL,SQLServer
資料庫不支援自動遞增:例如Oracle
業務:需要返回資料庫自動遞增的主鍵值
MySQL:
<insert id=""
parameterType="com.xms.entity.Dept"
useGeneratedKeys="true" keyProperty="deptno">
insert into dept values(null,#{dname})
</insert>
在<insert>標籤指定自動遞增屬性設定後,MyBatis會在插入
操作後將自動遞增生成的主鍵值給keyProperty指定的屬性賦值
Oracle:
<insert id=""
parameterType="com.xms.entity.Dept">
<selectKey keyProperty="deptno">
select 序列名.nextval from dual
</selectKey>
insert into dept values(序列名.currval,#{dname})
</insert>
在<insert>標籤指定<selectKey>設定後,MyBatis會在插入操
作前先執行<selectKey>獲取主鍵值的sql,然後將主鍵值賦值給
指定的主鍵屬性,最後再執行插入的sql
2)多對一對映
在查詢時需要獲取兩張或兩張以上關聯表的資料,通過關聯對映
可以由一個物件獲取關聯物件的資訊,例如:查詢一個Emp員工
物件,可以通過關聯對映獲取員工所在的部門Dept物件資訊
MyBatis的多對一有以下兩種不同的實現形式:
1.巢狀查詢:通過執行另外一個SQL對映語句來返回關聯資料結
果(查詢兩次)
2.巢狀結果查詢:執行一個表關聯查詢SQL,然後將查詢結果映
射成關聯物件(查詢一次)
3)一對多對映
當查詢某個表的記錄資訊時,如果關聯表有多條相關記錄,此時
就可以通過一對多對映,例如:查詢某個Dept部門物件資訊,
通過一對多對映獲取此部門所有的Emp員工物件資訊
MyBatis的一對多有以下兩種不同的實現形式:
1.巢狀查詢:通過執行另外一個SQL對映語句來返回關聯資料結
果(查詢兩次)
2.巢狀結果查詢:執行一個表關聯查詢SQL,然後將查詢結果映
射成關聯物件(查詢一次)
相關文章
- MyBatis框架之SQL對映和動態SQLMyBatis框架SQL
- MyBatis 動態 SQLMyBatisSQL
- mybatis動態SQLMyBatisSQL
- 1 Mybatis動態SQLMyBatisSQL
- Mybatis--動態SQLMyBatisSQL
- MyBatis(七) 動態SQLMyBatisSQL
- MyBatis基礎:MyBatis動態SQL(3)MyBatisSQL
- mybatis動態sql總結MyBatisSQL
- Mybatis-06 動態SqlMyBatisSQL
- Mybatis 動態 SQL 詳解MyBatisSQL
- MyBatis4:動態SQLMyBatisSQL
- Mybatis介紹之 動態SQLMyBatisSQL
- Java-Mybatis動態SQL整理JavaMyBatisSQL
- mybatis動態sql與分頁MyBatisSQL
- Mybatis 動態執行SQL語句MyBatisSQL
- Mybatis深入瞭解(五)----動態SQLMyBatisSQL
- Mybatis 裡對映檔案的動態 SQL 語句,實現if,where,foreache的SQL語句動態拼接查詢MyBatisSQL
- 【MyBatis學習總結 (五),動態SQL】MyBatisSQL
- Mybatis where 1=1 動態sql問題MyBatisSQL
- Mybatis學習筆記(6)-動態SQLMyBatis筆記SQL
- mybatis入門基礎(五)----動態SQLMyBatisSQL
- MyBatis標籤實現的動態SQL語句MyBatisSQL
- MyBatis系列(七):MyBatis動態Sql之choose,where,set標籤的用法MyBatisSQL
- MyBatis從入門到精通(六):MyBatis動態Sql之if標籤的用法MyBatisSQL
- MyBatis學習 之 三、動態SQL語句MyBatisSQL
- Mybatis(一)Porxy動態代理和sql解析替換MyBatisSQL
- MyBatis 動態 SQL 最全教程,這樣寫 SQL 太優雅了!MyBatisSQL
- MyBatis從入門到精通(八):MyBatis動態Sql之foreach標籤的用法MyBatisSQL
- 好程式設計師Java分享Mybatis必會的動態SQL程式設計師JavaMyBatisSQL
- mybatis條件判斷及動態sql的簡單擴充MyBatisSQL
- MyBatis引數傳入集合之foreach動態sqlMyBatisSQL
- MyBatis從入門到精通(七):MyBatis動態Sql之choose,where,set標籤的用法MyBatisSQL
- MyBatis3:SQL對映MyBatisS3SQL
- Oracle動態SQL引數支援複雜型別OracleSQL型別
- MyBatis-動態SQL的if、choose、when、otherwise、trim、where、set、foreach使用MyBatisSQL
- Mybatis動態對映,這次終於搞明白了MyBatis
- 好程式設計師分享MyBatis之動態SQL語句程式設計師MyBatisSQL
- MyBatis進階--介面代理方式實現Dao 和動態SQLMyBatisSQL