一、用script標簽包圍,然后像xml語法一樣書寫
1. 判斷參數是否為空或者為null,沒有參數則不執行該語句
/** * @description 根據條件查詢客戶信息 (分頁查詢) 倒敘 * - asc 按升序排列 (不用寫,默認使用這個) * - desc 按降序排列 */ @Select({"<script>","select * from user","where 1=1", "<if test='tel!=null and tel!=\"\"'>","and tel = #{tel}","</if>", "<if test='customname!=null and customname != \"\"'>","and customname = #{customname}","</if>", "<if test='sendemail!=null and sendemail !=\"\"'>","and send_email = #{sendemail}","</if>", "<if test='keywords!=null and keywords != \"\"'>","and keywords like '%${keywords}%'","</if>", "order by id desc limit #{pages},#{limit}", "</script>"}) public List<Custom> findCustomByForm(@Param("tel") String tel,@Param("customname") String customname, @Param("sendemail") String sendemail,@Param("keywords") String keywords, @Param("pages") Integer pages,@Param("limit") Integer limit);
注意:此處判斷空時用到轉義字符 name != \"\"
2. 多個判斷中取出一個類似於Java 的 switch 語句,choose 為 switch,when 為 case,otherwise 則為 default。
/** * @description 根據條件查詢客戶信息 (分頁查詢) 倒敘 * - asc 按升序排列 (不用寫,默認使用這個) * - desc 按降序排列 */ @Select({"<script>","select * from user","where 1=1", "<choose><when test='tel!=null'>","and tel = #{tel}","</when>", "<when test='customname!=null'>","and customname = #{customname}","</when>", "<when test='sendemail!=null'>","and send_email = #{sendemail}","</when>", "<when test='keywords!=null'>","and keywords like '%${keywords}%'","</when></choose>", "order by id desc limit #{pages},#{limit}", "</script>"}) public List<Custom> findCustomByForm(@Param("tel") String tel,@Param("customname") String customname, @Param("sendemail") String sendemail,@Param("keywords") String keywords, @Param("pages") Integer pages,@Param("limit") Integer limit);
注意:有時候我們並不想應用所有的條件,而只是想從多個選項中選擇一個。而使用if標簽時,只要test中的表達式為 true,就會執行 if 標簽中的條件。MyBatis 提供了 choose 元素。
if標簽是與(and)的關系,而 choose 是或(or)的關系。
choose標簽是按順序判斷其內部when標簽中的test條件出否成立,如果有一個成立,則 choose 結束。
當 choose 中所有 when 的條件都不滿則時,則執行 otherwise 中的sql。類似於Java 的 switch 語句,choose 為 switch,when 為 case,otherwise 則為 default。
同樣把所有可以限制的條件都寫上,方面使用。choose會從上到下選擇一個when標簽的test為true的sql執行。安全考慮,我們使用where將choose包起來,放置關鍵字多於錯誤。
二、用Provider去實現SQL拼接,例如:
public class OrderProvider { private final String TBL_ORDER = "tbl_order"; public String queryOrderByParam(OrderPara param) { SQL sql = new SQL().SELECT("*").FROM(TBL_ORDER); String room = param.getRoom(); if (StringUtils.hasText(room)) { sql.WHERE("room LIKE #{room}"); } Date myDate = param.getMyDate(); if (myDate != null) { sql.WHERE("mydate LIKE #{mydate}"); } return sql.toString(); } } public interface OrderDAO { @SelectProvider(type = OrderProvider.class, method = "queryOrderByParam") List<Order> queryOrderByParam(OrderParam param); }
注意:方式1有個隱患就是當傳入參數為空的時候,可能會造成全表查詢。
復雜SQL用方式2會比較靈活(當然,並不建議寫復雜SQL),而且可以抽象成通用的基類,使每個DAO都可以通過這個基類實現基本的通用查詢,原理類似Spring JDBC Template。
