MyBatis bind標(biāo)簽

每個(gè)數(shù)據(jù)庫的拼接函數(shù)或連接符號都不同,例如 MySQL 的 concat 函數(shù)、Oracle 的連接符號“||”等。這樣 SQL 映射文件就需要根據(jù)不同的數(shù)據(jù)庫提供不同的實(shí)現(xiàn),顯然比較麻煩,且不利于代碼的移植。幸運(yùn)的是,MyBatis 提供了 bind 標(biāo)簽來解決這一問題。

bind 標(biāo)簽可以通過 OGNL 表達(dá)式自定義一個(gè)上下文變量。

比如,按照網(wǎng)站名稱進(jìn)行模糊查詢,SQL 映射文件如下。

<select id="selectWebsite" resultType="net.biancheng.po.Website">
    <bind name="pattern" value="'%'+_parameter+'%'" />
    SELECT id,name,url,age,country
    FROM website
    WHERE name like #{pattern}
</select>
                

bind 元素屬性如下。

  • value:對應(yīng)傳入實(shí)體類的某個(gè)字段,可以進(jìn)行字符串拼接等特殊處理。

  • name:給對應(yīng)參數(shù)取的別名。

以上代碼中的“_parameter”代表傳遞進(jìn)來的參數(shù),它和通配符連接后,賦給了 pattern,然后就可以在 select 語句中使用這個(gè)變量進(jìn)行模糊查詢,不管是 MySQL 數(shù)據(jù)庫還是 Oracle 數(shù)據(jù)庫都可以使用這樣的語句,提高了可移植性。

大部分情況下需要傳遞多個(gè)參數(shù),下面為傳遞多個(gè)參數(shù)時(shí) bind 的用法示例。

示例

本節(jié)示例基于《第一個(gè)MyBatis程序》一節(jié)的代碼實(shí)現(xiàn)。

WebsiteMapper 類中方法代碼如下。

public List<Website> selectWebsite(Website site);
                

SQL 映射文件代碼如下。

<select id="selectWebsite" resultType="net.biancheng.po.Website">
    <bind name="pattern_name" value="'%'+name+'%'" />
    <bind name="pattern_url" value="'%'+url+'%'" />
    SELECT id,name,url,age,country
    FROM website
    WHERE name like #{pattern_name}
    AND url like #{pattern_url}
</select>
                

WebsiteMapper 類中相應(yīng)方法如下。

public List<Website> selectWebsite(List<Integer> ageList);
                

測試代碼如下。

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("編程");
        site.setUrl("http");
        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 ? AND url like ?
DEBUG [main] - ==> Parameters: %編程%(String), %http%(String)
DEBUG [main] - <==      Total: 1
Website[id=1,name=編程幫,url=http://www.soo66.com/,age=10,country=CN]
                
丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清