上篇文章《深入淺出Mybatis系列(八)---mapper映射檔配置之select、resultMap》簡單介紹了mybatis的查詢,至此,CRUD都已講完。本文將介紹mybatis強大的動態SQL。
那麼,問題來了: 什麼是動態SQL? 動態SQL有什麼作用?
傳統的使用JDBC的方法,相信大家在組合複雜的的SQL語句的時候,需要去拼接,稍不注意哪怕少了個空格,都會導致錯誤。 Mybatis的動態SQL功能正是為了解決這個問題, 其透過 if, choose, when, otherwise, trim, where, set, foreach標籤,可組合成非常靈活的SQL語句,從而提高開發人員的效率。下面就去感受Mybatis動態SQL的魅力吧:
#1. if: 你們能判斷,我也能判斷!
當程式猿,誰不懂if ! 在mybatis中也能用if 啦:
<select> select * from user where <if> id=#{id} </if> and deleteFlag=0;</select>
上面範例: 如果傳入的id 不為空, 那麼才會SQL才拼接id = #{id}。 這相信大家看一樣就能明白,不多說。
細心的人會發現一個問題:「你這不對啊!要是你傳入的 id為null, 那麼你這最終的SQL語句不就成了select * from user where and deleteFlag=0,這語句有問題!拼接條件神馬的都是浮雲!
咱們透過where改造一下上面的例子:<select>
select * from user
<where>
<if>
id=#{id} </if>
and deleteFlag=0; </where>
</select>
上面的where標籤,其實用trim 可以表示如下:
<trim> ... </trim>
它的意思是:當WHERE後緊接在AND或則OR的時候,就去除AND或者OR。 除了WHERE以外, 其實還有一個比較經典的實現,那就是SET。
4. set: 信我,不出錯!
<update> update user set <if> name = #{name}, </if> <if> password = #{password}, </if> <if> age = #{age} </if> <where> <if> id = #{id} </if> and deleteFlag = 0; </where></update>
問題又來了: 「如果我只有name不為null, 那麼這SQL不就成了update set name = #{name}, where ...... .. ? 你那name後面那逗號會導致出錯啊!以下是透過set標籤改造後:
<update> update user <set> <if>name = #{name},</if> <if>password = #{password},</if> <if>age = #{age},</if> </set> <where> <if> id = #{id} </if> and deleteFlag = 0; </where></update>
这个用trim 可表示为:
<trim> ...</trim>
WHERE是使用的 prefixOverrides(前缀), SET是使用的 suffixOverrides (后缀), 看明白了吧!
5. foreach: 你有for, 我有foreach, 不要以为就你才屌!
java中有for, 可通过for循环, 同样, mybatis中有foreach, 可通过它实现循环,循环的对象当然主要是java容器和数组。
<select> SELECT * FROM POST P WHERE ID in <foreach> #{item} </foreach></select>
将一个 List 实例或者数组作为参数对象传给 MyBatis,当这么做的时候,MyBatis 会自动将它包装在一个 Map 中并以名称为键。List 实例将会以“list”作为键,而数组实例的键将是“array”。同样, 当循环的对象为map的时候,index其实就是map的key。
6. choose: 我选择了你,你选择了我!
Java中有switch, mybatis有choose。
<select> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <choose> <when> AND title like #{title} </when> <when> AND author_name like #{author.name} </when> <otherwise> AND featured = 1 </otherwise> </choose></select>
以上例子中: 当title和author都不为null的时候, 那么选择二选一(前者优先), 如果都为null, 那么就选择 otherwise中的, 如果tilte和author只有一个不为null, 那么就选择不为null的那个。
纵观mybatis的动态SQL, 强大而简单, 相信大家简单看一下就能使用了。
好啦,本次就写到这!下篇文章将结合mybatis的源码分析一次sql语句执行的整个过程。
以上就是深入浅出Mybatis系列(九)---强大的动态SQL的内容,更多相关内容请关注PHP中文网(www.php.cn)!

ByteCodeachievesPlatFormIndenceByByByByByByExecutedBoviratualMachine(VM),允許CodetorunonanyplatformwithTheApprepreprepvm.Forexample,Javabytecodecodecodecodecanrunonanydevicewithajvm

Java不能做到100%的平台獨立性,但其平台獨立性通過JVM和字節碼實現,確保代碼在不同平台上運行。具體實現包括:1.編譯成字節碼;2.JVM的解釋執行;3.標準庫的一致性。然而,JVM實現差異、操作系統和硬件差異以及第三方庫的兼容性可能影響其平台獨立性。

Java通過“一次編寫,到處運行”實現平台獨立性,提升代碼可維護性:1.代碼重用性高,減少重複開發;2.維護成本低,只需一處修改;3.團隊協作效率高,方便知識共享。

在新平台上創建JVM面臨的主要挑戰包括硬件兼容性、操作系統兼容性和性能優化。 1.硬件兼容性:需要確保JVM能正確使用新平台的處理器指令集,如RISC-V。 2.操作系統兼容性:JVM需正確調用新平台的系統API,如Linux。 3.性能優化:需進行性能測試和調優,調整垃圾回收策略以適應新平台的內存特性。

javafxeffectife addressemanddressEndressencissencies uningusement insuplatform-agnosticsCenegraphandCsSsStyling.1)itabstractsplactsplatsplatsplatsplatsplatformsthroughascenegraph,確保consistentertrenderingrenderingrenderingacrosswindows,macoswindwind,Macos,MacOs.2)

JVM的工作原理是將Java代碼轉換為機器碼並管理資源。 1)類加載:加載.class文件到內存。 2)運行時數據區:管理內存區域。 3)執行引擎:解釋或編譯執行字節碼。 4)本地方法接口:通過JNI與操作系統交互。

JVM使Java實現跨平台運行。 1)JVM加載、驗證和執行字節碼。 2)JVM的工作包括類加載、字節碼驗證、解釋執行和內存管理。 3)JVM支持高級功能如動態類加載和反射。

Java應用可通過以下步驟在不同操作系統上運行:1)使用File或Paths類處理文件路徑;2)通過System.getenv()設置和獲取環境變量;3)利用Maven或Gradle管理依賴並測試。 Java的跨平台能力依賴於JVM的抽象層,但仍需手動處理某些操作系統特定的功能。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

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

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。