Mybatis 动态SQL实现
动态SQL介绍
动态SQL是Mybatis的强大特性之一,可以简化根据不同条件使用不同SQL的操作,并自动去除不需要的关键字。在Mybatis3中引入了OGNL表达式,使学习元素种类的过程变得简易。
动态SQL使用
if 元素
<select id="findActivePersonLike" resultType="Person">
SELECT * FROM Person WHERE state = ‘ACTIVE’
<if test="name != null">
AND name like #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</select>
choose、when、otherwise 元素
<select id="findActivePersonLike" resultType="Person">
SELECT * FROM Person WHERE state = ‘ACTIVE’
<choose>
<when test="name != null">
AND name like #{name}
</when>
<when test="age != null">
AND age = #{age}
</when>
<otherwise>
AND phone_number != null
</otherwise>
</choose>
</select>
trim、where、set 元素
<select id="findActivePersonLike" resultType="Person">
SELECT * FROM Person
<where>
<if test="name != null">
name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
<if test="birthdayYear != null">
AND YEAR(birthday) = #{birthdayYear}
</if>
</where>
</select>
where元素只会在子元素返回任何内容的情况下才插入“WHERE”子句。而且,若子句的开头为“AND”或“OR”,where元素也会将它们去除。
如where元素无法满足要求,可以用trim定制where元素的功能,使之更加灵活。
<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>
以上trim元素的定义,等同于where元素的效果。prefixOverrides属性会忽略通过管道符分隔的文本序列,该属性中的值会被移除,并且插入prefix属性中指定的内容。
set语句用于动态生成数据库更新SQL,如下:
<update id="updatePersonIfNecessary">
update Person
<set>
<if test="name != null">name=#{name},</if>
<if test="age != null">age=#{age},</if>
<if test="phoneNumber != null">phone_number=#{phoneNumber},</if>
<if test="birthday != null">birthday=#{birthday}</if>
</set>
where id=#{id}
</update>
set元素会动态在首行加入set关键字,并去除if标签不满足要求时的尾部逗号。同样,set元素也可以被trim元素等价替换,如下:
<trim prefix="SET" suffixOverrides=",">
...
</trim>
foreach 元素
<select id="selectPersonNameIn" resultType="Person">
SELECT * FROM Person
<where>
<foreach item