Mybatis全部標籤


Mybatis全部標籤

一、定義SQL語句

(1)select 標籤的使用  

屬性介紹:     

id :唯一的標識符.     

parameterType:傳給此語句的參數的全路徑名或別名 例:com.test.poso.User或user    resultType :語句返回值類型或別名。

注意,如果是集合,那麼這裡填寫的是集合的泛型,而不是集合本身(resultType 與resultMap 不能並用)   

例子:     

sql:      

<select>        select * from user where name =#{name}      /<select>


(2)insert 標籤的使用    

屬性介紹:      

id :唯一的標識符      

parameterType:傳給此語句的參數的全路徑名或別名 例:com.test.poso.User(3)delete 標籤的使用    

例:

<delete>       /<delete>

delete from user       

where id = #{id}     

(4)update 標籤的使用    

類似於insert

二、配置對象屬性與查詢結果集

(1)resultMap 標籤的使用

基本作用:建立SQL查詢結果字段與實體屬性的映射關係信息

查詢的結果集轉換為java對象,方便進一步操作

將結果集中的列與java對象中的屬性對應起來並將值填充進去

!注意:與java對象對應的列不是數據庫中表的列名,而是查詢後結果集的列名

例:<resultmap>

<result>

<result>

<select>

SELECT ID, Name, Age

FROM TStudent

標籤說明:

主標籤id:該resultMap的標誌type:返回值的類名,此例中返回EStudnet類子標籤:id:用於設置主鍵字段與領域模型屬性的映射關係,此處主鍵為ID,對應id。

result:用於設置普通字段與領域模型屬性的映射關係

三、動態拼接SQL

(1)if 標籤的使用

if標籤通常用於WHERE語句中,通過判斷參數值來決定是否使用某個查詢條件, 他也經常用於UPDATE語句中判斷是否更新某一個字段,還可以在INSERT語句中用來判斷是否插入某個字段的值

例:

<code><select>     
SELECT * from STUDENT_TBL ST
WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')
/<select> /<code>

但是此時如果studentName是null或空字符串,此語句很可能報錯或查詢結果為空。此時我們使用if動態sql語句先進行判斷,如果值為null或等於空字符串,我們就不進行此條件的判斷。

修改為:

<code><select>     
SELECT * from STUDENT_TBL ST


WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')

/<select>
/<code>

(2)foreach 標籤的使用

foreach標籤主要用於構建in條件,他可以在sql中對集合進行迭代。如下:

<delete>

delete from user where id in

<foreach>

#{id}

我們假如說參數為---- int[] ids = {1,2,3,4,5} ----那麼打印之後的SQL如下:

delete form user where id in (1,2,3,4,5)

釋義:

collection :collection屬性的值有三個分別是list、array、map三種,分別對應的參數類型為:List、數組、map集合,我在上面傳的參數為數組,所以值為array

item : 表示在迭代過程中每一個元素的別名

index :表示在迭代過程中每次迭代到的位置(下標)

open :前綴

close :後綴

separator :分隔符,表示迭代時每個元素之間以什麼分隔

我們通常可以將之用到批量刪除、添加等操作中。

(3)choose

標籤的使用

有時候我們並不想應用所有的條件,而只是想從多個選項中選擇一個。MyBatis提供了choose 元素,按順序判斷when中的條件出否成立,如果有一個成立,則choose結束。當choose中所有when的條件都不滿則時,則執行 otherwise中的sql。類似於Java 的switch 語句,choose為switch,when為case,otherwise則為default。

if是與(and)的關係,而choose是或(or)的關係。

例如下面例子,同樣把所有可以限制的條件都寫上,方面使用。選擇條件順序,when標籤的從上到下的書寫順序:

<code><select>     
SELECT * from STUDENT_TBL ST
<where>
<choose>
<when>
ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')
/<when>
<when>
AND ST.STUDENT_SEX = #{studentSex}
/<when>
<when>
AND ST.STUDENT_BIRTHDAY = #{studentBirthday}
/<when>

<when>
AND ST.CLASS_ID = #{classEntity.classID}
/<when>
<otherwise>

/<otherwise>
/<choose>
/<where>
/<select>

/<code>

四、格式化輸出

(1)where當if標籤較多時,這樣的組合可能會導致錯誤。例如,like姓名,等於指定性別等:

Xml代碼

<code>     
<select>
SELECT * from STUDENT_TBL ST
WHERE

ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')


AND ST.STUDENT_SEX = #{studentSex}

/<select>
/<code>

如果上面例子,參數studentName為null或’’,則或導致此sql組合成“WHERE AND”之類的關鍵字多餘的錯誤SQL。

這時我們可以使用where動態語句來解決。這個“where”標籤會知道如果它包含的標籤中有返回值的話,它就插入一個‘where’。此外,如果標籤返回的內容是以AND 或OR 開頭的,則它會剔除掉。

上面例子修改為:

Xml代碼

<code>     
<select>
SELECT * from STUDENT_TBL ST
<where>

ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')


AND ST.STUDENT_SEX = #{studentSex}

/<where>
/<select>
/<code>

(2)set當在update語句中使用if標籤時,如果前面的if沒有執行,則或導致逗號多餘錯誤。使用set標籤可以將動態的配置SET 關鍵字,和剔除追加到條件末尾的任何不相關的逗號。 沒有使用if標籤時,如果有一個參數為null,都會導致錯誤,如下示例:

Xml代碼

<code>     
<update>
UPDATE STUDENT_TBL
SET STUDENT_TBL.STUDENT_NAME = #{studentName},
STUDENT_TBL.STUDENT_SEX = #{studentSex},
STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},
STUDENT_TBL.CLASS_ID = #{classEntity.classID}
WHERE STUDENT_TBL.STUDENT_ID = #{studentID};
/<update>
/<code>

使用set+if標籤修改後,如果某項為null則不進行更新,而是保持數據庫原值。如下示例:

Xml代碼

<code>     
<update>
UPDATE STUDENT_TBL


STUDENT_TBL.STUDENT_NAME = #{studentName},


STUDENT_TBL.STUDENT_SEX = #{studentSex},


STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},


STUDENT_TBL.CLASS_ID = #{classEntity.classID}


WHERE STUDENT_TBL.STUDENT_ID = #{studentID};
/<update>

/<code>

(3)trim

trim是更靈活的去處多餘關鍵字的標籤,他可以實踐where和set的效果。

where例子的等效trim語句:

<code>     
<select>
SELECT * from STUDENT_TBL ST
<trim>

ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')


AND ST.STUDENT_SEX = #{studentSex}

/<trim>
/<select>
/<code>

set例子的等效trim語句:

Xml代碼

<code>     
<update>
UPDATE STUDENT_TBL
<trim>

STUDENT_TBL.STUDENT_NAME = #{studentName},


STUDENT_TBL.STUDENT_SEX = #{studentSex},


STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},


STUDENT_TBL.CLASS_ID = #{classEntity.classID}

/<trim>
WHERE STUDENT_TBL.STUDENT_ID = #{studentID};
/<update>

/<code>

五、配置關聯關係

(1)collection

一對一association通常用來映射一對一的關係,例如,有個類user,對應的實體類如下:(getter,setter方法省略)

<code>private String id;//主鍵
private String userName;//用戶姓名/<code>

有個類Article,對應的實體類如下:

<code>private String id;//主鍵
private String articleTitle;//文章標題
private String articleContent;//文章內容
/<code>

如果我想查詢一個用戶的時候,也查到他寫的一篇文章,可以怎樣寫呢?在類user加入一個屬性article

<code> private String id;//主鍵
private String userName;//用戶姓名
private Article article;//新增的文章屬性/<code>

2、mapper.xml 我在user類的mapper.xml這樣配置

<code><resultmap>

<result>
//這裡把user的id傳過去
<association> select="test.mybatis.dao.articleMapper.selectArticleByUserId" />//test.mybatis.dao.articleMapper為命名空間
/<association>/<resultmap>
/<code>

同時,我的article對應的xml這樣寫:

<code>1 <resultmap>
2
3 <result>
4 <result>
5 /<resultmap>
(當然,這裡還有查詢user表的語句,省略)
/<code>

同時,在article對應的xml有這樣的select語句:

<code><select>parameterType="java.lang.String"
resultMap="ArticleResultMap" >
select * from
tb_article where userId=#{userId} /<select>
/<code>

(2)association一對多實體類增加對應屬性

<code> private String id;//主鍵
private String userName;//用戶姓名

private List<article> articleList;/<article>/<code>

userMapper.xml這樣配置

<code><resultmap>

<result>
//這裡把user的id傳過去
<collection> select="test.mybatis.dao.articleMapper.selectArticleListByUserId" />
/<collection>/<resultmap>
以下省略,類同,Mybatis會把結果封裝成List類型。
/<code>

三、如果我還想通過Article表另一張表,比如文章中有個fk_id,也可以像上面這樣重複配置,把fk_id當做與另一張表關聯的參數,那時就可以通過用戶查到文章,查到文章關聯的另一張表了。

六、SQL標籤

更多用於寫sql語句的一部分,寫在配置文件中的常量

七、include標籤

用於引用常量

JAVA進階架構程序員福利:我這裡還總結整理了比較全面的JAVA相關的面試資料,都已經整理成了

PDF版,這些都可以分享給大家,關注私信我:【806】,免費領取!


分享到:


相關文章: