动态SQL
动态SQL
< if>
类似于JAVA中的if语句,用法示例如下:
<if test="uname != null and uname != ''">uname = #{uname},</if>
< choose>,< when>,< otherwise>
类似于JAVA中的switch语句,用法示例如下:
<choose>
<when test="usex!=null and usex!=''">
#{usex}
</when>
<otherwise>
'男'
</otherwise>
</choose>
< trim>,< where>,< set>
< trim>元素的主要功能是可以在自己包含的内容加上某些前缀,也可以在其后加上某些后缀,与之对应的是prefix和suffix;可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性为prefixOverrides和suffixOverrides。正因为有这样的功能,所以可以很简单的使用其代替< where>元素。
代码示例如下:
select * from user
<trim prefix = "where" prefixOverrides = "and | or">
<if test = "uname != null and uname != ''">
and uname like concat('%',#{uname},'%')
</if>
<if test = "usex != null and usex !=''">
and usex = #{usex}
</if>
</trim>
< where>
where元素是会在写入where元素的地方输出一个where,另外一个好处是不需要考虑where元素里面的条件输出是什么样子的MyBatis将会只能处理。如果所有条件不满足,那么MyBatis就会查出所有记录,如果输出后是以and开头,MyBatis会把第一个and忽略,当然如果是以or开头的,MyBatis也会把它忽略;此外,在where中不需要靠考虑空格问题MyBatis将会自动加上。
代码示例如下:
select * from user
<where>
<foreach collection="list" item="lastname" separator="or">
uname like concat(#{lastname},'%')
</foreach>
</where>
< set>
在动态update可以使用set来动态更新列。
代码示例如下:
<update id="updateUser" parameterType="po.MyUser">
update user
<set>
<if test="uname != null and uname != ''">uname = #{uname},</if>
<if test="usex !=null and usex !=''">usex = #{usex}</if>
</set>
where uid = #{uid}
</update>
< foreach>
foreach元素主要用在构建in条件中,它可以在SQL语句中迭代一个集合。foreach元素的属性主要有item、index、collection、open、separator、close。item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束。在使用foreach元素时,最关键、最容易出错的时collection属性,该属性时必选的,但在不同的情况下该属性的值是不一样的,主要有以下3种清空:
- 如果传入的是单参数且参数类型是一个List,collection属性值为list。
- 如果传入的单参数且参数类型是一个array数组,collection的属性值为array。
- 如果传入的参数是多个,需要把他们封装成一个Map,当然单参数也可以封装成Map。Map的key是参数名,collection属性值是传入的LIst或array对象在自己封装的Map种的key
代码示例如下:
<foreach collection="list" item="lastname" separator="or">
uname like concat(#{lastname},'%')
</foreach>
< bind>
在进行模糊查询时,如果使用${}拼接字符串,则无法仿制SQL诸如问题;如果使用字符串拼接函数或连接符号,但不同的数据库的拼接函数或连接符号不同,SQL文件就需要根据不同的数据库提供不同的实现,显然比较麻烦,且不利于代码移植,因此bind便是解决这一问题。
代码示例如下:
<select id="selectUser3" parameterType="list" resultType="po.MyUser">
select * from user
<where>
<foreach collection="list" item="lastname" separator="or">
<bind name="last_name" value="last_name+'%'"/>
uname like #{last_name}
</foreach>
</where>
</select>
参考教材《JavaEE框架整合开发入门到实战》侵删。
本人现役大三小白一枚,如有不足之处还望指正。

浙公网安备 33010602011771号