Java EE轻量级框架应用实战:SSM框架(Spring MVC+Spring+MyBatis)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.5 bind元素

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

MyBatis框架的<bind>元素可以通过OGNL表达式来创建一个上下文变量,其使用方式见示例33。

img【示例33】 UserMapper.xml

img

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

img【示例34】 UserMapper.java

img

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

img【示例35】 UserMapperTest.java

img

使用JUnit4执行findUserByNameTest()方法后,控制台的输出结果如下:

img

从运行结果可以看出,使用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框架时,有如下代码:

img

若这段配置文件需要判断“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实现根据角色名称模糊查询角色信息列表的操作。