最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis中的動態(tài)SQL語句解析

 更新時間:2019年11月07日 10:28:11   作者:Demrystv  
這篇文章主要介紹了Mybatis中的動態(tài)SQL語句解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

這篇文章主要介紹了Mybatis中的動態(tài)SQL語句解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

  Mybatis中配置SQL有兩種方式,一種是利用xml 方式進行配置,一種是利用注解進行配置。

  Mybatis使用注解配置SQL,但是由于配置功能受限,而且對于復雜的SQL而言可讀性很差,所以很少使用。

  Mybatis常用xml配置的方式,使用xml的幾個簡單的元素,便能完成動態(tài)SQL的功能,大量的判斷都可以在mybaties的映射xml里面配置,以達到許多需要大量代碼才能實現的功能,大大減少了代碼量,體現了Mybatis的靈活、高度可配置性和維護性。

                  元素                          作用                 備注
if 判斷語句 單條件分支判斷
choose(when,otherwise) 相當于Java中的switch和case語句 多條件分支判斷
trim 輔助元素,用于處理特定的SQL拼裝問題 用于處理SQL拼裝的問題
foreach 循環(huán)語句 在in語句等列表條件常用

if元素

  if元素是最常用的判斷語句,相當于Java中國的 if 語句,它常常與test屬性聯合使用。

<select id="findRole1" parameterType="string" resultMap="roleResultMap">
    select role_no, role_name, note from t_role where 1=1
    <if test="roleName != null and roleName !=''">
      and role_name like concat('%', #{roleName}, '%')
    </if>
  </select>

  當參數roleName傳遞進映射器時,如果參數不為空,則采取構造對 roleName 的模糊查詢,否則就不要去構造這個條件。通過Mybaties的 if 元素節(jié)省了許多拼接SQL的工作,集中在 xml 里面維護。

choose、when、otherwise元素

  如果在判斷時有更多的選擇,不只是兩種選擇,也就是類似switch...case...default...功能的語句。在映射的SQL語句中,使用choose、when、otherwise元素承擔這個功能。

<select id="findRole2" parameterType="role" resultMap="roleResultMap">
    select role_no, role_name, note from t_role
    where 1=1
    <choose>
      <when test="roleNo != null and roleNo !=''">
        AND role_no = #{roleNo}
      </when>
      <when test="roleName != null and roleName !=''">
        AND role_name like concat('%', #{roleName}, '%')
      </when>
      <otherwise>
        AND note is not null
      </otherwise>
    </choose>
  </select>

  上述的場景就是:

  首先,如果角色編號不為空,則只用角色編號作為條件查詢。

  當角色編號為空,而角色名稱不為空,則使用角色名稱作為條件進行模糊查詢。

  當角色編號和角色編號都為空,則要求角色備注不為空。

trim、where、set元素

  在前面的SQL語句中加入了“1=1”,這樣可以實現其功能,但是有一個更好的實現,那就是使用where。當where元素里面的條件成立時,才會加入where這個SQL關鍵字到組裝的SQL里面,否則不會加入。

<select id="findRole3" parameterType="role" resultMap="roleResultMap">
    select role_no, role_name, note from t_role
    <where>
      <if test="roleName != null and roleName !=''">
        and role_name like concat('%', #{roleName}, '%')
      </if>
      <if test="note != null and note !=''">
        and note like concat('%', #{note}, '%')
      </if>
    </where>
  </select>

  有時需要去掉一些特殊的SQL語法,比如常見的and、or等。使用trim元素也可以達到預期效果。其中prefix代表的語句的前綴,prefixOverrides代表的是需要去掉哪種字符串。與前面的where語句是等效的。

<select id="findRole4" parameterType="string" resultMap="roleResultMap">
    select role_no, role_name, note from t_role
    <trim prefix="where" prefixOverrides="and">
      <if test="roleName != null and roleName !=''">
        and role_name like concat('%', #{roleName}, '%')
      </if>
    </trim>
  </select>

  在hibernate中如果因為更新某一個字段而不得已發(fā)送所有的字段給持久化對象,這樣影響了SQL語句的執(zhí)行效率。最佳的方法是把主鍵和更新字段的值傳遞給SQL去更新。set元素就可以實現此功能。set元素遇到逗號,它會自動將對應的逗號去掉。

<update id="updateRole" parameterType="role">
    update t_role
    <set>
      <if test="roleName != null and roleName !=''">
        role_name = #{roleName},
      </if>
      <if test="note != null and note != ''">
        note = #{note}
      </if>
    </set>
    where role_no = #{roleNo}
  </update>

foreach元素

  foreach元素是一個循環(huán)語句,它的作用是遍歷集合,它能很好的支持數組和List、Set接口的集合,對此提供遍歷的功能,它往往用于SQL中的in關鍵字。

<select id="findRoleByNums" resultMap="roleResultMap">
    select role_no, role_name, note from t_role where role_no in
    <foreach item="roleNo" index="index" collection="roleNoList"
      open="(" separator="," close=")">
      #{roleNo}
    </foreach>
  </select>

  collection配置的roleNoList是傳遞進來的參數名稱,它可以是一個數組、List、Set等集合。

  item配置的是循環(huán)中當前的元素。

  index配置的是當前元素在集合的位置下標。

  open和close配置的是以什么符號將這些集合元素包裝起來。

  separator是各個元素的分隔符。

用test的屬性判斷字符串

  test用于條件判斷語句,其作用相當于判斷真假,在大多數場景下,主要用于判斷空和非空的。

  <select id="getRoleTest" parameterType="string" resultMap="roleResultMap">
    select role_no, role_name, note from t_role
    <if test="type == 'Y'.toString()">
      where 1=1
    </if>
  </select>

  如果把 type='Y'傳遞給SQL,就可以實現Mybatis加入了條件 where 1=1,所以對于字符串的判斷,可以加入 toString ()的方法進行比較。

bind元素

  bind元素的作用是通過OGNL表達式去定義一個上下文變量,這樣更方便使用。

  例如在模糊查詢時,如果是MySQL數據庫,常常用到一個concat,它用 % 和 參數相連。然而在Oracle數據庫中則沒有,Oracle數據庫用連接符號是 “||”,這樣SQL就需要兩種形式去實現,用bind元素,就不用使用數據庫語言。

  <select id="findRole5" parameterType="string" resultMap="roleResultMap">
    <bind name="pattern" value="'%' + _parameter + '%'" />
    SELECT role_no, role_name, note FROM t_role
    where role_name like #{pattern}
  </select>

  以上就是我在學習過程中對于Mybatis中的動態(tài)SQL語句的常見知識點總結,希望大家可以一起學習進步!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • MySql數據庫時間序列間隔查詢方式

    MySql數據庫時間序列間隔查詢方式

    這篇文章主要介紹了MySql數據庫時間序列間隔查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • mysql 動態(tài)執(zhí)行存儲過程語句

    mysql 動態(tài)執(zhí)行存儲過程語句

    MSSQL中動態(tài)執(zhí)行sql語句可以使用EXEC()函數。MSSQL中也有類似的函數EXECUTE(),不過不同的是MYSQL中動態(tài)執(zhí)行存儲過程語句與MSSQL還是有區(qū)別的。
    2009-07-07
  • MySQL中大數據表增加字段的實現思路

    MySQL中大數據表增加字段的實現思路

    最近遇到的一個問題,需要在一張將近1000萬數據量的表中添加加一個字段,但是直接添加會導致mysql 奔潰,所以需要利用其他的方法進行添加,這篇文章主要給大家介紹了MySQL中大數據表增加字段的實現思路,需要的朋友可以參考借鑒。
    2017-01-01
  • MySQL 數據類型詳情

    MySQL 數據類型詳情

    這篇文章主要介紹了MySQL 數據類型,數值類型分類又分嚴格數值類型和近似數值數據類型,下面文章圍繞MySQL 數據類型展開內容,需要的朋友可以參考一下
    2021-11-11
  • Mysql數據庫亂碼問題的對應方式

    Mysql數據庫亂碼問題的對應方式

    今天小編就為大家分享一篇關于Mysql數據庫亂碼問題的對應方式,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 一次MySQL慢查詢導致的故障

    一次MySQL慢查詢導致的故障

    這篇文章主要介紹了如何對MySQL慢查詢導致的故障進行處理,慢查詢是我們在mysql中經常需要使用到的一個很方便的功能,慢查詢對于跟蹤有問題的查詢很有用,需要的朋友可以參考下
    2015-08-08
  • MySQL修改表結構操作命令總結

    MySQL修改表結構操作命令總結

    這篇文章主要介紹了MySQL修改表結構操作命令總結,包含如刪除列、添加列、修改列、添加主鍵、刪除主鍵、添加唯一索引、添加普通索引等內容,需要的朋友可以參考下
    2014-12-12
  • MySQL 通過索引優(yōu)化含ORDER BY的語句

    MySQL 通過索引優(yōu)化含ORDER BY的語句

    合理的建立索引能夠加速數據讀取效率,不合理的建立索引反而會拖慢數據庫的響應速度。
    2010-03-03
  • 使用MySQL的yum源安裝MySQL5.7數據庫的方法

    使用MySQL的yum源安裝MySQL5.7數據庫的方法

    這篇文章主要介紹了使用MySQL的yum源安裝MySQL5.7數據庫的方法的相關資料,需要的朋友可以參考下
    2016-08-08
  • MySql,MVCC實現及其機制,快照讀在RC,RR下的區(qū)別說明

    MySql,MVCC實現及其機制,快照讀在RC,RR下的區(qū)別說明

    這篇文章主要介紹了MySql,MVCC實現及其機制,快照讀在RC,RR下的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04

最新評論

漳州市| 山西省| 社会| 阿坝县| 周至县| 光泽县| 浠水县| 屏东市| 通城县| 米泉市| 涡阳县| 呼伦贝尔市| 黄骅市| 福建省| 徐汇区| 林西县| 轮台县| 永城市| 东源县| 榆林市| 平罗县| 和田市| 贡觉县| 泰和县| 临沧市| 睢宁县| 五指山市| 湘阴县| 苍梧县| 乌恰县| 龙海市| 佛冈县| 板桥市| 惠东县| 扶沟县| 拉萨市| 长治县| 兴城市| 萍乡市| 吕梁市| 木兰县|