天天看點

MyBatis精講(七)動态SQL查詢方法講解+實戰代碼

大家好,我是@老K玩代碼,是一個從業十多年的老程式員。

最近一直在分享Java程式設計方面的内容。

在之前的幾次分享,我們已經把MyBatis的基礎用法介紹得八九不離十了,相關内容詳見下述連結:

  • MyBatis精講(一)MyBatis基礎配置及持久層連接配接建立代碼實戰
  • MyBatis精講(二)常用工具MyBatisUtils類的實作
  • MyBatis精講(三)一篇文章讓你學會如何用MyBatis擷取資料
  • MyBatis精講(四)查詢資料方法精講及實戰代碼集合
  • MyBatis精講(五)CRUD操作及實戰代碼分享
  • MyBatis精講(六)一對多資料查詢實戰分享

本期我們分享一種靈活查詢方法的寫法,叫做“動态SQL”。

内容有點多,結合之前的知識點,一下子看不完,有心學習Java或MyBatis的,可以先收藏或關注一下,等有空的時候能找得到回來的路。

MyBatis精講(七)動态SQL查詢方法講解+實戰代碼

一、動态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以及很多其它持久層架構非常常用的場景。

掌握了這個文法标簽,不僅可以節省你大量編寫映射的時間,同時還能靈活優化你的業務邏輯,幫助你更快速、準确、高效地開發出功能靈活的網絡應用。

MyBatis精講(七)動态SQL查詢方法講解+實戰代碼

感謝你看到這裡。

如果你對老K分享的内容有任何疑問,歡迎随時在評論區留言或者私信我。

正在學習的小夥伴記得給老K一個贊哦,你的支援是我持續輸出課程内容最大的動力!

閱讀推薦

除了看過了教程和知識點,學習Java時也可以找些項目來練練手,看看自己掌握的情況。

我之前分享一些不錯的Java練手項目,需要的可以點選下方連結擷取:

9個Java免費實戰項目,幫助提高基本功

結束語

我是專注于開發領域的@老K玩代碼,會持續生産關于如何學習程式設計語言的優質内容。

如果你想學習Java程式設計,或者想精進你的Java程式設計能力,可以關注我。

如果你對開發、程式設計有任何疑問或者有想了解的内容,而我暫時沒有寫到的,也歡迎随時來找我聊聊。

MyBatis精講(七)動态SQL查詢方法講解+實戰代碼

#頭條創作挑戰賽#