Mybatis学习八 (动态SQL语句)
1.概述
MyBatis 的强大特性之一便是它的动态 SQL。
如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。
拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。
利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL
语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。
动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。
在 MyBatis 之前的版本中,有很多的元素需要来了解。
MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。
MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。
2.分类
mybatis 的动态sql语句是基于OGNL表达式的。可以方便的在 sql 语句中实现某些逻辑.
总体说来mybatis 动态SQL 语句主要有以下几类:
第一类:if 语句 (简单的条件判断)
第二类:choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似.
第三类:trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)
第四类:where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or ,不必担心多余导致语法错误
第五类:set (主要用于更新时)
第六类:foreach (在实现 mybatis in 语句查询时特别有用)
3.if
4.choose, when, otherwise
5.trim, where, set
6.foreach
7.bind
8.Multi-db vendor support
9.动态 SQL 中可插拔的脚本语言
public interface LanguageDriver {
ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql);
SqlSource createSqlSource(Configuration configuration, XNode script, Class<?> parameterType);
SqlSource createSqlSource(Configuration configuration, String script, Class<?> parameterType);
}
一旦有了自定义的语言驱动,你就可以在 mybatis-config.xml 文件中将它设置为默认语言:
<typeAliases>
<typeAlias type="org.sample.MyLanguageDriver" alias="myLanguage"/>
</typeAliases>
<settings>
<setting name="defaultScriptingLanguage" value="myLanguage"/>
</settings>
除了设置默认语言,你也可以针对特殊的语句指定特定语言,这可以通过如下的 lang 属性来完成:
<select id="selectBlog" lang="myLanguage"> SELECT * FROM BLOG </select>
或者在你正在使用的映射中加上注解 @Lang 来完成:
public interface Mapper {
@Lang(MyLanguageDriver.class)
@Select("SELECT * FROM BLOG")
List<Blog> selectBlog();
}
学习来源:https://www.yiibai.com/mybatis/mybatis-dynamic-sql.html#article-start