spring Mybatis注解加判斷


一、用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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM