国产色诱美女免费视频|欧美精彩狠狠色丁香婷婷|91黑人|日本黄色小视频|欧美一级黄色视频在这里免费观看

IT培訓-高端面授IT培訓機構
云和教育:云和數據集團高端IT職業教育品牌
  • 國家級
    全民數字素養與技能培訓基地
  • 河南省
    第一批產教融合型企業建設培育單位
  • 鄭州市
    數字技能人才(碼農)培養評價聯盟

云和數據大咖分享:Mybatis動態SQL

  • 發布時間:
    2020-09-05
  • 版權所有:
    云和教育
  • 分享:
MyBatis 令人喜歡的一大特性就是動態 SQL。在使用 JDBC 的過程中, 根據條件進行 SQL 的拼接是很麻煩且很容易出錯的。
MyBatis 動態 SQL 的出現, 解決了這個麻煩。
動態SQl是MyBatis的強大特性之一,可以完成對SQL語句的動態組裝。
比如說傳入一個User對象,要根據這個User中的數據查詢用戶的完整信息:
如果User對象中只有name屬性有值,sql語句是:select * from user_tb ?where name=#{name}

如果User對象中只有tel屬性有值,sql語句是:select * from user_tb where tel=#{tel}

如果User對象的name、tel都有值,sql語句是:select * from user_tb where name=#{name} and tel=#{tel}

有時候sql語句不是一成不變的,要根據傳入的數據動態生成要執行的sql語句,動態sql就適合這種情況。
最好將日志的控制臺輸出級別設置為DEBUG,這樣在控臺能看到SQL語句。
1.MyBatis中的動態sql元素

<if>? 相當于java中的if,用于單分支的條件判斷

<choose>、<when>、<otherwise>? 相當于java中的switch…case…default,用于多分支的條件判斷,從多個選項中選擇一個

<foreach> 循環,常和sql的in語句搭配使用

<where>、<trim>、<set>? 輔助元素,用于一些處理sql拼裝、特殊字符的問題

2.<where>、<if>的使用

xml

<select id=”queryUser” parameterType=”user” resultType=”user”>

SELECT * FROM user_tb

<where>

<if test=”name!=null and name!=””>

name=#{name}

</if>

<if test=”tel!=null and tel!=””>

AND tel=#{tel}

</if>

</where>

</select>

<where>相當于sql語句中的關鍵字WHERE。

<if>中的test表示條件,條件成立就把元素體中的字符串拼接到sql語句中,否則不拼接。

> test屬性的注意點

> 相等判斷:==,!=

> 邏輯與:只能用and,不能用&&

> 邏輯或:or、||均可

tel不進行數學運算,使用字符串類型。

<where>中有<if>成立時,<where>才會在sql語句中添加WHERE關鍵字,否則不添加。

<where>會自動剔除元素體中多余的AND、OR。

比如傳入的User對象只設置了tel,拼接的sql語句是:SELECT ?*? FROM ?user_tb ?WHERE ?AND ?tel=#{tel},<where>會自動剔除多余的AND。

不使用<where>的寫法:

xml

<select id=”queryUser” parameterType=”user” resultType=”user”>

SELECT * FROM user_tb? WHERE 1=1

<if test=”name!=null and name!=””>

AND name=#{name}

</if>

<if test=”tel!=null and tel!=””>

AND tel=#{tel}

</if>

</select>

<where>會自動去掉多余的AND,但不會自動加上缺少的AND,我們通常在每個<if>中都加上AND,防止把AND寫掉了。

3.<trim>的使用

<trim>可以定制需要的功能,比如使用<trim>達到<where>的效果:

xml

<select id=”queryUser” parameterType=”user” resultType=”user”>

SELECT * FROM user_tb

<trim prefix=”WHERE” prefixOverrides=”AND”>

<if test=”name!=null and name!=””>

name=#{name}

</if>

<if test=”tel!=null and tel!=””>

AND tel=#{tel}

</if>

</trim>

</select>

prefix會在這段字符串之前加上指定的前綴,如果里面的<if>都不滿足條件,則不加前綴。

prefixOverrides指定要去除的多余的字符串。

4.<choose>、<when>、<otherwise>的使用

有時候我們只需要從多個選項中選擇一個,比如登錄教務系統,讓你選擇角色:數據庫管理員、教職工、學生:

xml

<select id=”queryPwd” parameterType=”user” resultType=”string”>

SELECT password FROM user_tb WHERE name=#{name}

<choose>

<when test=”role==’admin'”>

AND role=’admin’

</when>

<when test=”role==’teacher'”>

AND role=’teacher’

</when>

<when test=”role==’student'”>

AND role=’student’

</when>

</choose>

</select>

傳入的值是admin、teacher、student,數據庫中的role字段也是這幾個值,這種傳入的值和數據庫中存儲的值一致的可以直接這樣寫:

xml

<select id=”queryPwd” parameterType=”user” resultType=”string”>

SELECT password FROM user_tb WHERE name=#{name} AND role=#{role}

</select>

如果不一致,比如性別,傳入的是male、female,數據庫中存儲的是0、1,就需要使用<choose>轉換一下。

xml

<choose>

<when test=””>

</when>

<when test=””>

</when>

<otherwise>

</otherwise>

</choose>

<choose>相當于switch,<when>相當于case,<otherwise>相當于default。

5.<set>的使用

更新操作傳入一個pojo類的對象,但我們并不知道哪些屬性是有值的(需要更新的),不能更新全部字段,因為有的字段沒有手動賦值,不能用JVM賦的null、0去覆蓋數據表中原來的值。

<set>可解決此問題:

xml

<select id=”updateUser” parameterType=”user”>

UPDATE user_tb

<set>

<if test=”name!=null and name!=””>

name=#{name},

</if>

<if test=”tel!=null and tel!=””>

tel=#{tel},

</if>

<if test=”address!=null and address!=””>

name=#{name},

</if>

</set>

where id=#{id}

</select>

<set>用于傳入pojo類型,更新數據表的多個字段。先判斷字段是否有值,有值才更新該字段。

<set>用于更新操作,會自動在這段字符串前面加sql關鍵字“SET”(里面有<if>為真),并自動去除多余的逗號(一般自己寫第一個<if>,然后copy下來改,最后面往往會多一個逗號)。

如果里面的<if>都為假,即沒有要更新的字段,不會自動在前面加”SET”,此時這個update語句有語法錯誤,會報錯,所以要保證至少有一個字段需要更新。

6.<foreach>的使用

<foreach>用于迭代集合、數組,常配合sql的關鍵字in使用,用于增刪查改的批量操作。

示例:按照手機號隨機抽取3位幸運觀眾(根據手機號碼查詢用戶信息)——批量查。

xml

<select id=”queryUser” parameterType=”list” resultType=”user”>

SELECT * FROM user_tb WHERE tel IN

<foreach collection=”list” index=”index” item=”item” open=”(” separator=”,” close=”)”>

#{item}

</foreach>

</select>

java

ArrayList<String> telList = new ArrayList<>();

telList.add(“110”);

telList.add(“119”);

telList.add(“120”);

UserMapper mapper = sqlSession.getMapper(UserMapper.class);

List<User> userList = mapper.queryUser(telList);

System.out.println(userList);

?collection ??要迭代的數據類型,數組=>array,List=>list,Map=>Map的key的數據類型。使用數組容易出錯,盡量用List代替數組。

index? ?本次迭代的下標,指定一個臨時變量表示下標

item? ?本次迭代的元素,指定一個臨時變量表示本次迭代的元素

open? ?拼接這段字符串時以什么開頭

close? 拼接這段字符串以什么結尾

separator? ?迭代的元素之間用什么連接(分隔)

collection是必需的,其余均可選。

更嚴謹的寫法:

xml

<select id=”queryUser” parameterType=”list” resultType=”user”>

SELECT * FROM user_tb WHERE tel IN

<if test=”list!=null and list.size>0″>

<foreach collection=”list” index=”index” item=”item” open=”(” separator=”,” close=”)”>

#{item}

</foreach>

</if>

</select>

如果傳入的是List類型,要使用List對象本身時,約定使用list表示List對象本身。

文/云和數據高級JAVA開發工程師