首页 > 数据库 >mybatis中的动态sql

mybatis中的动态sql

时间:2022-08-28 23:46:37浏览次数:47  
标签:语句 title author blog sql mybatis 动态 where

动态sql是:根据不同的查询条件,生成不同的查询结果

常用的动态语句包括:

  1. - if
  2. - choose (when, otherwise)
  3. - trim (where, set)
  4. - foreach

if语句

<!--需求1:
根据作者名字和博客名字来查询博客!
如果作者名字为空,那么只根据博客名字查询,反之,则根据作者名来查询
select * from blog where title = #{title} and author = #{author}
-->
<select id="queryBlogIf" parameterType="map" resultType="blog">
    select * from blog where
    <if test="title != null">
        title = #{title}
    </if>
    <if test="author != null">
        and author = #{author}
    </if>
</select>

where语句:

这个“where”标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。

<select id="queryBlogIf" parameterType="map" resultType="blog">
    select * from blog 
    <where>
        <if test="title != null">
            title = #{title}
        </if>
        <if test="author != null">
            and author = #{author}
        </if>
    </where>
</select>

 

set语句:

同理上面的对于查询 SQL 语句包含 where 关键字

<!--注意set是用的逗号隔开-->
<update id="updateBlog" parameterType="map">
    update blog
      <set>
          <if test="title != null">
              title = #{title},
          </if>
          <if test="author != null">
              author = #{author}
          </if>
      </set>
    where id = #{id};
</update>

choose(when,set)语句:

  有时候,我们不想用到所有的查询条件,只想选择其中的一个,查询条件有一个满足即可,使用 choose 标签可以解决此类问题,类似于 Java 的 switch 语句

<select id="queryBlogChoose" parameterType="map" resultType="blog">
    select * from blog
    <where>
        <choose>
            <when test="title != null">
                 title = #{title}
            </when>
            <when test="author != null">
                and author = #{author}
            </when>
            <otherwise>
                and views = #{views}
            </otherwise>
        </choose>
    </where>
</select>

SQL片段:

  有一些要用得多得sql语句就可以提取出来,方便下次调用

//提取sql片段
<sql id="if-title-author">
    <if test="title != null">
        title = #{title}
    </if>
    <if test="author != null">
        and author = #{author}
    </if>
</sql>


引用sql片段
<select id="queryBlogIf" parameterType="map" resultType="blog">
    select * from blog
    <where>
        <!-- 引用 sql 片段,如果refid 指定的不在本文件中,那么需要在前面加上 namespace -->
        <include refid="if-title-author"></include>
        <!-- 在这里还可以引用其他的 sql 片段 -->
    </where>
</select>

注意:①、最好基于 单表来定义 sql 片段,提高片段的可重用性

   ②、在 sql 片段中不要包括 where

 Foreach语句:

就是java得foreach语句,遍历

<select id="queryBlogForeach" parameterType="map" resultType="blog">
    select * from blog
    <where>
        <!--
        collection:指定输入对象中的集合属性
        item:每次遍历生成的对象
        open:开始遍历时的拼接字符串
        close:结束时拼接的字符串
        separator:遍历对象之间需要拼接的字符串
        select * from blog where 1=1 and (id=1 or id=2 or id=3)
      -->
        <foreach collection="ids"  item="id" open="and (" close=")" separator="or">
            id=#{id}
        </foreach>
    </where>
</select>

 

标签:语句,title,author,blog,sql,mybatis,动态,where
From: https://www.cnblogs.com/flsh/p/16634446.html

相关文章

  • Mysql的视图使用场景笔记
    mysql的视图本质上就是一条预定义的联表查询sql语句当设计一个数据库模型的时候,各个数据表模型之间的关系在一定程度上是独立的,即使两个数据模型表之间存在一对多或者多对......
  • Flyway管理数据库MySQL5.7入坑记录(二)
    在成功加入Flyway的Gradle的插件后,在Gradle的任务中选择flyway->flywayMigrate,进行数据库迁移操作,于是出现下面的问题。第二坑:执行flyMigrate出现错误信息:flywayNodatab......
  • 使用idea中的mysql可视化工具,出现[42000][1064] You have an error in your SQL synta
    今天使用idea中mysql的可视化工具进行开发,当我想要插入一行数据时,发现无法插入,产生如下错误。   [42000][1064]YouhaveanerrorinyourSQLsyntax;checkthe......
  • 8/28 深入理解计算机系统笔记 动态内存分配
    9.9动态内存分配动态内存分配器维护一个进程的虚拟内存区域,称为堆。对于每个进程,内核维护一个变量brk,它指向堆的顶部。分配器将堆视做一组不同大小的块的集合来维护。......
  • MySQL Others -- 服务正常关闭流程
    MySQL正常关闭流程下面信息抄自爱可生开源社区当MySQL服务收到关闭服务的SIGINT信号后,进行如下处理:启动关机进程创建shutdown线程(如果需要)停止接受新连接处理已......
  • MySQL
    MySQL开源的MySQL库表结构:增删改查数据类型:1.结构化:表格数据,字段,固定格式2.非结构化:图片,视频文件3.半结构化:HTML,XML等,JSON格式的数据--->其实就是一种数据的格式用......
  • 工具: Ansible Playbook 安装 Mysql 并配置主从复制
    准备工作主机信息IP名称角色192.168.114.133node1master192.168.114.134node2slave192.168.114.135node3slave安装ansibleAnsible是一个自......
  • 什么是动态规划?
    什么是动态规划?今天简单说一下动态规划的定义以及简单示例。动态规划,是一种将原问题分解成简单的子问题来解决复杂问题的思想。其中,动态规划还具有最优子结构性质和子......
  • MySQL Replication -- 无损半同步模式下的主从数据不一致问题
    无损半同步复制基础不管是无损半同步(losslesssemi-syncreplication)还是增强半同步,说的都是AFTER_SYNC模式的半同步复制,针对参数rpl-semi-sync-master-wait-point,官方......
  • 【PHP】【Mysql】【thinkphp】,Thinkphp save()方法执行update操作的返回值问题
    用Thinkphp的Save()方法执行update操作$res=M('erp_goods')->where(array('goods_id'=>$goods_id,'attr'=>$goods_attr))->save($data);if($res===false......