MyBatis 动态拼接Sql字符串的问题
程序员文章站
2024-03-31 21:13:46
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字符串的问题,希望对大家有所帮助
上一篇: MyBatis中#{}和${}的区别详解
推荐阅读
-
MyBatis 动态拼接Sql字符串的问题
-
MyBatis中动态sql的实现方法示例
-
详解MyBatis的getMapper()接口、resultMap标签、Alias别名、 尽量提取sql列、动态操作
-
MyBatis 动态拼接Sql字符串的问题
-
详解MyBatis的getMapper()接口、resultMap标签、Alias别名、 尽量提取sql列、动态操作
-
MyBatis使用动态SQL标签的小陷阱
-
Mybatis高级映射、动态SQL及获得自增主键的解析
-
MyBatis使用动态SQL标签的小陷阱
-
Mybatis高级映射、动态SQL及获得自增主键的解析
-
详解Java的MyBatis框架中动态SQL的基本用法