成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

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

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

為汶上等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及汶上網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站設(shè)計制作、成都網(wǎng)站制作、汶上網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

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

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

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

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

if元素

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

<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>

當參數(shù)roleName傳遞進映射器時,如果參數(shù)不為空,則采取構(gòu)造對 roleName 的模糊查詢,否則就不要去構(gòu)造這個條件。通過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”,這樣可以實現(xiàn)其功能,但是有一個更好的實現(xiàn),那就是使用where。當where元素里面的條件成立時,才會加入where這個SQL關(guān)鍵字到組裝的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元素也可以達到預(yù)期效果。其中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元素就可以實現(xiàn)此功能。set元素遇到逗號,它會自動將對應(yīng)的逗號去掉。

<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)語句,它的作用是遍歷集合,它能很好的支持數(shù)組和List、Set接口的集合,對此提供遍歷的功能,它往往用于SQL中的in關(guān)鍵字。

<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是傳遞進來的參數(shù)名稱,它可以是一個數(shù)組、List、Set等集合。

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

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

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

separator是各個元素的分隔符。

用test的屬性判斷字符串

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

  <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,就可以實現(xiàn)Mybatis加入了條件 where 1=1,所以對于字符串的判斷,可以加入 toString ()的方法進行比較。

bind元素

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

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

  <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>

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

新聞名稱:Mybatis中的動態(tài)SQL語句解析
文章出自:http://jinyejixie.com/article4/iiedie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、微信公眾號、移動網(wǎng)站建設(shè)、App設(shè)計、做網(wǎng)站、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
南昌市| 大洼县| 柳河县| 宜良县| 额敏县| 孟津县| 辽阳市| 成都市| 大化| 宁安市| 山东省| 虞城县| 罗定市| 恩平市| 宁陕县| 岗巴县| 山东省| 龙江县| 阿拉尔市| 山东省| 车险| 张掖市| 正阳县| 内黄县| 星座| 炎陵县| 广平县| 金川县| 新沂市| 屏山县| 甘南县| 西平县| 高碑店市| 陆河县| 雷山县| 凤山市| 奈曼旗| 莲花县| 松溪县| 余江县| 沂水县|