God's blog
梦只在昨天,今天仍需努力
【免费公开课】Gulp前端自动化教程 走进VR开发世界——我们离开发一款VR大作还有多远? CSDN发福利啦!C币、京东卡、现金任你选 关闭MyBatis动态SQL
标签: blogemailsqlnull优化 2011-08-03 23:32 18211人阅读 评论(2) 收藏 举报 分类: 作者同类文章X版权声明:本文为博主原创文章,未经博主允许不得转载。
动态SQLMyBatis的动态SQL,解决了SQL字符串拼接的痛苦。
1.if
- <select id="findActiveBlogWithTitleLike"
- parameterType="Blog" resultType="Blog">
- SELECT * FROM BLOG
- WHERE state = 'ACTIVE'
- <if test="title != null">
- AND title like #{title}
- </if>
- </select>
这条一句会提供一个可选的文本查找功能。如果没有传递title,那么所有激活的博客都会被返回。
如果传递了title,那么就会查找相近的title。
2.choose,when,otherwise
- <select id="findActiveBlogLike"
- parameterType="BLOG" resultType="BLOG">
- SELECT * FROM BLOG
- WHERE
- <choose>
- <when test="title != null">
- AND title like #{title}
- </when>
- <when test="author != null and author.name != null">
- AND title like #{author.name}
- </when>
- <otherwise>
- AND featured = 1
- </otherwise>
- </choose>
- </select>
注:如果上述条件都没有匹配,则会变成SELECT * FROM BLOG WHERE
如果仅有第二个匹配,则会变成SELECT * FROM BLOG WHERE AND title LIKE somelike
显然这样会查询失败。要解决这个问题,mybatis提供了解决方法。
- <select id="findActiveBlogLike"
- parameterType="BLOG" resultType="BLOG">
- SELECT * FROM BLOG
- WHERE
- <trim prefix="WHERE" prefixOverrides="AND |OR ">
- <choose>
- <when test="title != null">
- AND title like #{title}
- </when>
- <when test="author != null and author.name != null">
- AND title like #{author.name}
- </when>
- <otherwise>
- AND featured = 1
- </otherwise>
- </choose>
- </trim>
- </select>
overrides属性采用管道文本分隔符来覆盖,这里的空白是重要的。它的结果就是移除在InnerText中overrides中指定的内容。
3.set
- <update id="updateAuthorIfNecessary"
- parameterType="Author">
- update Author
- <set>
- <if test="username != null">username=#{username},</if>
- <if test="password != null">password=#{password},</if>
- <if test="email != null">email=#{email}</if>
- </set>
- where id=#{id}
- </update>
同上的问题,优化后:
- <update id="updateAuthorIfNecessary"
- parameterType="Author">
- update Author
- <trim prefix="where" prefixOverrides=",">
- <set>
- <if test="username != null">username=#{username},</if>
- <if test="password != null">password=#{password},</if>
- <if test="email != null">email=#{email}</if>
- </set>
- where id=#{id}
- </trim>
- </update>