MyBatis bind标签

1年前 (2024-04-27)
每个数据库的拼接函数或连接符号都不同,例如 MySQL 的 concat 函数、Oracle 的连接符号“||”等。这样 SQL 映射文件就需要根据不同的数据库提供不同的实现,显然比较麻烦,且不利于代码的移植。幸运的是,MyBatis 提供了 bind 标签来解决这一问题。

bind 标签可以通过 OGNL 表达式自定义一个上下文变量。

比如,按照网站名称进行模糊查询,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:对应传入实体类的某个字段,可以进行字符串拼接等特殊处理。

  • name:给对应参数取的别名。


以上代码中的“_parameter”代表传递进来的参数,它和通配符连接后,赋给了 pattern,然后就可以在 select 语句中使用这个变量进行模糊查询,不管是 MySQL 数据库还是 Oracle 数据库都可以使用这样的语句,提高了可移植性。

大部分情况下需要传递多个参数,下面为传递多个参数时 bind 的用法示例。

示例

本节示例基于《个MyBatis程序》一节的代码实现。

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>

测试代码如下。

public class Test {

public static void main(String[] args) throws IOException {

// 读取配置文件mybatis-config.xml

InputStream config = Resources.getResourceAsStream("mybatis-config.xml"); // 根据配置文件构建

SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);

// 通过SqlSessionFactory创建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);

}

}

}

运行结果如下。

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=https://www.biancheng网站站点" rel="nofollow" />