动态SQL
可以根据具体的参数条件,来对SQL语句进行动态拼接。
比如在以前的开发中,由于不确定查询参数是否存在,许多人会使用类似于where 1 = 1
来作为前缀,然后后面用AND
拼接要查询的参数,这样,就算要查询的参数为空,也能够正确执行查询,如果不加1 = 1,则如果查询参数为空,SQL语句就会变成SELECT * FROM student where
,SQL不合法。
mybatis里的动态标签主要有
if
<!-- 示例 -->
<select id="find" resultType="student" parameterType="student">
SELECT * FROM student WHERE age >= 18
<if test="name != null and name != ''">
AND name like '%${name}%'
</if>
</select>
当满足test条件时,才会将<if>
标签内的SQL语句拼接上去。
choose
<!-- choose 和 when , otherwise 是配套标签
类似于java中的switch,只会选中满足条件的一个
-->
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
sql
<!-- List<User> findByList(List<Integer> list); -->
<select id="findByList" resultType="com.xia.domo.User" parameterType="java.util.List">
SELECT * FROM user
<include refid="rnm"></include>
</select>
<sql id="rnm">
<where>
<if test="list != null and list.size() > 0">
AND id in
<foreach collection="list" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</if>
</where>
</sql>
-
trim
-
where
<where>
标签只会在至少有一个子元素返回了SQL语句时, 才会向SQL语句中添加WHERE,并且如果WHERE之后是以AND或OR开头,会自动将其删掉。
<select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG <where> <if test="state != null"> state = #{state} </if> <if test="title != null"> AND title like #{title} </if> <if test="author != null and author.name != null"> AND author_name like #{author.name} </if> </where> </select>
<where>
标签可以用<trim>
标签代替<trim prefix="WHERE" prefixOverrides="AND | OR"> ... </trim>
set
在至少有一个子元素返回了SQL语句时,才会向SQL语句中添加
SET
,并且如果SET之后是以,
开头的话,会自动将其删掉<set>
标签相当于如下的<trim>
标签<trim prefix="SET" prefixOverrides=","> ... </trim>
bind
mybatis的动态SQL都是用
OGNL表达式
进行解析的,如果需要创建OGNL表达式以外的变量,可以用bind
标签。<select id="selectBlogsLike" resultType="Blog"> <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" /> SELECT * FROM BLOG WHERE title LIKE #{pattern} </select>
-
foreach
见博主之前的博文 mybatis之foreach。
-
相关文章
暂无评论...