欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MyBatis 动态拼接Sql字符串的问题

程序员文章站 2024-03-13 14:11:51
mybatis 的一个强大的特性之一通常是它的动态 sql 能力。如果你有使用 jdbc 或其他 相似框架的经验,你就明白条件地串联 sql 字符串在一起是多么的痛苦,确保...

mybatis 的一个强大的特性之一通常是它的动态 sql 能力。如果你有使用 jdbc 或其他 相似框架的经验,你就明白条件地串联 sql 字符串在一起是多么的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态 sql 可以彻底处理这种痛苦。

动态sql

mybatis的动态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>

以上所述是小编给大家介绍的mybatis 动态拼接sql字符串的问题,希望对大家有所帮助