MyBatis:动态SQL

Justagreenonion 2019-12-07

MyBatis 的真正强大之处在于它的映射语句,这也是它的魔力所在。由于它的映射语句异常强大,映射器的 XML 文件就显得相对简单。

在 XML 中添加一个 select 元素,写一个查询的 SQL,再做一些简单的配置,就可以将查询的结果直接映射到对象中。

select

select 标签的常用属性有:id 命名空间中这条 SQL 的唯一标识;parameterType 将要传入这条语句的参数类的完全限定名或别名,可选,MyBatis 可以通过类型处理器推断出具体传入语句的参数;resultType 这条语句中返回的期望的类型的完全限定名或别名,如果返回的是集合那就应该设置为集合包含的类型;resultMap 外部 resultMap 的命名引用,注意 resultType 和 resultMap 只能选其一,不能同时使用。

insert

插入数据可以用 insert 元素,常用的属性有:parameterType 将要传入语句的参数的完全限定类名或别名;useGeneratedKeys 仅对 insert 和 update 有用,这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键;keyProperty 仅对 insert 和 update 有用,唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者 insert 语句 selectKey 子元素设置它的键值。如果插入数据后返回主键,可以在 insert 标签中加上如下属性。

<insert id="insertUser" parameterType="com.company.User" useGeneratedKeys="true" keyProperty="id">

update

更新数据可以用 update 元素,常用的属性有 id parameterType

delete

删除数据可以用 delete 元素,常用的属性有 id 和 parameterType

如果有多个传入参数,需要在接口中给参数配置 @Param 注解,MyBatis 就会自动将参数封装成 Map 类型,@Param 注解值会作为 Map 中的 key,因此在 SQL 部分就可以通过 配置的注解值来使用参数。如果是单个参数不用加这个注解。实际上,XML 可以用的参数只有 0 1 或者 param1 param2。

MyBatis 的强大动态 SQL 可以让我们在根据不同条件拼接 SQL 语句时更加方便。MyBatis 的动态 SQL 在 XML 中支持如下几种标签:

if

if 标签通常用于 where 语句中,通过判断参数值来决定是否使用某个条件。if 标签有一个必填的属性 test,其属性值是一个符合 OGNL 要求的判断表达式。

choose when otherwise

choose when otherwise 标签是用来实现 if ... else if ... else 这样的逻辑。choose 包含 when 和 otherwise 两个标签,一个 choose 中至少有一个 when,有 0 个或 1 个 otherwise。

where

where 标签的作用是,如果该标签包含的元素中有返回值,就插入一个 where,如果 where 后面的字符串是以 and 和 or 开头的,就将它们剔除。

set

set 标签的作用是,如果该标签包含的元素中有返回值,就插入一个 set,如果 set 后面的字符串是以逗号结尾的,就将这个逗号剔除。

trim

trim 标签可以实现 where 和 set 标签的功能,where 和 set 这两个标签在底层就是通过 TrimSqlNode 实现的。

where 标签对应 trim 的实现如下:

<trim prefix="WHRER" prefixOverrides="AND | OR">...</trim>

set 标签对应的 trim 实现如下:

<trim prefix="SET" suffixOverrides=",">...</trim>

trim 标签有如下属性,prefix 当 trim 元素内包含内容时,会给内容增加 prefix 指定前缀;prefixOverrides 当 trim 元素内包含内容时,会把内容中匹配的前缀字符串去掉;suffix 当 trim 元素内包含内容时,会给内容增加 suffix 指定的后缀;suffixOverrides 当 trim 元素内包含内容时,会把内容中匹配的后缀字符串去掉。

foreach

foreach 可以对数组 map 或者实现了 Iterable 接口的对象进行遍历。包含以下属性,collection 必填,其值为要迭代循环的属性名;item 变量名,值为从迭代对象中取出的每一个值;index 索引属性值,如果迭代对象是 map,那这个值是 map 的 key;open 整个循环内容开头的字符串;close 整个循环内容结尾的字符串;separator 每次循环的分隔符。

<foreach collection="list" open="(" close=")" separator="," item="id" index="i"> #{id} </foreach>

bind

bind 标签可以使用 OGNL 表达式创建一个变量并将其绑定到上下文中。

<if test="userName != null and userName != ‘ ‘">

  <bind name="userNameLike" value="‘%‘ + userName + ‘%‘"/>

  and user_name like #{userNameLike}

</if>

以上就是 MyBatis 中动态 SQL 的常见用法。

相关推荐