3.5 bind元素
在进行模糊查询编写SQL语句时,如果使用“${}”进行字符串拼接时,则无法防止SQL注入问题;如果使用concat函数进行拼接,则只针对MySQL数据库有效;如果使用的是Oracle数据库,则要使用连接符号“||”。这样,映射文件的SQL就要根据不同的情况提供不同形式的实现,这显然是比较麻烦的,且不利于项目的移植。为此MyBatis框架提供<bind>元素来解决这个问题,可完全不必使用数据库语言,只使用MyBatis框架语言即可与所需参数连接。
MyBatis框架的<bind>元素可以通过OGNL表达式来创建一个上下文变量,其使用方式见示例33。
【示例33】 UserMapper.xml
上述配置代码中,使用<bind>元素定义了一个name为pattern_username的变量,<bind>元素中value的属性值就是拼接的查询字符串,其中_parameter.getUserName()表示传递进来的参数(也可以直接写成对应的参数变量名,如userName)。在SQL语句中,直接引用<bind>元素的name属性值即可进行动态SQL组装,见示例34。
【示例34】 UserMapper.java
为了验证上述配置是否能够被正确执行,可以在测试类MybatisTest中,编写测试方法findUserByNameTest()进行测试,其代码见示例35。
【示例35】 UserMapperTest.java
使用JUnit4执行findUserByNameTest()方法后,控制台的输出结果如下:
从运行结果可以看出,使用MyBatis框架的<bind>元素已经完成了动态SQL组装,并成功模糊查询出了用户信息。
本章总结
➢ MyBatis框架动态SQL基于OGNL的表达式,可方便地在SQL语句中实现某些逻辑。
➢ if+set:完成更新操作。
➢ if+where:完成多条件查询。
➢ if+trim:完成多条件查询(替代where)或者更新操作(替代set)。
➢ choose(when,otherwise):完成条件查询(多条件下,选择其一)。
➢ foreach:完成复杂查询,主要用于in条件查询的迭代集合,其中最关键的部分就是 collection属性,根据不同的入参类型,该属性值亦不同,具体内容如下。
①若入参对象为一个List实例时,collection属性值为list。
②若入参对象为一个数组时,collection属性值为array。
③若入参对象为多个,需要把它们封装为一个Map进行处理。
本章作业
—、选择题
1.以下不属于<foreach>元素中使用的属性是( )。
A.separator
B.collection
C.current
D.item
2.以下关于<foreach>元素中对属性的描述错误的是( )。
A.item:配置的是循环中当前的元素
B.index:配置的是当前元素在集合的位置下标
C.collection:配置的是传递过来的参数类型,它可以是一个array、list(或collection)、Map集合的键、POJO包装类中数组或集合类型的属性名等
D.separator:配置的是各个元素的间隔符
3.以下关于MyBatis框架中<set>元素的使用及说法正确的是( )。
A.<set>元素主要用于更新操作,其主要作用是在动态包含的SQL语句前输出一个set关键字,并将SQL语句中最后一个多余的逗号去除
B.使用MyBatis框架的<set>元素来更新操作时,前端需要传入所有参数字段,否则未传入字段会默认设置为空
C.在映射文件中使用<set>和<if>元素组合进行update语句动态SQL组装时,<set>元素内包含的内容可以都为空,<if>元素会进行判断处理
D.在映射文件进行更新操作时,只需要使用<set>元素就可以进行动态SQL组装
4.以下有关MyBatis框架动态SQL中的主要元素说法错误的是( )。
A.<if>元素用于单条件分支判断
B.<choose>元素(<when>元素、<otherwise>元素)用于多条件分支判断
C.<foreach>元素循环语句,常用于in条件语句等列举条件中
D.<bind>元素从OGNL表达式中创建一个变量,并将其绑定到上下文,只用于模糊查询的SQL中
5.使用MyBatis框架时,有如下代码:
若这段配置文件需要判断“title”字段是否为空,则可以填写在横线处的代码是( )。
A.<if test="title=null">
B.<if test="title !=null">
C.<if title!=null>
D.<if title="test !=null">
二、简答题
1.简述MyBatis框架动态SQL中的主要元素及说明。
2.简述MyBatis框架动态SQL中<foreach>元素的collection属性的注意事项。
三、操作题
使用动态SQL实现百货中心供应链管理系统中角色表(tb_role)的修改和查询操作,具体要求如下。
(1)使用元素if+set实现根据角色id修改角色信息的操作。
(2)使用元素if+trim实现根据角色名称模糊查询角色信息列表的操作。