1. 程式人生 > >Mybatis--如何在註解式sql中寫入動態的SQL語句

Mybatis--如何在註解式sql中寫入動態的SQL語句

突然需要用到動態SQL,應為之前我們用的是在Mapper層建立一個介面類,然後通過註解式來查詢資料庫的:如下

        @Select("SELECT user_id " +
            " FROM sp_user_relation WHERE up_user_id=#{userId} OR user_id=#{user_id}")
	@Results({
            @Result(property = "userId",  column = "user_id")
        })
	List<String> getId(String userId);

這樣子寫死後不之如何才能寫成動態,便去網上查詢,發現如下寫法:

但是發現這樣子太麻煩了,便找尋其他方式,功夫不負有心人,真被我找到了,話不多說,上程式碼:

@Select("<script>SELECT promo_user_id,promoed_name,promoed_phone " +
            " FROM sp_promo_his <if test=' name != null or phone!=null'>order by </if>  "
            + " <if test='name!=null'> promoed_name </if> "
            + " <if test='phone!=null and name!=null'>,promoed_phone</if> "
            + " <if test='phone!=null and name==null'> promoed_phone</if></script>")
    @Results({
            @Result(property = "userId",  column = "promo_user_id"),
            @Result(property = "name", column = "promoed_name"),
            @Result(property = "phone", column = "promoed_phone")
    })
	List<AbcdBean> getAbloud(@Param("name")String name,@Param("phone")String phone);

這段程式碼也是用了註解式SQL,在其中用script標籤包圍,然後像xml語法一樣書寫;

其中動態SQL處使用 If 標籤做判斷 <if test='判斷語句,true則執行標籤內語句'>

注:

@Param 標籤用於 傳入值 用 標籤括號裡的引數接收,然後在放入sql中運用

測試成功了,可是如果多條資料判斷則出現另一個問題,if內要判斷多次,並且多引數中的逗號不好確定,這是絕不可取的,然後我又找到一個標籤解決了:

程式碼如下

@Select("<script>SELECT promo_user_id,promoed_name,promoed_phone " +
	" FROM sp_promo_his <trim prefix='order by' prefixOverrides=','> "
	+ " <if test='name!=null'> ,promoed_name </if><if test='phone!=null'> ,promoed_phone </if> </trim></script>")
    @Results({
            @Result(property = "userId",  column = "promo_user_id"),
            @Result(property = "name", column = "promoed_name"),
            @Result(property = "phone", column = "promoed_phone")
    })
	List<AbcdBean> getAbloud(@Param("name")String name,@Param("phone")String phone);

這次使用了<trim>標籤,省去了之前很長的判斷,

<trim>節點標籤:

       trim主要功能是可以在Trim包含的內容前加上某些字首(prefix),也可以在Trim包含的內容之後加上某些字尾(suffix)

       還可以把Trim包含內容的首部的某些內容忽略掉(prefixOverrides) ,也可以把Trim包含的內容的尾部的某些內容忽略掉(suffixOverrides),

使用了這個標籤後,之前的問題變很輕鬆的解決了.

注:

<trim prefix='order by' prefixOverrides=','>xxxx</trim>

之前我在這段標籤前加一個 if 標籤包含這段代嗎,應為擔心 標籤中為空 但SQL 會加 order by 但經測試後發現標籤內容為空則presfix值不會自動新增