1. 程式人生 > >mybatis動態sql查詢

mybatis動態sql查詢

    在實際開發中,查詢條件千變萬化,有時是各個條件單個進行查詢,也有可能是其中兩個、三個乃至更多條件組合起來進行查詢,怎樣用簡潔的程式碼實現這個功能呢,剛開始想到的是在一種條件寫一個方法,對應一條sql,這種方法固然能實現功能,但特別繁瑣,造成程式碼冗餘。後來想到mybatis的mapper.xml檔案中用if test的條件判斷,當即決定,使用動態sql進行查詢。具體如下:

mapper.xml:

 <!-- 根據靈活條件檢視使用者繫結裝置詳情 -->
  <select id="queryUserDevices" parameterType="com.*.bean.Device" resultMap="deviceResultMap" flushCache="true">
    select
      <include refid="Base_Column_List" />
     from pc_device
     <where>
     <if test="deviceType!=null and deviceType!=' ' ">
         device_type = #{deviceType}
        </if>
        <if test="patId!=null and patId!=0">
        and   pat_id= #{patId}
        </if>
        <if test="machineId!=null and machineId!=0">
        and   machine_id=#{machineId}
        </if>
    </where>
  </select>

注意:1、條件要用where標籤拼接,不要用choose when otherwise或者在外面寫where 1=1,下面用<if test=" ">拼接,不然如果直接寫where後面如果第一個沒有,那麼後面的就有and 語句不對。用where標籤可以解決,過濾掉and,要記住:第一個條件不要and,後面不管有多少個條件,都用and拼接起來。

2、if test裡面的是類的屬性,不是欄位名,if test外面才是欄位名,如果在if test裡放欄位名,將會導致 屬性no getter的異常,如果欄位的型別是Integer,就是這樣判斷:patId!=null and patId!=0,如果是string,則這樣判斷deviceType!=null and deviceType!=' ',具體看各個型別沒有賦值時的預設值來定。如果是模糊查詢,應用like #{ } 至於多個條件,我是把它們封裝成一個物件進行查詢。這樣,如果if條件成立,將會把對應條件拼接到where子句後面,如果if條件不成立,where 子句將會忽略這個條件。我們可以在mybatis-config.xml的配置檔案中的

<settings> 節點增加這個設定:<setting name="logImpl" value="STDOUT_LOGGING" />,這樣在執行到相應操作時,後臺就會把sql語句打印出來,方便我們查詢sql語句寫得是否正確了。