• MyBatis:动态SQL


    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。

    示例如下:

    <choose>
      <when test="orderBy != null">
        ORDER BY tp."${orderBy}" #{trend}
      </when>
      <otherwise>
        ORDER BY tp.created DESC
      </otherwise>
    </choose>

    和 if else 逻辑一样

    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 的常见用法。

  • 相关阅读:
    【Vegas原创】读写cookies
    【Vegas原创】ComponentArt经典使用(饼图)
    【Vegas原创】SQL Server调用CDO发送邮件
    【Vegas原创】页面(图表+table+GridView)导出为excel(07125更新版)
    【Vegas原创】Procedure经典用法~(需配合DBAccess类)
    【Vegas原创】CDO发送邮件
    【Vegas原创】System.Net.Mail(.net2.0)或System.Web.Mail(.NET1.x) 发送邮件
    HTTP 500 内部服务器错误问题08.5.8Update
    【Vegas原创】Jmail发送邮件(Vegas Final版)2007年10月22日UPDATE:正文中图片的显示
    【Vegas原创】a href="#" onclick=""的一个小技巧
  • 原文地址:https://www.cnblogs.com/colin220/p/12000109.html
Copyright © 2020-2023  润新知