每個(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]