1. 程式人生 > >mybatis動態sql語句

mybatis動態sql語句

mybatis 的動態sql語句是基於OGNL表示式的。可以方便的在 sql 語句中實現某些邏輯. 總體說來mybatis 動態SQL 語句主要有以下幾類: if 語句 (簡單的條件判斷) choose (when,otherwize) ,相當於java 語言中的 switch ,與 jstl 中的choose 很類似. trim (對包含的內容加上 prefix,或者 suffix 等,字首,字尾) where (主要是用來簡化sql語句中where條件判斷的,能智慧的處理 and or ,不必擔心多餘導致語法錯誤) set (主要用於更新時) foreach (在實現 mybatis in 語句查詢時特別有用) 1.使用if+where實現多條件查詢

首先,我們需要建立一個數據庫,程式碼如下: CREATE TABLEblog( idINT (11), titleVARCHAR (765), contentVARCHAR (765), ownerVARCHAR (150) ); INSERT INTOt_blog(id,title,content,owner) VALUES('1','java基礎','詳細描述','唐國強11'); INSERT INTOt_blog(id,title,content,owner) VALUES('2','中文','中國','ofo11'); INSERT INTOt_blog(id,
title,content,owner) VALUES('3','html','html標籤','樣式'); INSERT INTOt_blog(id,title,content,owner) VALUES('6','html','www','eee'); INSERT INTOt_blog(id,title,content,owner) VALUES('9','中文','111','1111'); 1.建立一個對映檔案:×××.xml 2.if方法 這裡寫圖片描述 工具類: 這裡寫圖片描述 測試類: 這裡寫圖片描述 執行結果如下: 這裡寫圖片描述

這條語句的意思非常簡單,如果你提供了title引數,那麼就要滿足title=#{title},同樣如果你提供了Content和Owner的時候,它們也需要滿足相應的條件,之後就是返回滿足這些條件的所有Blog,這是非常有用的一個功能,以往我們使用其他型別框架或者直接使用JDBC的時候, 如果我們要達到同樣的選擇效果的時候,我們就需要拼SQL語句,這是極其麻煩的,比起來,上述的動態SQL就要簡單多了

2. choose (when,otherwize) ,相當於java 語言中的 switch ,與 jstl 中的choose 很類似 這裡寫圖片描述 測試類 這裡寫圖片描述 執行結果如下: 這裡寫圖片描述

when元素表示當when中的條件滿足的時候就輸出其中的內容,跟JAVA中的switch效果差不多的是按照條件的順序,當when中有條件滿足的時候,就會跳出choose,即所有的when和otherwise條件中,只有一個會輸出,當所有的我很條件都不滿足的時候就輸出otherwise中的內容。所以上述語句的意思非常簡單, 當title!=null的時候就輸出and titlte = #{title},不再往下判斷條件,當title為空且content!=null的時候就輸出and content = #{content},當所有條件都不滿足的時候就輸出otherwise中的內容。

3.trim (對包含的內容加上 prefix,或者 suffix 等,字首,字尾) 這裡寫圖片描述 測試類 這裡寫圖片描述 執行結果如下: 這裡寫圖片描述

trim元素的主要功能是可以在自己包含的內容前加上某些字首,也可以在其後加上某些字尾,與之對應的屬性是prefix和suffix;可以把包含內容的首部某些內容覆蓋,即忽略,也可以把尾部的某些內容覆蓋,對應的屬性是prefixOverrides和suffixOverrides;正因為trim有這樣的功能,所以我們也可以非常簡單的利用trim來代替where元素的功能

4. where (主要是用來簡化sql語句中where條件判斷的,能智慧的處理 and or 條件 這裡寫圖片描述 測試類 這裡寫圖片描述 執行結果如下: 這裡寫圖片描述

where元素的作用是會在寫入where元素的地方輸出一個where,另外一個好處是你不需要考慮where元素裡面的條件輸出是什麼樣子的,MyBatis會智慧的幫你處理,如果所有的條件都不滿足那麼MyBatis就會查出所有的記錄,如果輸出後是and 開頭的,MyBatis會把第一個and忽略,當然如果是or開頭的,MyBatis也會把它忽略;此外,在where元素中你不需要考慮空格的問題,MyBatis會智慧的幫你加上。像上述例子中,如果title=null, 而content != null,那麼輸出的整個語句會是select * from t_blog where content = #{content},而不是select * from t_blog where and content = #{content},因為MyBatis會智慧的把首個and 或 or 給忽略。 3和4都可以自動判斷要不要加and和or