mybaits if標籤語句


Mybatis if 標籤可用在許多型別的 SQL 語句中,我們以查詢為例。首先看一個很普通的查詢:

<!-- 查詢使用者列表,like使用者名稱 -->  
<select id="getUserListLikeName" parameterType="User" resultMap="userResultMap">  
    SELECT * from user u   
WHERE u.username LIKE CONCAT(CONCAT('%', #{username}),'%')  
</select>  

但是當 username 或 sex 為 null 時,此語句很可能報錯或查詢結果為空。此時我們使用 if 動態 sql 語句先進行判斷,如果值為 null 或等於空字串,我們就不進行此條件的判斷,增加靈活性。

引數為實體類:User。將實體類中所有的屬性均進行判斷,如果不為空則執行判斷條件。

<!-- 新增 if(判斷引數) - 將實體類 User 不為空的屬性作為 where 條件 -->  
<select id="getUserList" resultMap="resultMap_User" parameterType="com.yiibai.pojo.User">  
    SELECT u.username,  
           u.password,  
           u.sex,  
           u.birthday,  
           u.photo,  
           u.score,  
           u.sign
      FROM user u   
     WHERE  
    <if test="username !=null ">  
        u.username LIKE CONCAT(CONCAT('%', #{username, jdbcType=VARCHAR}),'%')  
    </if>  
    <if test="sex!= null and sex != '' ">  
        AND u.sex = #{Sex, jdbcType=INTEGER}  
    </if>  
    <if test="birthday != null ">  
        AND u.birthday = #{birthday, jdbcType=DATE}  
    </if>  

    <if test="userId != null and userId != '' ">  
        AND id.user_id = #{userId, jdbcType=VARCHAR}  
    </if>   
</select> 

使用時比較靈活,建立新的一個這樣的實體類,我們需要限制那個條件,只需要附上相應的值就會 where 這個條件,相反不去賦值就可以不在 where 中判斷。

public void select_by_if() {  
    User user = new User();  
    user.setUsername("");  
    user.setSex(1);  
    user.setBirthday(DateUtil.parse("1990-08-18"));  
    List<User> userList = this.dynamicSqlMapper.getUserList_if(user);  
    for (user u : userList) {  
        System.out.println(u.toString());  
    }  
} 

我們再看看一下另一個範例,先來看看下面的程式碼:

<select id="dynamicIfTest" parameterType="Blog" resultType="Blog">
        select * from t_blog where 1 = 1
        <if test="title != null">
            and title = #{title}
        </if>
        <if test="content != null">
            and content = #{content}
        </if>
        <if test="owner != null">
            and owner = #{owner}
        </if>
    </select>
這條語句的意思非常簡單,如果提供了 title 引數,那麼就要滿足 title=#{title},同樣如果提供了 Content 和 Owner 的時候,它們也需要滿足相應的條件,之後就是返回滿足這些條件的所有 Blog,這是非常有用的一個功能,以往我們使用其他型別框架或者直接使用 JDBC 的時候, 如果我們要達到同樣的選擇效果的時候,我們就需要拼 SQL 語句,這是極其麻煩的,比起來,上述的動態SQL就比較簡單了。