欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mybatis中的動(dòng)態(tài)SQL語(yǔ)句解析

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

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

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

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

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

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

if元素

  if元素是最常用的判斷語(yǔ)句,相當(dāng)于Java中國(guó)的 if 語(yǔ)句,它常常與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>

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

choose、when、otherwise元素

  如果在判斷時(shí)有更多的選擇,不只是兩種選擇,也就是類(lèi)似switch...case...default...功能的語(yǔ)句。在映射的SQL語(yǔ)句中,使用choose、when、otherwise元素承擔(dān)這個(gè)功能。

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

  上述的場(chǎng)景就是:

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

  當(dāng)角色編號(hào)為空,而角色名稱不為空,則使用角色名稱作為條件進(jìn)行模糊查詢。

  當(dāng)角色編號(hào)和角色編號(hào)都為空,則要求角色備注不為空。

trim、where、set元素

  在前面的SQL語(yǔ)句中加入了“1=1”,這樣可以實(shí)現(xiàn)其功能,但是有一個(gè)更好的實(shí)現(xiàn),那就是使用where。當(dāng)where元素里面的條件成立時(shí),才會(huì)加入where這個(gè)SQL關(guān)鍵字到組裝的SQL里面,否則不會(huì)加入。

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

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

<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中如果因?yàn)楦履骋粋€(gè)字段而不得已發(fā)送所有的字段給持久化對(duì)象,這樣影響了SQL語(yǔ)句的執(zhí)行效率。最佳的方法是把主鍵和更新字段的值傳遞給SQL去更新。set元素就可以實(shí)現(xiàn)此功能。set元素遇到逗號(hào),它會(huì)自動(dòng)將對(duì)應(yīng)的逗號(hào)去掉。

<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元素是一個(gè)循環(huán)語(yǔ)句,它的作用是遍歷集合,它能很好的支持?jǐn)?shù)組和List、Set接口的集合,對(duì)此提供遍歷的功能,它往往用于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是傳遞進(jìn)來(lái)的參數(shù)名稱,它可以是一個(gè)數(shù)組、List、Set等集合。

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

  index配置的是當(dāng)前元素在集合的位置下標(biāo)。

  open和close配置的是以什么符號(hào)將這些集合元素包裝起來(lái)。

  separator是各個(gè)元素的分隔符。

用test的屬性判斷字符串

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

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

bind元素

  bind元素的作用是通過(guò)OGNL表達(dá)式去定義一個(gè)上下文變量,這樣更方便使用。

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

  <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í)過(guò)程中對(duì)于Mybatis中的動(dòng)態(tài)SQL語(yǔ)句的常見(jiàn)知識(shí)點(diǎn)總結(jié),希望大家可以一起學(xué)習(xí)進(jìn)步!

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • MySQL對(duì)小數(shù)進(jìn)行四舍五入的操作實(shí)現(xiàn)

    MySQL對(duì)小數(shù)進(jìn)行四舍五入的操作實(shí)現(xiàn)

    數(shù)學(xué)函數(shù)是MySQL中常用的一類(lèi)函數(shù),其主要用于處理數(shù)字,包括整型和浮點(diǎn)數(shù)等等,本文主要介紹了MySQL對(duì)小數(shù)進(jìn)行四舍五入的操作實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • 詳解MySQL like如何查詢包含''%''的字段(ESCAPE用法)

    詳解MySQL like如何查詢包含''%''的字段(ESCAPE用法)

    這篇文章主要介紹了詳解MySQL like如何查詢包含'%'的字段(ESCAPE用法),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Win10下mysql 8.0.15 安裝配置圖文教程

    Win10下mysql 8.0.15 安裝配置圖文教程

    這篇文章主要為大家詳細(xì)介紹了Win10下mysql 8.0.15 安裝配置圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • mysql數(shù)據(jù)庫(kù)中g(shù)etshell的方式總結(jié)

    mysql數(shù)據(jù)庫(kù)中g(shù)etshell的方式總結(jié)

    MySQL版本大于5.0,MySQL 5.0版本以上會(huì)創(chuàng)建日志文件,我們通過(guò)修改日志文件的全局變量,就可以GetSHELL,下面這篇文章主要給大家介紹了關(guān)于mysql數(shù)據(jù)庫(kù)中g(shù)etshell的方式,需要的朋友可以參考下
    2022-07-07
  • mysql數(shù)據(jù)庫(kù)操作_高手進(jìn)階常用的sql命令語(yǔ)句大全

    mysql數(shù)據(jù)庫(kù)操作_高手進(jìn)階常用的sql命令語(yǔ)句大全

    mysql數(shù)據(jù)庫(kù)操作sql命令語(yǔ)句大全:三表連表查詢、更新時(shí)批量替換字段部分字符、判斷某一張表是否存在、自動(dòng)增長(zhǎng)恢復(fù)從1開(kāi)始、查詢重復(fù)記錄、更新時(shí)字段值等于原值加上一個(gè)字符串、更新某字段為隨機(jī)值、復(fù)制表數(shù)據(jù)到另一個(gè)表、創(chuàng)建表時(shí)拷貝其他表的數(shù)據(jù)和結(jié)構(gòu)...
    2022-11-11
  • MySQL如何為字段添加默認(rèn)時(shí)間淺析

    MySQL如何為字段添加默認(rèn)時(shí)間淺析

    這篇文章主要給大家介紹了關(guān)于MySQL如何為字段添加默認(rèn)時(shí)間的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • dbeaver導(dǎo)入sql腳本的詳細(xì)步驟(附圖文)

    dbeaver導(dǎo)入sql腳本的詳細(xì)步驟(附圖文)

    這篇文章主要給大家介紹了關(guān)于dbeaver導(dǎo)入sql腳本的詳細(xì)步驟,DBeaver是一款數(shù)據(jù)庫(kù)管理工具,最重要的是他是一款比較好的開(kāi)源工具,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • MySQL 服務(wù)器參數(shù)說(shuō)明及查看 設(shè)置方法

    MySQL 服務(wù)器參數(shù)說(shuō)明及查看 設(shè)置方法

    MySQL 服務(wù)器參數(shù)說(shuō)明及查看,設(shè)置方法,對(duì)于mysql不是很熟悉的朋友,可以參考下。
    2009-03-03
  • MySQL的commit是如何commit源碼解析

    MySQL的commit是如何commit源碼解析

    這篇文章主要為大家介紹了MySQL的commit是如何commit源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • MySQL存儲(chǔ)過(guò)程的權(quán)限問(wèn)題小結(jié)

    MySQL存儲(chǔ)過(guò)程的權(quán)限問(wèn)題小結(jié)

    這篇文章主要介紹了MySQL存儲(chǔ)過(guò)程的權(quán)限問(wèn)題小結(jié)及mysql 創(chuàng)建存儲(chǔ)過(guò)程權(quán)限問(wèn)題,感興趣的朋友一起看看吧
    2018-04-04

最新評(píng)論