首页 > 数据库 >Mybatis动态SQL

Mybatis动态SQL

时间:2023-02-13 13:57:16浏览次数:31  
标签:元素 like title author BLOG SQL Mybatis 动态 where

动态 SQL

  • if
  • choose (when, otherwise)
  • where
  • trim
  • set
  • foreach

if

动态 SQL 通常要做的事情是有条件地包含 where 子句的一部分。比如:

复制代码
<select id="findActiveBlogWithTitleLike" resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
</select>
复制代码

这条语句提供了一个可选的文本查找类型的功能。如果没有传入"title",那么所有处于"ACTIVE"状态的BLOG都会返回;反之若传入了"title",那么就会把模糊查找"title"内容的BLOG结果返回

如果想可选地通过"title"和"author"两个条件搜索该怎么办呢?首先,改变语句的名称让它更具实际意义;然后只要加入另一个条件即可。

复制代码
<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’ 
  <if test="title != null">
    AND title like #{title}
  </if>
  <if test="author != null and author.name != null">
    AND author_name like #{author.name}
  </if>
</select>
复制代码

choose(when, otherwise)

有些时候,我们不想用到所有的条件语句,而只想从中择其一二。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。

还是上面的例子,但是这次变为提供了"title"就按"title"查找,提供了"author"就按"author"查找,若两者都没有提供,就返回所有符合条件的BLOG(实际情况可能是由管理员按一定策略选出BLOG列表,而不是返回大量无意义的随机结果)。

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <choose>
    <when test="title != null">
      AND title like #{title}
    </when>
    <when test="author != null and author.name != null">
      AND author_name like #{author.name}
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>
</select>

where

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG 
  <where> 
    <if test="state != null">
         state = #{state}
    </if> 
    <if test="title != null">
        AND title like #{title}
    </if>
    <if test="author != null and author.name != null">
        AND author_name like #{author.name}
    </if>
  </where>
</select>

where 元素知道只有在一个以上的if条件有值的情况下才去插入"WHERE"子句。而且,若最后的内容是"AND"或"OR"开头的,where 元素也知道如何将他们去除。

trim

如果 where 元素没有按正常套路出牌,我们还是可以通过自定义 trim 元素来定制我们想要的功能。比如,和 where 元素等价的自定义 trim 元素为:

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

prefixOverrides 属性会忽略通过管道分隔的文本序列(注意此例中的空格也是必要的)。它带来的结果就是所有在 prefixOverrides 属性中指定的内容将被移除,并且插入 prefix 属性中指定的内容。

set

类似的用于动态更新语句的解决方案叫做 set。set 元素可以被用于动态包含需要更新的列,而舍去其他的。比如:

复制代码
<update id="updateAuthorIfNecessary">
  update Author
    <set>
      <if test="username != null">username=#{username},</if>
      <if test="password != null">password=#{password},</if>
      <if test="email != null">email=#{email},</if>
      <if test="bio != null">bio=#{bio}</if>
    </set>
  where id=#{id}
</update>
复制代码

这里,set 元素会动态前置 SET 关键字,同时也会消除无关的逗号,因为用了条件语句之后很可能就会在生成的赋值语句的后面留下这些逗号。

若你对等价的自定义 trim 元素的样子感兴趣,那这就应该是它的真面目:

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

注意这里我们忽略的是后缀中的值,而又一次附加了前缀中的值。

foreach

动态 SQL 的另外一个常用的必要操作是需要对一个集合进行遍历,通常是在构建 IN 条件语句的时候。比如:

复制代码
<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  WHERE ID in
  <foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
        #{item}
  </foreach>
</select>
复制代码

foreach 元素的功能是非常强大的,它允许你指定一个集合,声明可以用在元素体内的集合项和索引变量。它也允许你指定开闭匹配的字符串以及在迭代中间放置分隔符。这个元素是很智能的,因此它不会偶然地附加多余的分隔符。

注意 你可以将一个 List 实例或者数组作为参数对象传给 MyBatis,当你这么做的时候,MyBatis 会自动将它包装在一个 Map 中并以名称为键。List 实例将会以"list"作为键,而数组实例的键将是"array"。

标签:元素,like,title,author,BLOG,SQL,Mybatis,动态,where
From: https://www.cnblogs.com/happy12123/p/17116078.html

相关文章

  • SQL276 牛客的课程订单分析(六)
    题目描述有一个订单信息表(order_info),有一个客户端表(client),请你写出一个sql语句查询在2025-10-15以后,同一个用户下单2个以及2个以上状态为购买成功的C++课程或Java课......
  • 动态NFT赋能三维模型数字资产
    动态NFT技术是近年来最受欢迎的数字资产技术之一,它将动态内容与静态内容相结合,创造出全新的数字资产。动态NFT是一种非常先进的技术,它可以用于创建三维模型,使得数字资产具......
  • 基于拦截器+mybatis+注解 实现对敏感字段进行加解密
    实现:自定义注解类自定义myabtis拦截器,拦截mybatis,主要涉及三个handler(StatementHandler,ParameterHandler,ResultSetHandler)自定义加解密工具类   ......
  • mysql数据类型的选择
    1、整数和浮点数如果不需要小数部分,就是用整数来保存数据;如果需要小数部分,就是用浮点数。对于浮点数据列,存入的数值会对该列定义的小数位进行四舍五入。浮点类型包裹​​​......
  • mysql自增主键设置
    mysql自增主键设置在数据库应用中,经常希望在每次插入新纪录时,系统自动生成字段的主键值。可以通过为表主键添加​​AUTO_INCREMENT​​关键字来实现。默认情况下,在MYSQL中​......
  • AJAX动态加载下拉框数据
    1、type表数据2、前端页面现在的想法是点击商品类型下拉框,动态加载所有商品类型利用select标签的id属性3、jQuery代码部分这句放在自执行函数里面loadProductType("/ssm_tes......
  • mysql多字段分组
    文章目录​​mysql多字段分组​​​​groupby语法​​​​多字段分组​​​​GROUPBY与ORDERBY一起使用(分组排序)​​​​使用having过滤分组​​mysql多字段分组group......
  • docker 安装mysql
    1,dockerpullmysql:5.7.41具体镜像查看docker官网仓库2,创建容器在本地的映射文件夹mkdir-p/root/mysql/data/root/mysql/logs/root/mysql/conf3,创建mysql配置......
  • 聊聊Mysql
    大体来说,MySQL可以分为Server层和存储引擎层两部分:  Server层:包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如......
  • mac端忘记mysql登录密码,进行密码重置
    一、mac--系统偏好设置,找到最下方的mysql,点击关闭。二、点击stop命令或者在终端输入命令行,选择其中一个即可:sudo/usr/local/mysql/support-files/mysql.serverstop......