SpringBoot——Mybatis-XML映射文件—动态SQL

使用XML映射文件配置SQL语句的规范 

XML文件当中的Mapper标签里面使用的select标签的id属性是Mapper接口里面的方法名,resultType属性名是SQL语句要返回的对象类型。 

MybatisX插件

用于管理接口方法和映射文件的关系

注解和XML配置SQL语句两种选择 

 动态SQL——where标签和if标签的使用

 在如下的图中,可以只需要输入其中一些值来进行查询,但是在使用注解进行开发时没法做到。

 要实现的效果是查询时有哪些字段就根据哪些字段来查询。

只输入 姓名查询后输出如下,预编译SQL中只有一个条件。

 但是这里还有一个问题,假如name为空时其他判断不为空组装的SQL语句会有问题

没有name时,where 后面的条件会出现一个and

条件全部为空时,where后面直接没有条件了,因此要修改成如下的形式

使用提供的where标签,会动态的根据里面的if标签成立与否生成where

还有一个作用就是可以自动去除多余的and和or

<select id="list" resultType="com.example.pojo.Emp">
        select * from emp
        <where>
        <if test="name!=null">
          name like concat('%',#{name},'%')
       </if>
        <if test="gender!=null">
            and gender = #{gender}
        </if>
        <if test="begin!=null and end!=null">
            and
            entrydate between #{begin} and #{end}
        </if>
        </where>
             order by update_time desc
    </select>

 

 if和set标签-案例

在更新操作里面,如果传进来的emp对象的字段只更新了一部分,那么按照原本的方法会出现剩下的字段变为null,这是不合理的,我们要做的是根据哪些字段有更新值才更新。

@Update("update emp set username = #{username}, name = #{name}, gender = #{gender}, image = #{image}," +
        " job = #{job}, entrydate = #{entrydate}, dept_id = #{deptId},update_time = #{updateTime} where id = #{id}")
public void update(Emp emp);

使用XML配置开发SQL语句

(按住ctrl+alt+L格式化)

 <update id="update">
        update emp
        set
        <if test="username!=null">username = #{username},</if>
        <if test="name!=null">name = #{name},</if>
        <if test="gender!=null">gender = #{gender},</if>
        <if test="image!=null">image = #{image},</if>
        <if test="job!=null">job = #{job},</if>
        <if test="entrydate!=null">entrydate = #{entrydate},</if>
        <if test="deptId!=null">dept_id = #{deptId},</if>
        <if test="updateTime!=null">update_time = #{updateTime}</if>
        where id = #{id}
    </update>

但是这里也会有一个问题如下 ,只传递了一个值多了一个逗号

解决方案

使用myabtis提供的set标签,可以把后面的逗号自动去除

<update id="update">
        update emp
        <set>
            <if test="username!=null">username = #{username},</if>
            <if test="name!=null">name = #{name},</if>
            <if test="gender!=null">gender = #{gender},</if>
            <if test="image!=null">image = #{image},</if>
            <if test="job!=null">job = #{job},</if>
            <if test="entrydate!=null">entrydate = #{entrydate},</if>
            <if test="deptId!=null">dept_id = #{deptId},</if>
            <if test="updateTime!=null">update_time = #{updateTime}</if>
        </set>
        where id = #{id}
    </update>

 

  动态SQL——foreach标签

要实现一个批量删除的操作,将传进来的id一个一个删除元组

在Mapper接口中新增如下方法,使用List传进去所有需要删除的id的集合

public void deleteByIds(List<Integer> ids);

根据SQL语句比如有  delete from emp where id in  (18,19,20)

在XML中如下配置

<delete id="deleteByIds">
        delete from emp where id in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>

四个属性

collection: 要遍历的集合 
item: 遍历出来的元素
separator: 分隔符
open: 遍历开始前拼接的SQL字段

close: 遍历开始后拼接的SQL字段

单元测试:

  @Test
    public void testdelete(){
        List<Integer> ids= Arrays.asList(14,15,16);
        empMapper.deleteByIds(ids);
    }

输出如下

   动态SQL——sql标签和include标签

需求分析 : 如下的两个select语句中假如将来有修改,那么需要改动的地方很多,所以要将公共部分抽取出来进行封装。

此处借助<sql>和<include>标签进行实现 

使用<sql>进行抽取,有一个id属性作为唯一标识,在需要用到的地方使用<include>引入,有一个refid就是对应要引入的<sql>片段的属性值 

 最后总结3个准则和6个标签

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/3278.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Cookie 和 Session的区别

文章目录时间&#xff1a;2023年3月23日第一&#xff1a;什么是 Cookie 和 Session ?什么是 Cookie什么是 Session第二&#xff1a;Cookie 和 Session 有什么不同&#xff1f;第三&#xff1a;为什么需要 Cookie 和 Session&#xff0c;他们有什么关联&#xff1f;第四&#x…

由本溯源,带你探索BI实时性的本质

BI 采用T1模式 BI的数据仓库架构本身就决定了对数据的实时性要求没有那么高&#xff0c;ETL的过程不可或缺&#xff0c;Extraction 抽取、Transformation 转换、Loading 加载&#xff0c;这三个环节本身就是有时间损耗的。 BI - 派可数据BI可视化分析平台 首先&#xff0c;Ex…

动态内存管理(上)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是动态内存管理噢&#xff0c;下面&#xff0c;让我们进入动态内存管理的世界吧 为什么存在动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 为什么存在动态内存分配 我们已…

第十四届蓝桥杯三月真题刷题训练——第 22 天

目录 第 1 题&#xff1a;受伤的皇后_dfs 题目描述 输入描述 输出描述 输入输出样例 运行限制 代码&#xff1a; 思路&#xff1a; 第 2 题&#xff1a;完全平方数 问题描述 输入格式 输出格式 样例输入 1 样例输出 1 样例输入 2 样例输出 2 评测用例规模与约…

Jenkins--邮件通知设置与构建日志邮件通知设置(踩过很多坑之后,记录一下)

1为啥要配置邮件通知配置邮件通知的目的是为了给用户发送构建结果的状态&#xff0c;以便用户知晓构建任务后的结果。2 开始配置邮件通知2.1 插件准备先检查Jenkins是否安装了Email Extension Plugin 插件&#xff0c;检查方法如下&#xff1a;进入Jenkins-->Manage Jenkins…

uni-app:登录与支付--用户信息

用户信息 实现用户头像昵称区域的基本布局 在 my-userinfo 组件中&#xff0c;定义如下的 UI 结构&#xff1a; <template><view class"my-userinfo-container"><!-- 头像昵称区域 --><view class"top-box"><image src"…

蓝桥杯刷题冲刺 | 倒计时18天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录0.知识点1.乳草的入侵今天写 搜索题 0.知识点 DFS 设计步骤 确定该题目的状态&#xff08;包括边…

串口,IIC,SPI,USB等总线硬件知识总结

串口&#xff0c;IIC&#xff0c;SPI&#xff0c;USB等总线硬件知识总结 文章目录串口&#xff0c;IIC&#xff0c;SPI&#xff0c;USB等总线硬件知识总结1 串口2.I2C3.SPI4.USB控制&#xff08;Control&#xff09;传输方式同步&#xff08;Isochronous&#xff09;传输方式中…

vue3+vite+ts 搭建脚手架01创建vite项目并且在项目中初次使用router

vue3vite 搭建脚手架01创建vite项目并且在项目中使用router 1.使用yarn安装vite项目 yarn create vite 搭建vite项目 在开发语言中选择vuets2.安装现在最新的 vue-router4 yarn add vue-router4 在packger中检查是否成功安装3.简单配置router文件 在项目中新建views和…

【C++】map、set、multimap、multiset的介绍和使用

我讨厌世俗&#xff0c;也耐得住孤独。 文章目录一、键值对二、树形结构的关联式容器1.set1.1 set的介绍1.2 set的使用1.3 multiset的使用2.map2.1 map的介绍2.2 map的使用2.3 multimap的使用三、两道OJ题1.前K个高频单词&#xff08;less<T>小于号是小的在左面升序&…

如何将字符串反转?

参考答案 使用 StringBuilder 或 StringBuffer 的 reverse 方法&#xff0c;本质都调用了它们的父类 AbstractStringBuilder 的 reverse 方法实现。&#xff08;JDK1.8&#xff09;不考虑字符串中的字符是否是 Unicode 编码&#xff0c;自己实现。递归1. public AbstractStrin…

优秀程序员的5个特征,你在第几层?

每个人程序员都对未来的职业发展有着憧憬和规划&#xff0c;要做架构师、要做技术总监、要做CTO。但现实总是复杂的&#xff0c;日复一日的工作与生活总能让人一次又一次地陷入迷茫。大部分原因就是对职业发展轨迹和自我能力提升的一般规律缺乏认识&#xff0c;做事找不到方向或…

WebSocket 测试工具

一、WebSocket 简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直…

MySQL数据库管理系统安装部署——Linux

MySQL数据库管理系统安装部署——Linux 简介 MySQL数据库管理系统&#xff08;后续简称MySQL)&#xff0c;是一款知名的数据库系统&#xff0c;其特点是:轻量、简单、功能丰富。MySQL数据库可谓是软件行业的明星产品&#xff0c;无论是后端开发、大数据、AI、运维、测试等各类…

linux入门---操作体统的概念

什么是操作系统 操作系统是一个对软硬件资源进行管理的软件。计算机由一堆硬件组成&#xff0c;这些硬件遵循着冯诺依曼体系结构 在这个硬件的基础上还有一个软件叫做操作系统 操作系统的任务是对硬件进行管理&#xff0c;既然是管理的话操作系统得访问到底层的硬件&#xf…

【贪心算法】一文让你学会“贪心”(贪心算法详解及经典案例)

文章目录前言如何理解“贪心算法”&#xff1f;贪心算法实战分析1.分糖果2.钱币找零3.区间覆盖内容小结最后说一句&#x1f431;‍&#x1f409;作者简介&#xff1a;大家好&#xff0c;我是黑洞晓威&#xff0c;一名大二学生&#xff0c;希望和大家一起进步。 &#x1f47f;本…

Spring Boot 各层作用与联系

目录 1 Entity 层 2 DAO 层 3 Service 层 4 Controller 层 Spring Boot 各层之间的联系&#xff1a; controller 层-----> service 层(接口->接口实现类) -----> dao 层的.mapper 文件 -----> 和 mapper 层里的.xml 文件对应 1 Entity 层 实体层&#xff0c;…

Java笔记_6(面向对象)

Java笔记_6一、面向对象1.1、设计对象并使用1.2、封装1.3、就近原则和this关键字1.4、构造方法1.5、标准的JavaBean类1.6、对象内存图1.7、基本数据类型和引用数据类型1.8、this的内存原理1.9、成员和局部二、面向对象&#xff08;综合练习&#xff09;2.1、文字版格斗游戏2.2、…

正式环境关闭swagger

直接上步骤&#xff0c;如图&#xff1a;1&#xff0c;启动判断写在相应的环境配置文件中&#xff0c;根据条件判断是否启动 swagger &#xff1a;添加配置项&#xff1a;swagger.is.enable配置文件中添加&#xff1a;#是否激活 swagger true or falseswagger.is.enabletrue2&a…

【Linux】-初识Linux

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【Linux】 分享&#xff1a;逆着光行走&#xff0c;任风吹雨打。 ——《起风了》 主要内容&#xff1a;Linux的一些最基本指令&#xff0c;Linux的小程序&#xff0c;Linux关于连…