MyBatis where標籤語句


當 where 中的條件使用的 if 標籤較多時,這樣的組合可能會導致錯誤。當 java 程式碼按如下方法呼叫時:

@Test  
public void select_test_where() {  
    User user = new User();  
    user.setUsername(null);  
    user.setSex(1);  
    List<User> userList = this.dynamicSqlMapper.getUsertList_where(user);  
    for (User u : userList ) {  
        System.out.println(u.toString());  
    }  
}  

如果上面例子,引數 username 為 null,將不會進行 username 的判斷,則會直接導「WHERE AND」關鍵字多餘的錯誤 SQL。

這時可以使用 where 動態語句來解決。「where」標籤會知道如果它包含的標籤中有返回值的話,它就插入一個‘where’。此外,如果標籤返回的內容是以 AND 或OR 開頭的,則它會剔除掉。

上面例子修改為:

<select id="getUserList_whereIf" resultMap="resultMap_User" parameterType="com.yiibai.pojo.User">  
    SELECT u.user_id,  
           u.username,  
           u.sex,  
           u.birthday 
      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> 
    </where>    
</select>  

where 主要是用來簡化 sql 語句中 where 條件判斷,自動地處理 AND/OR 條件。

<select id="dynamicWhereTest" parameterType="Blog" resultType="Blog">
        select * from t_blog 
        <where>
            <if test="title != null">
                title = #{title}
            </if>
            <if test="content != null">
                and content = #{content}
            </if>
            <if test="owner != null">
                and owner = #{owner}
            </if>
        </where>
    </select>

where 元素的作用是會在寫入 where 元素的地方輸出一個 where,另外一個好處是你不需要考慮 where 元素裡面的條件輸出是什麼樣子的,MyBatis 會智慧的幫處理,如果所有的條件都不滿足那麼 MyBatis 就會查出所有的記錄,如果輸出後是 and 開頭的,MyBatis 會把第一個and忽略,當然如果是 or 開頭的,MyBatis 也會把它忽略;此外,在 where 元素中你不需要考慮空格的問題,MyBatis 會智慧的幫你加上。像上述例子中,如果 title=null, 而 content != null,那麼輸出的整個語句會是 select * from t_blog where content = #{content},而不是 select * from t_blog where and content = #{content},因為 MyBatis 會自動地把首個 and / or 給忽略。