学科分类
目录
SSM框架

<bind>元素

在进行模糊查询编写SQL语句的时候,如果使用“${}”进行字符串拼接,则无法防止SQL注入问题;如果使用concat函数进行拼接,则只针对MySQL数据库有效;如果使用的是Oracle数据库,则要使用连接符号“||”。这样,映射文件中的SQL就要根据不同的情况提供不同形式的实现,这显然是比较麻烦的,且不利于项目的移植。为此,MyBatis提供了<bind>元素来解决这一问题,我们完全不必使用数据库语言,只要使用MyBatis的语言即可与所需参数连接。

MyBatis的<bind>元素可以通过OGNL表达式来创建一个上下文变量,其使用方式如下:

<!--<bind>元素的使用:根据客户名模糊查询客户信息 -->
<select id="findCustomerByName" parameterType="com.itheima.po.Customer"
          resultType="com.itheima.po.Customer">
    <!--_parameter.getUsername()也可直接写成传入的字段属性名,即username-->            <bind name="pattern_username" 
                                value="'%'+_parameter.getUsername()+'%'" />
    select * from t_customer 
where 
    username like #{pattern_username}
</select>

上述配置代码中,使用<bind>元素定义了一个name为pattern_username的变量,<bind>元素中value的属性值就是拼接的查询字符串,其中_parameter.getUsername()表示传递进来的参数(也可以直接写成对应的参数变量名,如username)。在SQL语句中,直接引用<bind>元素的name属性值即可进行动态SQL组装。

为了验证上述配置是否能够正确执行,可以在测试类MybatisTest中,编写测试方法findCustomerByNameTest()进行测试,其代码如下所示。

/**
 * <bind>元素的使用:根据客户名模糊查询客户信息 
 */
@Test
public void findCustomerByNameTest(){
    // 通过工具类生成SqlSession对象
    SqlSession session = MybatisUtils.getSession();
    // 创建Customer对象,封装查询的条件
    Customer customer =new Customer();
    customer.setUsername("j");
    // 执行SqlSession的查询方法,返回结果集
    List<Customer> customers = session.selectList("com.itheima.mapper"
            + ".CustomerMapper.findCustomerByName", customer);
    // 输出查询结果信息    
    for (Customer customer2 : customers) {
        // 打印输出结果
        System.out.println(customer2);
    }
    // 关闭SqlSession
    session.close();
}

使用JUnit4执行findCustomerByNameTest()方法后,控制台的输出结果如图1所示。

图1 运行结果

从图1可以看出,使用MyBatis的<bind>元素已经完成了动态SQL组装,并成功模糊查询出了客户信息。

点击此处
隐藏目录