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

MyBatis?超詳細(xì)講解動(dòng)態(tài)SQL的實(shí)現(xiàn)

 更新時(shí)間:2022年03月31日 15:49:23   作者:小皮豬  
動(dòng)態(tài)?SQL?是?MyBatis?的強(qiáng)大特性之一。如果你使用過?JDBC?或其它類似的框架,你應(yīng)該能理解根據(jù)不同條件拼接?SQL?語句有多痛苦,例如拼接時(shí)要確保不能忘記添加必要的空格,還要注意去掉列表最后一個(gè)列名的逗號。利用動(dòng)態(tài)?SQL,可以徹底擺脫這種痛苦

情景:

     我們在使用JDBC或者其他類似的框架開發(fā)進(jìn)行數(shù)據(jù)庫開發(fā)時(shí),通常要根據(jù)需求動(dòng)手組裝SQL,不用想都覺得是件很痛苦的事情了,而Mybatis框架提供的對SQL語句動(dòng)態(tài)組裝的功能,能很好地解決這個(gè)麻煩。

概述:

     動(dòng)態(tài)SQL是MyBatis框架的一個(gè)強(qiáng)大特性,MyBatis3可采用功能強(qiáng)大的基于OGNL的表達(dá)式來完成動(dòng)態(tài)SQL,它刪除了之前版本中需要了解的大多數(shù)元素,只使用不到原來一半的元素就能完成所需的工作。

SQL元素:

SQL元素說明
<if>判斷語句,用于單條件分支判斷
<choose>  (<when>,<otherwise>)相當(dāng)于Java中的switch...case...default語句,用于多條件分支判斷
<where>簡化SQL語句中的where的條件判斷
<trim>可以靈活地去除多余的關(guān)鍵字
<set>解決動(dòng)態(tài)更新語句
<foreach>循環(huán)語句,常用于in語句等列舉條件中
<bind>從OGNL表達(dá)式中創(chuàng)建一個(gè)變量,并將其綁定到上下文,常用于模糊查詢的SQL中

<if>:

使用動(dòng)態(tài) SQL 最常見情景是根據(jù)條件包含 where 子句的一部分

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mapper.BookMapper">
 
    <resultMap id="BookType" type="org.example.po.Book">
        <id property="id" column="id"></id>
        <result property="bookName" column="bookName"></result>
        <result property="price" column="price"></result>
        <result property="publisher" column="publisher"></result>
    </resultMap>
 
    <select id="bookSelectById" parameterType="int" resultMap="BookType">
        select * from t_book
        <where>
            <if test="id!=null and id!=''">
                id=#{id}
            </if>
        </where>
    </select>
 
    <select id="bookSelectByname" parameterType="string" resultMap="BookType">
        select * from t_book
        <where>
            <if test="bookNmae!=null and bookName!=''">
                bookName LIKE concat('%',#{bookName},'%')
            </if>
        </where>
    </select>
 
</mapper>

<choose>:

      有時(shí)候,我們不想使用所有的條件,而只是想從多個(gè)條件中選擇一個(gè)使用。針對這種情況,MyBatis 提供了 choose 元素,它有點(diǎn)像 Java 中的 switch 語句。

因?yàn)樽约簩懙氖菃尾樵?,引用官網(wǎng)代碼。

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE'
  <choose>
    <when test="title != null">
      AND title like #{title}
    </when>
    <when test="author != null and author.name != null">
      AND author_name like #{author.name}
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>
</select>

<where>:

     <where>標(biāo)簽相當(dāng)于 where 1=1 ,主要用來簡化SQL語句中的where條件判斷,并能智能地處理and和or不必?fù)?dān)心多余關(guān)鍵字導(dǎo)致的語法錯(cuò)誤。代碼參考<if>標(biāo)簽代碼。

<trim>:

      這個(gè)標(biāo)簽我覺得是最靈活的,trim元素也會自動(dòng)識別其標(biāo)簽內(nèi)是否有返回值,若有的話,則會在已包含的內(nèi)容前加上某些前綴或者后綴(先判斷是否有語句包含),用到的屬性是

 1、prefix(前綴),suffix(后綴)

還可以把包含內(nèi)容的首內(nèi)容或尾內(nèi)容的符號去掉,用到的屬性是

2、prefixOverride(前綴覆蓋),suffixOverride(后綴覆蓋)

可以說功能很強(qiáng)大,可以利用它來替代where元素,并實(shí)現(xiàn)與where元素相同的效果。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mapper.BookMapper">
 
    <resultMap id="BookType" type="org.example.po.Book">
        <id property="id" column="id"></id>
        <result property="bookName" column="bookName"></result>
        <result property="price" column="price"></result>
        <result property="publisher" column="publisher"></result>
    </resultMap>
 
    <update id="bookUpdate" parameterType="book">
        UPDATE t_book
        <trim prefix="set" suffixOverrides=",">
            <if test="bookName!=null and bookName!=''">bookName=#{bookName},</if>
            <if test="price!=null and price!=''">price=#{price},</if>
            <if test="publisher!=null and publisher!=''">publisher=#{publisher}</if>
            WHERE id=#{id}
        </trim>
    </update>
 
</mapper>

<set>:

      set元素主要用于更新操作,它的主要功能和where元素差不多,主要是包含的語句前輸入一個(gè)set,若包含的語句以逗號結(jié)束,則會自動(dòng)把括號忽略掉,再配合if元素就可以動(dòng)態(tài)地更新需要修改的字段;若不需要更改字段,則可以不再被更新。

把上面的代碼修改一下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mapper.BookMapper">
 
    <resultMap id="BookType" type="org.example.po.Book">
        <id property="id" column="id"></id>
        <result property="bookName" column="bookName"></result>
        <result property="price" column="price"></result>
        <result property="publisher" column="publisher"></result>
    </resultMap>
 
    <update id="bookUpdate" parameterType="book">
        UPDATE t_book
<!--        <trim prefix="set" suffixOverrides=",">-->
<!--            <if test="bookName!=null and bookName!=''">bookName=#{bookName},</if>-->
<!--            <if test="price!=null and price!=''">price=#{price},</if>-->
<!--            <if test="publisher!=null and publisher!=''">publisher=#{publisher}</if>-->
<!--            WHERE id=#{id}-->
<!--        </trim>-->
        <set>
            <if test="bookName!=null and bookName!=''">bookName=#{bookName},</if>
            <if test="price!=null and price!=''">price=#{price},</if>
            <if test="publisher!=null and publisher!=''">publisher=#{publisher},</if>
        </set>
        WHERE id=#{id}
    </update>
 
 
</mapper>

<foreach>:

foreach元素通常在構(gòu)建in條件語句時(shí)使用,其使用方式如下。

(1).  item: 表示每個(gè)元素迭代時(shí)的別名。

(2).  index: 指定一個(gè)名稱,用于表示在迭代過程中每次迭代的位置

(3).  open: 表示該語句以什么開始(in語句以“( ”開始)

(4).  separator: 表示每次進(jìn)行迭代時(shí)以上面符號作為分隔符(in語句以“ ,”作為分隔符)

(5).  close: 表示該語句以什么結(jié)束(in語句以“ )”結(jié)束)

(注意:  這個(gè)open,separator,close基本上就是固定格式了)

(6).  collection: 表示最關(guān)鍵且最容易出錯(cuò)的屬性,需格外注意。該屬性必須指定,不同情況下該屬性的值是不一樣的,主要有三種情況:

        1).  若入?yún)閱螀?shù)且參數(shù)類型是一個(gè)list時(shí),collection屬性值為list

        2).  若入?yún)閱螀?shù)且參數(shù)類型是一個(gè)數(shù)組時(shí),collection屬性值為array

        3).  若入?yún)槎鄥?shù),需要將其封裝為一個(gè)Map進(jìn)行處理

格式:

<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  <where>
    <foreach item="item" index="id" collection="list"
        open="ID in (" separator="," close=")" nullable="true">
          #{item}
    </foreach>
  </where>
</select>

<bind>:

bind元素通常用于需要模糊查詢的語句中,使用bind元素定義了一個(gè)name為pattern_username的變量,value的屬性值就是拼接的查詢字符串,其中_parameter.getTitle()表示傳遞進(jìn)來的參數(shù)(也可以直接寫成對應(yīng)的參數(shù)變量名,如username)。

<select id="selectBlogsLike" resultType="Blog">
  <bind name="pattern_username" value="'%' + _parameter.getTitle() + '%'" />
  SELECT * FROM BLOG
  WHERE title LIKE #{pattern}
</select>

到此這篇關(guān)于MyBatis 超詳細(xì)講解動(dòng)態(tài)SQL的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MyBatis 動(dòng)態(tài)SQL內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java環(huán)境變量的配置方法圖文詳解【win10環(huán)境為例】

    java環(huán)境變量的配置方法圖文詳解【win10環(huán)境為例】

    這篇文章主要介紹了java環(huán)境變量的配置方法,結(jié)合圖文形式詳細(xì)分析了win10環(huán)境下java環(huán)境變量的配置方法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2020-04-04
  • Maven中<distributionManagement>的使用及說明

    Maven中<distributionManagement>的使用及說明

    本文主要介紹了Maven中的SNAPSHOT和RELEASE倉庫的區(qū)別,以及如何在POM文件中配置和使用快照版本,快照版本可以實(shí)現(xiàn)實(shí)時(shí)更新,方便開發(fā)過程中的依賴管理,同時(shí),本文還總結(jié)了Maven的一些常用命令及其作用
    2025-01-01
  • OpenCV在Android上的應(yīng)用示例

    OpenCV在Android上的應(yīng)用示例

    這篇文章主要介紹了OpenCV在Android上的應(yīng)用示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • java評論、回復(fù)功能設(shè)計(jì)與實(shí)現(xiàn)方法

    java評論、回復(fù)功能設(shè)計(jì)與實(shí)現(xiàn)方法

    很多項(xiàng)目或者系統(tǒng)都有評論或者回復(fù)的需求,但評論回復(fù)的實(shí)現(xiàn)往往都比較復(fù)雜,也不好實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于java評論、回復(fù)功能設(shè)計(jì)與實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • 微服務(wù)如何通過feign.RequestInterceptor傳遞參數(shù)

    微服務(wù)如何通過feign.RequestInterceptor傳遞參數(shù)

    這篇文章主要介紹了微服務(wù)如何通過feign.RequestInterceptor傳遞參數(shù),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 這么設(shè)置IDEA中的Maven,再也不用擔(dān)心依賴下載失敗了

    這么設(shè)置IDEA中的Maven,再也不用擔(dān)心依賴下載失敗了

    今天給大家?guī)硪粋€(gè)IDEA中Maven設(shè)置的小技巧.這個(gè)技巧可以說非常有用,學(xué)會設(shè)置之后,再也不用擔(dān)心maven依賴下載變慢的問題,需要的朋友可以參考下
    2021-05-05
  • java用兩個(gè)例子充分闡述多態(tài)的可拓展性介紹

    java用兩個(gè)例子充分闡述多態(tài)的可拓展性介紹

    下面小編就為大家?guī)硪黄猨ava用兩個(gè)例子充分闡述多態(tài)的可拓展性介紹。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • Hibernate懶加載之<class>標(biāo)簽上的lazy

    Hibernate懶加載之<class>標(biāo)簽上的lazy

    這篇文章主要介紹了Hibernate懶加載之<class>標(biāo)簽上的lazy,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Java-Io-RandomAccessFile任意位置讀寫數(shù)據(jù)的操作小結(jié)

    Java-Io-RandomAccessFile任意位置讀寫數(shù)據(jù)的操作小結(jié)

    RandomAccessFile類支持隨機(jī)訪問方式,可以跳轉(zhuǎn)到文件的任意位置讀寫數(shù)據(jù),這個(gè)類在文件隨機(jī)讀取時(shí)有很大的優(yōu)勢,可利用多線程完成對一個(gè)大文件的讀寫,本文給大家介紹Java-Io-RandomAccessFile(任意位置讀寫數(shù)據(jù))的相關(guān)知識,需要的朋友可以參考下
    2022-05-05
  • Java通俗易懂系列設(shè)計(jì)模式之適配器模式

    Java通俗易懂系列設(shè)計(jì)模式之適配器模式

    這篇文章主要介紹了Java通俗易懂系列設(shè)計(jì)模式之適配器模式,對設(shè)計(jì)模式感興趣的同學(xué),一定要看一下
    2021-04-04

最新評論

阳春市| 抚松县| 文成县| 镇安县| 霍林郭勒市| 柘城县| 西充县| 台北市| 柯坪县| 新闻| 苏尼特右旗| 马尔康县| 顺义区| 建水县| 犍为县| 湘潭市| 麦盖提县| 顺义区| 岱山县| 康马县| 宁明县| 南平市| 泊头市| 若尔盖县| 高尔夫| 阜阳市| 观塘区| 巧家县| 牡丹江市| 久治县| 将乐县| 中方县| 旺苍县| 新龙县| 虎林市| 原阳县| 库尔勒市| 张家口市| 博罗县| 丹凤县| 威远县|