闻与MyBatis之MyBatis标签

本文内容如有错误、不足之处,欢迎技术爱好者们一同探讨,在本文下面讨论区留言,感谢。欢迎转载,转载请注明出处(https://blog.csdn.net/feng_xiaoshi/article/details/105903135),谢谢。

简介

“How painful it is to conditionally concatenate strings of SQL together, making sure not to forget spaces or to omit a comma at the end of a list of columns. Dynamic SQL can be downright painful to deal with.”

Mybatis

操作 SQL
select

参数名称格式
定义参数名称的方法有以下三种:

  • #{id} mybatis风格
  • :id JPA风格
  • ? JDBC风格
    注意:它们不能混用,只能是一种类型的语句。
<select id="users-hash">
  select id, name from User where id = #{id} or name like #{name}
</select>

<select id="users-dot">
  select id, name from User where id = :id or name like :name
</select>

<select id="users-question">
  select id, name from User where id = ? or name like ?
</select>
insert

一个 insert 标签可以与几个 if 标签配合使用,用来区分不同的条件。

<insert id="insertUser" type="NATIVE">
  insert into User
  <if
    test="username != null and password != null and email != null and bio != null">
    (username,password,email,bio) values (#{id},#{username},#{password},#{email},#{bio})
  </if>
  <if
    test="username != null and password != null and email != null and bio == null">
    (username,password,email) values (#{id},#{username},#{password},#{email})
  </if>
  <if
    test="username != null and password != null and email == null and bio == null">
    (username,password) values (#{id},#{username})
  </if>
</insert>
delete

delete 标签和 insert 标签一样,可以通过配合 if 标签来使用,但是一般是通过 where 语句固定查询。

<delete id="deleteAuthor" type="NATIVE">
  delete from Author where id = #{id}
</delete>
update

update 标签可以与几个 if 标签使用,当要更新多列时,必须使用 set 标签。

<update id="updateUser" type="NATIVE">
  update User
  <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>
动态 SQL

mybatis 的动态sql语句是基于OGNL表达式的。可以方便的在 sql 语句中实现某些逻辑. 总体 mybatis 动态 SQL 语句主要有以下几类:

序号标签作用
1if简单的条件判断
2choose,when,otherwise相当于 java 语言中的 switch ,与 jstl 中的choose 类似.
3trim对包含的內容加上 prefix(前缀),或者 suffix(后缀)
4where主要是用來简化 sql 语句中 where 条件判断的,能智能的处理 and or ,不必担心多余致语法错误
5set主要用于更新时
6foreach在实现 mybatis in 语句查询时特别有用
if

if 标记是最常使用的标记,它可能在查询,删除,更新时使用,必须与 test 属性结合使用,用来判断 if 标签中的验证条件是 true 或 false,是基于 OGNL 的表达式,当条件为 true 时,SQL 语句将附加到主查询。例如下面语句中:

<select id="selectUser" type="JPQL">
  select id, name from User
  <if test="name != null">
    where name like #{name}
  </if>
</select>

如果 name 是 null ,则执行下面 sql 语句:

select id, name from User where name like #{name}
choose, when, otherwise

当需要在许多选项中仅选择一种情况时,必须使用 choose 标签。一般配合 when,otherwise 标签使用:

<select id="selectUser" type="JPQL">
  select id, name from User
  <where>
    <if test="name != null">
      AND name = #{name}
    </if>
    <if test="password != null">
      AND password = #{password}
    </if>
    <choose>
      <when test="email != null">
        AND email = #{email}
      </when>
      <when test="username != null">
        AND username like #{username}
      </when>
      <otherwise>
        AND status = 1
      </otherwise>
    </choose>
    <if test="age != null">
      AND age = #{age}
    </if>
  </where>
</select>
  • 标签允许定义适用于多个选项之一的条件。
  • 满足 标签中指定的条件时,S​​QL附加到主查询。
  • 如果不满足所有其他条件,将 标签 SQL附加到主查询。

choose when otherwise 标签帮助开发者实现了类似 if else,switch case default 的实现。

trim

trim 标签一般用于去除 sql 语句中多余的 and 关键字,逗号,或者给 sql 语句前拼接 “where“、“set“ 以及 “values(“ 等前缀,或者添加 “)“ 等后缀,可用于选择性插入、更新、删除或者条件查询等操作,格式化输出。

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

上面的 trim 表示的是要在所包含的 SQL 语句前面添加 WHERE 关键字,同时去除 sql 语句前面的 AND 或 OR 关键字。

trim 标签的4大属性:

  • prefix: 当 trim 元素包含有内容时, 增加 prefix 所指定的前缀
  • prefixOverrides: 当 trim 元素包含有内容时, 去除 prefixOverrides 指定的 前缀
  • suffix: 当 trim 元素包含有内容时, 增加 suffix 所指定的后缀
  • suffixOverrides: 当 trim 元素包含有内容时, 去除 suffixOverrides 指定的后缀
where

where 主要是用来简化 sql 语句中 where 条件判断,自动地处理 AND或OR 条件,可以动态的将第一个符合条件( if 标签中的验证条件是 true )的 sql 语句附加到主查询。

<select id="selectUser" type="JPQL">
  select id, name from User
  <where>
    <if test="username != null">
      and username = #{username}
    </if>
    <if test="password != null">
      and password = #{password}
    </if>
    <if test="email != null">
      or email = #{email}
    </if>
  </where>
</select>

如果 state 不是 null , 那么将 and state = #{state} 添加到主查询上。

select id, name from Groups and state = #{state}
set

set 标签可动态包含要更新的列,而忽略其他列,使用set标签可以将动态的配置 SET 关键字,并剔除追加到条件末尾的任何不相关的逗号。

<update id="updateUser" type="NATIVE">
  update User
  <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>

在第一个符合条件( if 标签中的验证条件是 true )语句前输出一个 set,然后如果包含的语句是以逗号结束的话将会把该逗号忽略,如果 set 包含的内容为空的话则会出错。有了 set 元素就可以动态的更新那些修改了的字段。

foreach
 <select id="selectUser" resultType="sample.mybatis.User">
    select *
      from User
     where id in
     <foreach collection="list" item="item"
              open="(" separator="," close=")">
       #{item}
     </foreach>
  </select>

标签允许在遍历集合时编写SQL
collection 指定要遍历属性的集合
list 是一个引用名称,可将迭代对象传递给参数,则默认情况下可以使用该引用名称
item 声明一个临时变量名称,该名称引用属性中迭代的每个元素。
open 该属性指定要添加到迭代开始的字符串。
separator 该属性指定在每个迭代结果之间插入的字符串。
close 该属性指定要添加到迭代末尾的字符串。
index 还有一个属性,因此您可以声明一个临时变量名称以引用重复的索引值。主要用于IN子句的动态生成

总结

在本文中,简单介绍了 MyBatis 的标签,MyBatis 提供的不同功能如:查询、更新、删除、新增。以及动态 SQL 的标签开发。

参考资料

MyBatis Dynamic SQL(MyBatis 动态SQL

Dynamic SQL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值