MyBatis where標(biāo)簽

細心的讀者可能會發(fā)現(xiàn),我們在《MyBatis choose、when和otherwise語句》一節(jié)的 SQL 語句中加入了一個條件“1=1”,如果沒有加入這個條件,那么可能就會變成下面這樣一條錯誤的語句。

SELECT id,name,url,age,country FROM website AND name LIKE CONCAT('%',#{name},'%')
                

顯然以上語句會出現(xiàn) SQL 語法異常,但加入“1=1”這樣的條件又非常奇怪,所以 MyBatis 提供了 where 標(biāo)簽。

where 標(biāo)簽主要用來簡化 SQL 語句中的條件判斷,可以自動處理 AND/OR 條件,語法如下。

<where>
    <if test="判斷條件">
        AND/OR ...
    </if>
</where>
                

if 語句中判斷條件為 true 時,where 關(guān)鍵字才會加入到組裝的 SQL 里面,否則就不加入。where 會檢索語句,它會將 where 后的第一個 SQL 條件語句的 AND 或者 OR 關(guān)鍵詞去掉。

示例

要求:根據(jù)網(wǎng)站名稱或網(wǎng)址對網(wǎng)站進行模糊查詢(本節(jié)示例基于《第一個MyBatis程序》一節(jié)的代碼實現(xiàn))。

WebsiteMapper.xml 代碼如下。

<select id="selectWebsite" resultType="net.biancheng.po.Website">
    select id,name,url from website
    <where>
        <if test="name != null">
            AND name like #{name}
        </if>
        <if test="url!= null">
            AND url like #{url}
        </if>
    </where>
</select>
                

WebsiteMapper 類中方法如下。

public List<Website> selectWebsite(Website website);
                

測試類代碼如下。

public class Test {
    public static void main(String[] args) throws IOException {
        // 讀取配置文件mybatis-config.xml
        InputStream config = Resources.getResourceAsStream("mybatis-config.xml"); // 根據(jù)配置文件構(gòu)建
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
        // 通過SqlSessionFactory創(chuàng)建SqlSession
        SqlSession ss = ssf.openSession();
        Website site = new Website();
        site.setname("編程");
        List<Website> siteList = ss.selectList("net.biancheng.mapper.WebsiteMapper.selectWebsite", site);
        for (Website ws : siteList) {
            System.out.println(ws);
        }
    }
}
                

輸出結(jié)果如下。

DEBUG [main] - ==>  Preparing: SELECT id,name,url,age,country FROM website WHERE  name LIKE CONCAT('%',?,'%')
DEBUG [main] - ==> Parameters: 編程(String)
DEBUG [main] - <==      Total: 1
Website[id=1,name=編程幫,url=http://www.soo66.com/,age=10,country=CN]
                
丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清