搜尋
首頁資料庫SQL學習MyBatis 動態 SQL

學習MyBatis 動態 SQL

Dec 09, 2020 pm 05:46 PM
mybatissql

sql教學介紹SQL MyBatis的強大特性SQL

學習MyBatis 動態 SQL

#推薦(免費):sql教學

#動態SQL

MyBatis 的強大功能之一就是它的動態SQL。如果你有使用 JDBC 或其它類似框架的經驗,你就能體會到根據不同條件拼接 SQL 語句的痛苦。例如拼接時要確保不能忘記加入必要的空格,也要注意去掉列表最後一個列名的逗號。利用動態 SQL 這項特性可以徹底擺脫這種痛苦。

雖然在先前使用動態 SQL 並非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射語句中的強大的動態 SQL 語言得以改進這種情況。

動態 SQL 元素和 JSTL 或基於類似 XML 的文字處理器相似。在 MyBatis 之前的版本中,有許多元素需要花時間了解。 MyBatis 3 大大精簡了元素種類,現在只需學習原來一半的元素便可。 MyBatis 採用功能強大的基於 OGNL 的表達式來淘汰其它大部分元素。

準備

先建立User實體類別

public class User {
    private Integer id;
    private String username;
    private String userEmail;
    private String userCity;
    private Integer age;}

建立user表
CREATE TABLE user (
  id int(11) NOT NULL AUTO_INCREMENT,
  username varchar(255) DEFAULT NULL,
    user_email varchar(255) DEFAULT NULL,
    user_city varchar(255) DEFAULT NULL,
    age int(11) DEFAULT NULL,
  PRIMARY KEY (id))

if

定義介面方法

public List<user> findByUser(User user);</user>

介面對應的Mapper.xml 定義如下所示

<select>
    select
    id, username, user_email userEmail, user_city userCity, age
    from user
    where    <if>
        username = #{username}    </if>
    <if>
        and user_email = #{userEmail}    </if>
    <if>
        and user_city = #{userCity}    </if></select>

如果if標籤上的test為true,那麼if標籤裡面的SQL語句將會被拼接。

如果username、userEmail、userCity都不為空,那麼SQL將會拼接成如下所示

select id, username, user_email userEmail, user_city userCity, age 
from user where username = ? and user_email = ? and user_city = ?

如果只有username不為空,那麼SQL將會拼接成如下所示

select id, username, user_email userEmail, user_city userCity, age 
from user where username = ?

但這種方式有一個缺點,假設此時username為空,userEmail、userCity都不為空。

我們來分析動態SQL 程式碼,現在沒有給username 賦值,也就是username==null,所以「username=#{username}」 這段程式碼不會加入到SQL 語句中,那麼最終拼接好的動態SQL 是這樣的:<pre class="brush:php;toolbar:false">select id, username, user_email userEmail, user_city userCity, age  from user where and user_email = ? and user_city = ?</pre>where 後面直接跟and,很明顯的語法錯誤,此時應該把緊跟在where後面的and刪掉。為了解決這個問題,可以使用

where

標籤。

where

將上面的SQL改成如下圖<pre class="brush:php;toolbar:false">    &lt;select&gt;         select         id, username, user_email userEmail, user_city userCity, age        from user         &lt;where&gt;             &lt;if&gt;                 username = #{username}             &lt;/if&gt;             &lt;if&gt;                 and user_email = #{userEmail}             &lt;/if&gt;             &lt;if&gt;                 and user_city = #{userCity}             &lt;/if&gt;         &lt;/where&gt;     &lt;/select&gt;</pre>如果where標籤裡面的if 標籤有滿足條件的,那麼where標籤就會被拼接成where語句,若

if

標籤拼接的SQL最前面有and語句,那麼這個and將會被刪除。使用這種方法, 會自動刪除SQL中不需要的關鍵字,所以一般 if 標籤和 where 標籤會組合起來使用。

trimtrim標籤中的prefix

suffix

屬性會被用來生成實際的SQL 語句,會跟標籤內部的語句拼接。 如果語句的前面或後面遇到 prefixOverrides

suffixOverrides

屬性中指定的值,MyBatis 會自動刪除它們。在指定多個值的時候,別忘了每個值後面都要有一個空格,保證不會和後面的 SQL 連接在一起。

prefix

:在拼接的SQL語句中加上一個前綴

suffix

:在拼接的SQL語句中加上一個字尾

##prefixOverrides:拼接的SQL語句前面遇到

prefixOverrides

,MyBatis 會自動將它們刪除suffixOverrides:拼接的SQL語句後面遇到

suffixOverrides

,MyBatis 會自動刪除它們下面使用

trim
<select>
        select
        id, username, user_email userEmail, user_city userCity, age
        from user        <trim>
            <if>
                username = #{username}            </if>
            <if>
                and user_email = #{userEmail}            </if>
            <if>
                and user_city = #{userCity}            </if>
        </trim>
    </select>

如果username為空,userEmail和userCity不為空,那麼

iftrim

標籤設定了prefixOverrides=”and” ,而上面的SQL前面有and語句,所以需要將上面的and語句刪掉,又因為

trim

標籤設定了prefix=”where”,所以需要在拼接的SQL語句前面加一個where語句

最後

trim

標籤的SQL語句被拼接成如下所示
where user_email = #{userEmail} and user_city = #{userCity}

choose

有時我們不想應用到所有的條件語句,而只想從中擇其一項。針對這種情況,MyBatis 提供了 choose 元素,它有點像 Java 中的 switch 語句。

<select>
        select
        id, username, user_email userEmail, user_city userCity, age
        from user        <where>
            <choose>
                <when>
                    username = #{username}                </when>
                <when>
                    and user_email = #{userEmail}                </when>
                <when>
                    and user_city = #{userCity}                </when>
            </choose>
        </where>
    </select>

###set######set 標籤用於 Update 操作,會自動根據參數選擇產生 SQL 語句。 ######介面定義如下###
public int updateUser(User user);
###介面對應的Mapper.xml 定義如下所示###
<update>
       update user       <set>
           <if>
               username=#{username},           </if>
           <if>
               user_email=#{userEmail},           </if>
           <if>
               user_city=#{userCity},           </if>
           <if>
              age=#{age}           </if>
       </set>
       where id=#{id}    </update>
#########foreach######foreach 標籤可以迭代產生一系列值######*###用於SQL 的in 語句*######

接口定义如下所示

public List<user> getUsersByIds(List<integer> ids);</integer></user>

接口对应的 Mapper.xml 定义如下所示

<!--
        collection: 指定要遍历的集合
            默认情况下
                如果为Collection类型的,key为collection;
                如果为List类型的,key为list
                如果是数组类型,key为array
            可以通过@Param("ids")来指定key
        item: 将当前遍历的元素赋值给指定的变量
        open: 给遍历的结果添加一个开始字符
        close: 给遍历的结果添加一个结束字符
        separator: 每个元素之间的分隔符
    --><select>
    select * from user
    where id in    <foreach>
        #{id}    </foreach></select>

用于批量插入

接口定义如下所示

public int addUserList(List<user> users);</user>

接口对应的 Mapper.xml 定义如下所示

<insert>
    insert into user
    (username, user_email, user_city, age)
    values    <foreach>
        (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age})    </foreach></insert><!--返回自增主键--><insert>
    insert into user
    (username, user_email, user_city, age)
    values    <foreach>
        (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age})    </foreach></insert><!--还可以这样写--><!--
    这种方式需要数据库连接属性设置allowMultiQueries=true
    这种分号分隔多个SQL还可以用于其他的批量操作,如修改、删除
--><insert>
    <foreach>
        insert into user
        (username, user_email, user_city, age)
        values
        (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age})    </foreach></insert><!--如果是Oracle数据库,则需要这样写--><insert>
    <foreach>
        insert into user
        (username, user_email, user_city, age)
        values
        (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age});    </foreach></insert>

以上是學習MyBatis 動態 SQL的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:learnku。如有侵權,請聯絡admin@php.cn刪除
SQL索引策略:通過數量級提高查詢性能SQL索引策略:通過數量級提高查詢性能Apr 11, 2025 am 12:04 AM

SQL索引可以通过巧妙的设计显著提升查询性能。1.选择合适的索引类型,如B-tree、哈希或全文索引。2.使用复合索引优化多字段查询。3.避免过度索引以减少数据维护开销。4.定期维护索引,包括重建和移除不必要的索引。

sql怎麼刪除約束sql怎麼刪除約束Apr 10, 2025 pm 12:21 PM

在 SQL 中刪除約束,請執行以下步驟:識別要刪除的約束名稱;使用 ALTER TABLE 語句:ALTER TABLE 表名 DROP CONSTRAINT 約束名;確認刪除。

sql觸發器怎麼設置sql觸發器怎麼設置Apr 10, 2025 pm 12:18 PM

SQL 觸發器是一種在指定表上執行特定事件時自動執行特定操作的數據庫對象。要設置 SQL 觸發器,可以使用 CREATE TRIGGER 語句,其中包括觸發器名稱、表名稱、事件類型和触發器代碼。觸發器代碼使用 AS 關鍵字進行定義,並包含 SQL 或 PL/SQL 語句或塊。通過指定觸發器條件,可以使用 WHERE 子句限制觸發器的執行範圍。可以使用 INSERT INTO、UPDATE 或 DELETE 語句在觸發器代碼中執行觸發器操作。 NEW 和 OLD 關鍵字可以在觸發器代碼中用來引用受影

sql查詢怎麼加索引sql查詢怎麼加索引Apr 10, 2025 pm 12:15 PM

索引是一種通過排序數據列來加速數據查找的數據結構。為 SQL 查詢添加索引的步驟如下:確定需要索引的列。選擇合適的索引類型(B 樹、哈希或位圖)。使用 CREATE INDEX 命令創建索引。定期重建或重新組織索引以維護其效率。添加索引的好處包括提高查詢性能、減少 I/O 操作、優化排序和篩選以及提高並發性。當查詢經常使用特定列、返回大量數據需要排序或分組、涉及多個表或數據庫表較大時,應該考慮添加索引。

sql語句ifelse怎麼用sql語句ifelse怎麼用Apr 10, 2025 pm 12:12 PM

IFELSE 語句是一種條件語句,用於根據條件評估結果返回不同值。其語法結構為:IF (condition) THEN return_value_if_condition_is_true ELSE return_value_if_condition_is_false END IF;。

sql數據庫錯誤怎麼查看sql數據庫錯誤怎麼查看Apr 10, 2025 pm 12:09 PM

SQL數據庫錯誤查看方法有:1. 直接查看錯誤消息;2. 使用SHOW ERRORS和SHOW WARNINGS命令;3. 訪問錯誤日誌;4. 使用錯誤代碼查找錯誤原因;5. 檢查數據庫連接和查詢語法;6. 使用調試工具。

sql distinct怎麼用sql distinct怎麼用Apr 10, 2025 pm 12:06 PM

DISTINCT 操作符用於 SQL 查詢中排除重複行,僅返回唯一值,適用於獲取唯一值列表、統計唯一值數量和結合 GROUP BY 使用等場景。

sql候選鍵怎麼設置sql候選鍵怎麼設置Apr 10, 2025 pm 12:03 PM

SQL 中設置候選鍵的方法:確定唯一標識列;使用 PRIMARY KEY 約束創建主鍵;使用 UNIQUE 約束添加唯一約束;創建唯一索引。設置候選鍵可以確保數據完整性、提高查詢性能和防止數據重複。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)