大家好,我是@老K玩代碼,是一個從業十多年的老程式員。
最近一直在分享Java程式設計方面的内容。
在之前的幾次分享,我們已經把MyBatis的基礎用法介紹得八九不離十了,相關内容詳見下述連結:
- MyBatis精講(一)MyBatis基礎配置及持久層連接配接建立代碼實戰
- MyBatis精講(二)常用工具MyBatisUtils類的實作
- MyBatis精講(三)一篇文章讓你學會如何用MyBatis擷取資料
- MyBatis精講(四)查詢資料方法精講及實戰代碼集合
- MyBatis精講(五)CRUD操作及實戰代碼分享
- MyBatis精講(六)一對多資料查詢實戰分享
本期我們分享一種靈活查詢方法的寫法,叫做“動态SQL”。
内容有點多,結合之前的知識點,一下子看不完,有心學習Java或MyBatis的,可以先收藏或關注一下,等有空的時候能找得到回來的路。
一、動态SQL
我們在實際應用場景,經常會看到這樣的查詢請求:
在查詢欄裡有很多可選項,在确認請求前,開發人員無法在開發中預知會得到什麼樣的查詢參數和查詢條件。
很顯然,給每個查詢條件組合都寫一個select映射是不現實的,我們需要一種根據參數自動調整sql文法的辦法,這個辦法就是動态SQL。
在MyBatis中,已經預設了動态SQL的代碼子產品,我們隻需要對相關标簽稍加掌握,就能很好地應對上述這種複雜的場景。
二、實戰開發
首先,我們自然是要到mapper.xml中完成相應映射配置:
- humanResource.xml
<select id="dynamicSQL" parameterType="java.util.Map" resultType="koder.mybatis.entity.Employee">
select * from employee
<where>
<if test="id != null">
and id > #{id}
</if>
<if test="salary != null">
and salary > #{salary}
</if>
</where>
</select>
說明:
- select選擇器本身沒什麼特别的,是一個傳入Map類型參數,輸出Employee資料的方法,命名為dynamicSQL;
- <if>标簽起到的效果和程式設計語句中的if語句一樣,表示條件邏輯,判斷條件寫在test屬性裡;本例中,通過判斷參數id或salary 是否存在,來決定是否執行相關語句;
- <where> 标簽是用來包裹條件判斷的,能在邏輯正确的情況下自動修改語句中的不适當表達,如本例中,會根據參數情況,自動删除語句中不适當的and 關鍵字。
然後,我們編寫一下測試用例:
- MyBatis.java
@Test
public void testDynamicSQL(){
SqlSession session = null;
try {
session = MyBatisUtils.openSession();
Map param = new HashMap();
param.put("id", 6000); // 條件1
param.put("salary", 6500); // 條件2
List<Employee> list = session.selectList("humanResource.dynamicSQL", param);
for (Employee e: list) {
System.out.println(e.getName());
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
MyBatisUtils.closeSession(session);
}
}
- 上例中,sqlsession查詢邏輯并無特别之處;
- 通過put方法,講參數傳入param;
- 本例中,設計了2個條件,條件1是id大于6000,條件2是salary大于6500;
三. 執行個體測試
通過對上例測試代碼中的條件1和條件2做出調整,會在輸出結果中得到不同的結果
1. 不設參數
将條件1和條件2都注釋掉,然後運作代碼,得到的結果是:
趙乾
孫禮
周武
鄭望
上述結果其實就是所有員工的名字。
其背後的sql代碼是:select * from employee
2. 設定id
僅将條件2注釋掉,保留條件1對id的條件判斷,得到的結果是:
周武
鄭望
上述結果得到的是6000以後的員工,即兩名技術部的員工;
其背後的sql代碼是:select * from employee WHERE id > 6000
3. 設定salary
僅将條件1注釋掉,保留條件2對salary的條件判斷,得到的結果是:
孫禮
鄭望
這樣就能得到收入高于6500元的兩名員工;
其執行的sql代碼是:select * from employee WHERE salary > 6500
4. 同時設定id和salary
同時保留2個判斷條件,運作代碼:
鄭望
這樣得到的是技術部裡收入高于6500元的員工名單。
其sql文法是select * from employee WHERE id > 6000 and salary > 6500
5. 總結
通過上例,我們可以看到,真實執行的sql語句,随着我們提供的條件參數而改變着。
sql語句會在有對應參數的時候執行相應的判斷語句,與此同時,會将不合适的關鍵字and自動删除,保證sql語句能完整執行。
動态sql是MyBatis以及很多其它持久層架構非常常用的場景。
掌握了這個文法标簽,不僅可以節省你大量編寫映射的時間,同時還能靈活優化你的業務邏輯,幫助你更快速、準确、高效地開發出功能靈活的網絡應用。
感謝你看到這裡。
如果你對老K分享的内容有任何疑問,歡迎随時在評論區留言或者私信我。
正在學習的小夥伴記得給老K一個贊哦,你的支援是我持續輸出課程内容最大的動力!
閱讀推薦
除了看過了教程和知識點,學習Java時也可以找些項目來練練手,看看自己掌握的情況。
我之前分享一些不錯的Java練手項目,需要的可以點選下方連結擷取:
9個Java免費實戰項目,幫助提高基本功
結束語
我是專注于開發領域的@老K玩代碼,會持續生産關于如何學習程式設計語言的優質内容。
如果你想學習Java程式設計,或者想精進你的Java程式設計能力,可以關注我。
如果你對開發、程式設計有任何疑問或者有想了解的内容,而我暫時沒有寫到的,也歡迎随時來找我聊聊。
#頭條創作挑戰賽#