在进行模糊查询编写SQL语句的时候,如果使用“${}”进行字符串拼接,则无法防止SQL注入问题;
如果使用concat函数进行拼接,则只针对MySQL数据库有效;如果使用的是Oracle数据库,则要使用连接符号“||”。
这样,映射文件中的 SQL 就要根据不同的情况提供不同形式的实现,这显然是比较麻烦的,且不利于项目的移植。
为此,MyBatis提供了< bind>元素来解决这一问题,我们完全不必使用数据库语言,只要使用MyBatis的语言即可与所需参数连接。
代码
<select id="findCustomerByName" parameterType="com.po.Customer" resultType="com.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组装。
测试
/** * <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();
运行结果: