Mybatis-动态SQL

黑马程序员JavaWeb开发教程

文章目录

  • 一、Mybatis-XML映射文件
    • 1、XML映射文件
      • (1)规范
      • (2)MybatisX
  • 二、Mybatis-动态SQL-if
    • 1、动态SQL
    • 2、 标签`<if><where>`
    • 3、示例
  • 三、Mybatis-动态SQL-foreach
    • 根据 id 批量删除员工
      • 1、SQL语句
      • 2、接口方法
      • 3、EmpMapper.xml 映射文件
      • 4、 测试
  • 四、Mybatis-动态SQL-sql&include

借用之前的根据条件查询用户 五 5.演示根据条件查询

一、Mybatis-XML映射文件

1、XML映射文件

(1)规范

  1. XML应和文件的形成与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下

    • 在src.main.resources包右键 new Driectory,创建目录com.itheima.mapper,注意:使用/的方式进行创建,不能使用.的方式进行创建
      在这里插入图片描述
    • 在新创建的目录上右键 new File,创建EmpMapper.xml(其中EmpMapper和mapper包下的接口同名)
      在这里插入图片描述
  2. XML映射文件的namespace属性为Mapper接口全限定名一致

    • 在EmpMapper.xml中填写以下配置,其中namespace中填写的是EmpMapper接口的全限定名,按照下图即可copy到
      在这里插入图片描述
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper"></mapper>
  1. XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致
    在这里插入图片描述

在这里插入图片描述

EmpMapper接口中的代码

    public List<Emp> list(@Param("name") String name, @Param("gender") Short gender, @Param("begin") LocalDate begin, @Param("end") LocalDate end);

EmpMapper.xml 映射文件中的代码

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper">
<!--    resultType:单挑记录所封装的类型--><select id="list" resultType="com.itheima.pojo.Emp">select * from emp where name like concat('%',#{name},'%') and gender=#{gender} andentrydate between #{begin}  and #{end}  order by update_time desc</select>
</mapper>

(2)MybatisX

  1. MybatisX是一款基于IDEA的快速开发Mybatis的插件,安装步骤如下,并且安装完成之后,会看到xml文件中有相应的图标。
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  1. 使用Mybatis的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句

二、Mybatis-动态SQL-if

1、动态SQL

  1. 随着用户的输入或为外部条件的变化而变化的SQL语句,我们称为动态SQL

2、 标签<if><where>

  1. <if>:用于判断条件是否成立,使用test属性进行条件判断,如果条件为true,则拼接SQL
  2. <where>:where元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句开头的and或者 or
  3. <set>:动态的在行首插入SET关键字,并会删除掉额外的逗号(用在update语句中)

3、示例

  1. 将之前的select语句使用以上连个标签改写一下
<select id="list" resultType="com.itheima.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>

三、Mybatis-动态SQL-foreach

根据 id 批量删除员工

1、SQL语句

delete  from emp where id in(18,19,20);

2、接口方法

 //根据id批量删除员工public void deleteByIds(@Param("ids") List<Integer> ids);

3、EmpMapper.xml 映射文件

  1. foreach标签中的几个常用属性:
    • collection:遍历的集合(和方法中传递的参数名一致即可)
    • item:遍历出来的元素
    • separator:分隔符
    • open:遍历开始前拼接的SQL片段
    • close:遍历节后后拼接的SQL片段
    <!--    根据ID量删除员工-->
<!--    collection:遍历的集合(和方法中传递的参数名一致即可)item:遍历出来的元素separator:分隔符open:遍历开始前拼接的SQL片段close:遍历节后后拼接的SQL片段
--><delete id="deleteByIds">delete from emp where id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach></delete>

4、 测试

 @Testpublic void testDeleteByIds(){List<Integer> ids= Arrays.asList(18,19);empMapper.deleteByIds(ids);}

四、Mybatis-动态SQL-sql&include

  1. 优势忽悠一些经常使用的SQL 代码片段,这是我们可以将这写代码片段进行抽取,使用<sql>标签,然后在相应的地方使用<include>标签进行引用
  2. <sql>:定义可重用的SQL片段
  3. <include>:通过属性refid,指定包含的sql片段
 <sql id="commonSql">select id,username,password,name,gender,image,job,entrydate,dept_id,create_time,update_timefrom emp</sql><!--    resultType:单条记录所封装的类型--><select id="list" resultType="com.itheima.pojo.Emp"><include refid="commonSql"></include><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>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

踩坑npm install qrcodejs2和crypto-js

在VSCode输入以下命令时&#xff1a; npm run dev 报错找不到crypto-js依赖。 通过以下命令安装crypto-js依赖。 npm install --save crypto-js 然后再次运行启动命令继续报错&#xff0c;这次报错找不到qrcodejs2依赖&#xff0c;通过以下命令安装qrcodejs2依赖&#xff…

iOS - 多线程-atomic

文章目录 iOS - 多线程-atomic1. 源码分析1.1 get方法1.2 set方法 2. 一般不使用atomic的原因 iOS - 多线程-atomic atomic用于保证属性setter、getter的原子性操作&#xff0c;相当于在getter和setter内部加了线程同步的锁可以参考源码objc4的objc-accessors.mm它并不能保证使…

刚刚,ChatGPT重大更新!GPT-4更加聪明,已成毕业论文撰写润色修改最佳利器!

今天ChatGPT Plus版本做了升级。GPT-4增强了记忆功能&#xff0c;能够通过你的多次对话了解你的意图&#xff0c;并提供合适的回应&#xff0c;总结一句话就是&#xff1a;更加懂你&#xff01; ChatGPT到底能干什么&#xff1f;我简单总结一下&#xff1a; 翻译&#xff1a;中…

电商技术揭秘三十一:智能风控与反欺诈技术

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘二十八&#xff1a;安全与合规性保障 电商技术揭秘二十九&#xff1a;电商法律合规浅析 电商技术揭秘三十&#xff1a;知识产权保…

C++必修:从C到C++的过渡(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. 缺省参数 1.1. 缺省参数的使用 缺省参数是声明或定义函数时为函数的参数指定…

Java基础之JVM对象内存分配机制简介

一 对象内存分配 1.1 运行时数据区域 1.2 常见java应用启动JVM参数&#xff1a; -Xss&#xff1a;每个线程的栈大小(单位kb)-Xms&#xff1a;堆的初始大小&#xff0c;默认物理内存的1/64,示例&#xff1a;-Xms:4g -Xms:10m-Xmx&#xff1a;堆的最大可用大小&#xff0c;默认物…

(Java)队列

一.概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾&#xff08;Tail/Rear&#xff09; 出队列&#xff1a;进行删…

数据的正态性检验

正态性检验 判断 pd.Series 数据是否符合正态分布&#xff0c;可以采用以下几种方法。 计算偏度 偏度&#xff08;Skewness&#xff09;是衡量数据分布对称性的统计量。如果偏度大于 0&#xff0c;则数据分布是右偏的&#xff08;正偏斜&#xff09;&#xff1b;如果偏度小于…

时尚新选择,小塔RFID技术重塑样衣管理

在时尚领域&#xff0c;样衣是创意与工艺的完美结合&#xff0c;每一件都承载着设计师的心血与期待。然而&#xff0c;当这些珍贵的样版在传统的管理体系下流转时&#xff0c;样版管理成为一个令人头疼的问题。手动记录、盘点和样板追溯成为常态&#xff0c;但这种方式容易出错…

亚远景科技-ASPICE评估师等级、ASPICE评估师培训和ASPICE评估项目等级简介

1. ASPICE评估师等级&#xff1a; ASPICE评估师等级主要包括助理评估师、主任评估师、首席评估师和评估师导师。这些等级反映了评估师在执行ASPICE评估项目时的经验和专业能力。助理评估师即小PA&#xff0c;主任评估师即CA,首席评估师即大PA。每一个等级都需要经过严格的培训…

Web前端开发之HTML_1

第一个前端程序VS Code安装VS Code 快捷键 1. 第一个前端程序 使用记事本&#xff0c;新建一个文本文档&#xff0c;重命名为Welcome.html&#xff0c;如下图&#xff1a; 用记事本打开文档&#xff0c;内容输入如下&#xff1a; <html> <head> <t…

C++11 数据结构6 栈的链式存储,实现,测试

栈顶放在链表的头部 栈顶放在链表的头部还是尾部呢&#xff1f; 需要栈 是特殊的线性表&#xff0c;那么我们回忆一下 线性表的链式存储的插入和删除的写法&#xff0c;就应该能理清线性表的头部做为栈顶 合适 还是 线性表的尾部 作为栈顶合适 插入算法 核心代码 //正式插入…

深度学习| 注意力机制

注意力机制 为什么需要注意力机制Seq2Seq问题Transfomer Attention注意力机制分类软硬注意力注意力域 为什么需要注意力机制 这个可以从NLP的Seq2Seq问题来慢慢理解。 Seq2Seq问题 Seq2Seq&#xff08;Sequence to Sequence&#xff09;&#xff1a;早期很多模型中&#xff…

如何写专利的相关经验

记录一下自己看过的视频 专利书写指南_哔哩哔哩_bilibili 纯干货&#xff01;人工智能算法类发明专利撰写规范教程&#xff0c;中国地质大学教授一小时精讲发明专利撰写规范&#xff0c;究极通俗易懂&#xff01;_哔哩哔哩_bilibili 记录自己如何让学习写专利&#xff1a; …

数据赋能(67)——概念:数据变现

数据变现是指通过某种方式将数据转化为实际的收益或绩效。数据变现的方式多种多样&#xff0c;可以根据不同的应用场景和业务需求进行选择和组合。 数据变现的主要方式如下&#xff1a; 数据销售与租赁 组织直接出售原始数据或经过处理、整合后的数据给需要的组织或个人。组织…

Redis分布式锁 - 基于Jedis和LUA的分布式锁

先基于单机模式&#xff0c;基于Jedis手工造轮子实现自己的分布式锁。 首先看两个命令&#xff1a; Redis 分布式锁机制&#xff0c;主要借助 setnx 和 expire 两个命令完成。 setnx命令: setnx 是 set if not exists 的简写。将 key 的值设为 value &#xff0c;当且仅当…

uniapp问题归类

最近使用uniapp中&#xff0c;遇到了一些问题&#xff0c;这边mark下。 1. 启动页变形 设置启动页的时候发现在部分android手机上启动页被拉伸了&#xff0c;最后看了下官方建议使用9.png图 生成9.png地址&#xff0c;推荐图片大小为1080x2340 uniapp推荐官方地址传送门 我…

Hyper-V Ubuntu 虚拟机配置双网卡

Hyper-V Ubuntu 虚拟机配置双网卡 2024年4月25日10点34分 &#xff08;上班时间摸鱼&#xff09; 文章目录 Hyper-V Ubuntu 虚拟机配置双网卡前情提要目标与原理双网卡的配置步骤 前情提要 在学习Kubernetes集群的时候遇到了联网与SSH连接的矛盾。 Hyper-V平台有一个缺省的虚…

【Linux驱动层】iTOP-RK3568学习之路(四):杂项设备驱动框架

一、杂项设备驱动简介 在 Linux 中&#xff0c;把无法归类的五花八门的设备定义成杂项设备。相较于字符设备&#xff0c;杂项设备有以下两个优点: (1)节省主设备号:杂项设备的主设备号固定为 10&#xff0c;而字符设备不管是动态分配还是静态分配设备号&#xff0c;都会消耗一…

【leetcode面试经典150题】71. 对称二叉树(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…