在Web开发中开发人员通常根据需求手动拼接SQL语句,这是一个及其麻烦的工作,而Mybatis提供了对SQL语句进行动态组装的功能,恰能解决这一问题。Mybatis的动态SQL元素与JSTL或XML文本处理器相似,常用< if >、< when >、< otherwise >、< trim >、< where >、< set >、< foreach >和< bind >等元素。
if元素
<!-- if元素根据条件动态查询用户信息 -->
<select id="selectUserByIf" resultType="tradition_user_package.MyUser" parameterType="tradition_user_package.MyUser">
select * from user where 1=1
<if test="uname!=null and uname!=''">
and uname like concat('%',#{uname},'%')
</if>
<if test="usex!=null and usex!=''">
and usex=#{usex}
</if>
</select>
choose、when、otherwise元素
<!-- 使用choose、when、otherwise元素根据条件动态查询用户信息 -->
<select id="selectUserByChoose" resultType="tradition_user_package.MyUser" parameterType="tradition_user_package.MyUser">
select * from user where 1=1
<choose>
<when test="uname!=null and uname!=''">
and uname like concat('%',#{uname},'%')
</when>
<when test="usex!=null and usex!=''">
and usex=#{usex}
</when>
<otherwise>
and uid > 10
</otherwise>
</choose>
</select>
trim元素
<!-- trim元素的主要功能是可以在自己包含的内容上加上某些前缀和后缀对应的属性是prefix,suffix,也可以把包含内容的首部或尾部某些内容忽略,对应的内容是perfixOverride,suffixOverride -->
<!-- 使用trim元素根据条件动态查询用户信息 -->
<select id="selectUserByTrim" resultType="tradition_user_package.MyUser" parameterType="tradition_user_package.MyUser">
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>
</select>
where元素
<!-- where元素的作用是会在where元素的地方输出一个where语句,另外一个好处是不需要考虑where元素里面的条件输出是什么样子的,mybatis会智能处理。如果所有的条件都不满足,那么mybatis会查出所有的记录。如果是and 或or开头的会被忽略,在where元素中不需要考虑空格的问题,mybatis会智能填上。-->
<!-- 使用where元素根据条件动态查询用户信息-->
<select id="selectUserByWhere" resultType="tradition_user_package.MyUser" parameterType="tradition_user_package.MyUser">
select * from user
<where>
<if test="uname!=null and uname !=''">
and uname like concat('%',#{uname},'%')
</if>
<if test="usex!=null and usex!=''">
and usex=#{usex}
</if>
</where>
</select>
set元素
<!-- 使用set元素动态修改一个用户 -->
<update id="updateUserBySet" parameterType="tradition_user_package.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>
update元素
<!-- 使用set元素动态修改一个用户 -->
<update id="updateUserBySet" parameterType="tradition_user_package.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指定一个名字 -->
<select id="selectUserByForeach" resultType="tradition_user_package.MyUser" parameterType="java.util.List">
select * from user where uid in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
bind元素
<!-- 如果${}拼接字符串,则无法防止SQL注入问题;如果使用字符串拼接函数或连接符号,但不同数据库的拼凑函数或连接符号都不同,这样SQL映射文件就需要根据不同的数据库提供不同的实现,显然比较麻烦,且不利于代码的移植。幸运的是,Mybatis提供了bind元素来解决这一问题。 -->
<!-- 使用bind元素进行模糊查询-->
<select id="selectUserByBind" resultType="tradition_user_package.MyUser" parameterType="tradition_user_package.MyUser">
<!-- bind中的uname是MyUser中的属性名 -->
<bind name="paran_uname" value="'%'+uname+'%'"/>
select * from user where uname like #{paran_uname}
</select