10.2 MyBatis动态SQL 10.2.6 bind标签

10.2 MyBatis动态SQL 10.2.6 bind标签

bind标签元素可以从OGNL表达式创建一个变量并将其绑定到上下文。

实例

mapper接口方法

1
List<Employee> seletEmployeeLikeName(Employee employee);

Mapper.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- 测试bind属性 -->
<select
id="seletEmployeeLikeName"
resultType="domain.Employee">
<!-- 创建OGNL表达式并绑定到上下文的pattern属性中 -->
<!-- _parameter表示传递的Employee对象 -->
<!-- _parameter.getName()表示调用参数(Employee对象)的getName方法 -->
<!-- 两个下划线`__`是like子句的通配符,一个下划线可以匹配一个字符,两个下划线表示可以匹配两个字符 -->
<!-- like子句还有一个通配符%(百分号)这个通配符可以匹配任意多个字符 -->
<!-- 整个表达式表示匹配以_parameter.getName()获取到的员工名字开通,并且后面还有两个任意字符的字符串 -->
<bind
name="pattern"
value="_parameter.getName()+'__'"/>
<!-- 通过mybatis表达式获取上下文中的pattern属性值 -->
select * from tb_employee where loginname like #{pattern}
</select>

bind标签解释

创建OGNL表达式并绑定到上下文的pattern属性中

  • _parameter表示seletEmployeeLikeName方法传递的参数(Employee对象)
  • _parameter.getName()表示调用参数的getName方法,也就是,调用Employee对象的getName()方法
  • 两个下划线__like子句的通配符,
    • 一个下划线可以匹配一个字符,
    • 两个下划线表示可以匹配两个字符
    • like子句还有一个通配符%(百分号)这个通配符可以匹配任意多个字符
  • 整个表达式表示匹配以_parameter.getName()获取到的员工名字开头,并且后面还有两个任意字符的字符串

测试类

/MyDynamicSQLTest/src/test/BindTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class BindTest {
public static void main(String[] args)
{
SqlSession sqlSession = null;
// 1.获取SqlSession实例
sqlSession = SqlSessionFratoryTools.getSqlSession();
// 2.获取mapper接口的代理对象
EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
Employee find = new Employee();
find.setName("xiao");
List<Employee> employees = employeeMapper.seletEmployeeLikeName(find);
employees.forEach(employee -> System.out.println(" " + employee));
}
}

运行结果:

1
2
3
4
5
DEBUG [main] ==>  Preparing: select * from tb_employee where loginname like ? 
DEBUG [main] ==> Parameters: xiao__(String)
DEBUG [main] <== Total: 1
Employee [id=3, loginname=xiaoli, password=xiaoli, name=小丽, sex=女, age=23, phone=123456789123, sal=7800.0, state=active]

可以看到,程序已经成功查询出登录名以xiao开头,并且后面只有两个字符的员工.