JavaWeb Day09 Mybatis-基础操作02-XML映射文件动态SQL
目录
Mybatis动态SQL介绍编辑
一、案例
①Mapper层
②测试类
③EmpMapper.xml
④结果
二、标签
(一)if where标签
①EmpMapper.xml
②案例
③总结
(二)foreach标签
①SQL语句
②Mapper层
③EmpMapper.xml
④测试类
⑤结果
(三)sql&include标签
①EmpMapper.xml
②总结
XML映射文件(配置文件)
①EmpMapper.xml
②Mapper层
③测试类
④思考
⑤总结
Mybatis动态SQL介绍

一、案例
ctrl+alt+l将SQL语句格式化
List<Emp> empList= empMapper.list("z",null,null,null);

当查询条件不完整时,会查询不到数据,因此就需要编写动态SQL
①Mapper层
package com.itheima.mapper;import com.itheima.pojo.Emp;
import org.apache.ibatis.annotations.*;import java.time.LocalDate;
import java.util.List;@Mapper
public interface EmpMapper {public List<Emp> list(String name, Short gender, LocalDate begin,LocalDate end);}
②测试类
package com.itheima;import com.itheima.mapper.EmpMapper;
import com.itheima.pojo.Emp;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;@SpringBootTest
class SpringbootMybatisCrudApplicationTests {@Autowiredprivate EmpMapper empMapper;@Testpublic void testList(){List<Emp> empList= empMapper.list("z",null,null,null);System.out.println(empList);}
}
③EmpMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://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} and-->
<!-- entrydate between #{begin} and #{end} order by update_time desc-->
<!-- </select>--><select id="list" resultType="com.itheima.pojo.Emp">select *from empwhere<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>order by update_time desc</select>
</mapper>
④结果
二、标签
(一)if where标签
①EmpMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://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} and-->
<!-- entrydate between #{begin} and #{end} order by update_time desc-->
<!-- </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>order by update_time desc</where></select>
</mapper>
②案例


③总结

(二)foreach标签
批量删除员工信息
①SQL语句
delete from emp where id in(18,19,20);
②Mapper层
EmpMapper.java
package com.itheima.mapper;import com.itheima.pojo.Emp;
import org.apache.ibatis.annotations.*;
import java.util.List;@Mapper
public interface EmpMapper {//根据ID批量删除员工信息public void deleteByIds(List<Integer> ids);}
③EmpMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper"><!--批量删除员工--><delete id="deleteByIds">delete from empwhere id in<foreach collection="ids" item="id" open="(" close=")" separator=",">#{id}</foreach></delete>
</mapper>
④测试类
package com.itheima;import com.itheima.mapper.EmpMapper;
import com.itheima.pojo.Emp;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;@SpringBootTest
class SpringbootMybatisCrudApplicationTests {@Autowiredprivate EmpMapper empMapper;@Testpublic void testDeleteByIds(){List<Integer> ids= Arrays.asList(13,14,15);empMapper.deleteByIds(ids);}
}
⑤结果

(三)sql&include标签
查询的时候不建议使用select *,而是把所有的字段罗列出来
①EmpMapper.xml

②总结

XML映射文件(配置文件)

源文件放在java中,而配置文件放在resources中
官网:mybatis – MyBatis 3 | 简介
①EmpMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://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>
②Mapper层
package com.itheima.mapper;import com.itheima.pojo.Emp;
import org.apache.ibatis.annotations.*;import java.time.LocalDate;
import java.util.List;@Mapper
public interface EmpMapper {public List<Emp> list(String name, Short gender, LocalDate begin,LocalDate end);}
③测试类
package com.itheima;import com.itheima.mapper.EmpMapper;
import com.itheima.pojo.Emp;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
class SpringbootMybatisCrudApplicationTests {@Autowiredprivate EmpMapper empMapper;@Testpublic void testList(){List<Emp> empList= empMapper.list("z",(short)1,LocalDate.of(2010,1,1),LocalDate.of(2020,1,1));System.out.println(empList);}
}
④思考
mapper映射文件还有一个好处,修改sql语句不用重启项目
在方法上实现动态的条件查询就会使接口过于臃肿
如果操作语句多了,直接也在注解上面比较混乱
如果要做手动映射封装实体类的时候 xml方便,项目中会常用
用xml,因为查询的条件会变化,直接写在注解里面的话会使接口过于臃肿
这两个各自找各自对应的,原来是注解绑定,现在是通过路径和方法名绑定
多条件查询要写动态sql用映射文件比较合适,简单的可以直接注解方式
终于找到问题了,xml里的sql语句不能拼接,只能是一长条,运行才不报错
执行list()方法时,根据全限定类名找到对应的namespace ,再找到id为这个方法的SQL语句就可以执行了
⑤总结


相关文章:
JavaWeb Day09 Mybatis-基础操作02-XML映射文件动态SQL
目录 Mybatis动态SQL介绍编辑 一、案例 ①Mapper层 ②测试类 ③EmpMapper.xml ④结果 二、标签 (一)if where标签 ①EmpMapper.xml ②案例 ③总结 (二)foreach标签 ①SQL语句 ②Mapper层 ③EmpMapper.xml ④…...
CV学习基础
脸部检测是基于图像的明暗变化模式进行判断,需要将图像先进行灰度化处理 马赛克处理需先将图像缩小然后夸大回原尺寸。 保存训练好的算法用joblib 进行以下操作时已经使用cv2.cvtColor()完成了灰度化 图像平滑化(模糊处理):cv…...
设计模式之禅之设计模式-原型模式
设计模式之禅之设计模式-原型模式 一:原型模式的定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 原型模式(Prototype Pattern)的简单程度仅次于单例模式和迭代器模式。正是由于简单,使用的场景才非常地多。 原型模式的核心是一…...
Spring的循环依赖问题
文章目录 1.什么是循环依赖2.代码演示3.分析问题4.问题解决5.Spring循环依赖6. 疑问点6.1 为什么需要三级缓存6.2 没有三级缓存能解决吗?6.3 三级缓存分别什么作用 1.什么是循环依赖 上图是循环依赖的三种情况,虽然方式有点不一样,但是循环依…...
RT-DETR算法改进:更换损失函数DIoU损失函数,提升RT-DETR检测精度
💡本篇内容:RT-DETR算法改进:更换损失函数DIoU损失函数 💡本博客 改进源代码改进 适用于 RT-DETR目标检测算法(ultralytics项目版本) 按步骤操作运行改进后的代码即可🚀🚀🚀 💡改进 RT-DETR 目标检测算法专属 文章目录 一、DIoU理论部分 + 最新 RT-DETR算法…...
【ICE】2:基于webrtc的 ice session设计及实现
工厂函数:CreateICESession_t 外部声明,sdk内部实现。创建IICESession :外部可见,内部也可见 /// Factory function prototype. How you get this factory will depend on how you are linking with /// this code. typedef IICESession *( *CreateICESession_t )( const…...
Vue组件传
跟禹神学vue--总结 1 父组件给子组件传递参数--props传参 (1)父组件中准备好数据 data() {return {todos:[{id:001,title:01,done:true},{id:002,title:02,done:false},{id:003,title:03,done:true}]} } (2)父组件中引入子组件…...
轻量封装WebGPU渲染系统示例<25>- 颜色附件数据更新替换(源码)
当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/ColorAttachmentReplace.ts 此示例基于此渲染系统实现,当前示例TypeScript源码如下: const rttTex0 { diffuse: { uuid: rtt0, rttTexture: {} } }; c…...
c语言练习第11周(1~5)
数列 1 1 2 3 5 8 13 21 ... 被称为斐波纳数列。 输入若干个正整数N,输出这个序列的前 N 项的和。 题干数列 1 1 2 3 5 8 13 21 ... 被称为斐波纳数列。 输入若干个正整数N,输出这个序列的前 N 项的和。输入样例3 5 4 1输出样例…...
阿里云国际站服务器如何升级内存容量?
阿里云服务器是阿里云供给的计算服务,它具有高效安稳、可扩展性强等特色,适用于各种应用环境。在运用阿里云服务器的过程中,或许会遇到内存容量缺乏的状况,这时候就需求晋级内存容量。那么,阿里云服务器怎么晋级内存容…...
神经网络(第二周)
一、简介 1.1 需求预测示例 1.1.1 逻辑回归算法 根据价格预测商品是否畅销。特征:T恤的价格;分类:销售量高1/销售量低0;使用逻辑回归算法进行分类,拟合效果如下图所示: 1.1.2 神经元和神经网络 将逻辑回…...
《网络协议》04. 应用层(DNS DHCP HTTP)
title: 《网络协议》04. 应用层(DNS & DHCP & HTTP) date: 2022-09-05 14:28:22 updated: 2023-11-12 06:55:52 categories: 学习记录:网络协议 excerpt: 应用层、DNS、DHCP、HTTP(URI & URL,ABNF…...
springboot自己添加的配置文件没有绿色叶子问题
在IntelliJ IDEA中,不同文件类型通常会有不同的图标,以便更容易识别它们。如果您的自己添加的 .properties 文件和项目中自动生成的 .properties 文件显示不同的图标,这可能是因为它们被识别为不同的文件类型。 通常情况下,Intel…...
【Java】定时任务 - Timer/TimerTask 源码原理解析
一、背景及使用 日常实现各种服务端系统时,我们一定会有一些定时任务的需求。比如会议提前半小时自动提醒,异步任务定时/周期执行等。那么如何去实现这样的一个定时任务系统呢? Java JDK提供的Timer类就是一个很好的工具,通过简单…...
SAP ABAP基础语法-Excel上传(十)
EXCEL BDS模板上传及赋值 上传模板事务代码:OAER l 功能代码:向EXCEL模板中写入数据示例代码如下 REPORT ZEXCEL_DOI. “doi type pools TYPE-POOLS: soi. *SAP Desktop Office Integration Interfaces DATA: container TYPE REF TO cl_gui_custom_c…...
记录一次某某虚拟机的逆向
导语 学了一段时间的XPosed,发现XPosed真的好强,只要技术强,什么操作都能实现... 这次主要记录一下我对这款应用的逆向思路 apk检查 使用MT管理器检查apk的加壳情况 发现是某数字的免费版本 直接使用frida-dexdump 脱下来后备用 应用分…...
upload-labs关卡7(基于黑名单的空格绕过)通关思路
文章目录 前言一、回顾上一关知识点二、靶场第七关通关思路1、看源代码2、空格绕过3、检查文件是否成功上传 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识,禁止用于做非法攻击。注意靶场是可以练习的平台,不能随意去尚未授权的网站做渗透测试…...
CnosDB 在最近新发布的 2.4.0 版本中增加对时空函数的支持。
CnosDB 在最近新发布的 2.4.0 版本中增加对时空函数的支持。 概述 时空函数是一种用于描述时空结构和演化的函数。它在物理学、数学和计算机科学等领域中都有广泛的应用。时空函数可以描述物体在时空中的位置、速度、加速度以及其他相关属性。 用法 CnosDB 将使用一种全新的…...
python实现炒股自动化,个人账户无门槛量化交易的开始
本篇作为系列教程的引子,对股票量化程序化自动交易感兴趣的朋友可以关注我,现在只是个粗略计划,后续会根据需要重新调整,并陆续添加内容。 股票量化程序化自动交易接口 很多人在找股票个人账户实现程序化自动交易的接口࿰…...
推荐系统笔记--Swing模型的原理
1--Swing模型的引入 在 Item CF 召回中,物品的相似度是基于其受众的交集来衡量的,但当受众的交集局限在一个小圈子时,就会误将两个不相似的物品定义为相似; Swing 模型引入用户的重合度来判断两个用户是否属于一个小圈子ÿ…...
Gemma-3-12b-it真实作品集:10组高质量图片问答对话效果分享
Gemma-3-12b-it真实作品集:10组高质量图片问答对话效果分享 1. 工具概览 1.1 核心能力简介 Gemma-3-12b-it是一款基于Google大模型技术开发的多模态交互工具,能够同时处理图片和文本输入,为用户提供智能问答服务。不同于常见的纯文本对话机…...
PCB设计新手必看:从布局到EMC的10个实用避坑技巧
PCB设计新手必看:从布局到EMC的10个实用避坑技巧 刚接触PCB设计时,总会在各种细节上栽跟头。记得我第一次画板子时,晶振离MCU太远导致时钟信号不稳定,调试了整整两天才找到问题。这种经历让我深刻意识到,PCB设计不仅是…...
突破SWE-agent测试瓶颈:并行执行架构深度优化指南
突破SWE-agent测试瓶颈:并行执行架构深度优化指南 【免费下载链接】SWE-agent SWE-agent takes a GitHub issue and tries to automatically fix it, using your LM of choice. It can also be employed for offensive cybersecurity or competitive coding challen…...
STM32F407+LAN9252 EtherCat从站开发避坑指南:从SSC配置到TwinCAT3联调全流程
STM32F407LAN9252 EtherCat从站开发实战:从零构建工业通信节点的完整指南 当工业4.0的浪潮席卷全球制造业时,EtherCat协议凭借其卓越的实时性能成为自动化领域的黄金标准。对于嵌入式开发者而言,掌握基于STM32和LAN9252的从站开发技术&#x…...
数据库安全与运维管控(一):MySQL、PG与Oracle原生审计机制对比
在满足等保2.0、SOC2 或金融合规审查时,“开启数据库审计”是硬性指标。合规要求企业必须记录“谁、在什么时间、执行了什么SQL、结果如何”。面对这个需求,开发和运维通常首先想到的是利用数据库引擎自带的原生审计功能。但在海量并发(高 QP…...
栈序列合法性验证:从原理到代码的深度解析
栈序列合法性验证:从原理到代码的深度解析📌问题定义:到底要验证什么?🧠核心原理:抓住出栈序列,就是解题关键📝分步推演:用例子看懂整个过程步骤1:验证出栈第…...
蚂蚁集团Linux驱动工程师面试经验与NPU开发解析
1. 蚂蚁集团Linux驱动工程师社招面经全解析作为一名在Linux驱动开发领域摸爬滚打多年的工程师,我最近参加了蚂蚁集团的社招面试。整个面试过程持续了近两小时,面试官主要围绕NPU/AI芯片相关的驱动开发经验展开深度考察。虽然最终因为业务匹配度问题未能如…...
Span<T>不是语法糖!透过CoreCLR源码看JIT如何为ref struct生成特殊栈帧——稀缺的底层机制白皮书
第一章:Span<T>不是语法糖!透过CoreCLR源码看JIT如何为ref struct生成特殊栈帧——稀缺的底层机制白皮书Span 是 C# 7.2 引入的 ref struct 类型,它**无法被装箱、不能作为字段存储在托管堆类中、也不允许跨 await 边界捕获**——这些限…...
被封杀三天后,龙虾带着“复仇版本“杀回来了
OpenClaw 4.5版本上线,能直接生成视频、图片和音乐。 有些故事,编剧都不敢这么写。 几天前,Anthropic对OpenClaw下了"封杀令"——只要系统提示词中出现OpenClaw的字样,Claude就会直接拒绝请求,返回一个冷冰…...
大卫小东(Sheldon)氯
Issue 概述 先来看看提交这个 Issue 的作者是为什么想到这个点子的,以及他初步的核心设计概念。?? 本 PR 实现了 Apache Gravitino 与 SeaTunnel 的集成,将其作为非关系型连接器的外部元数据服务。通过 Gravitino 的 REST API 自动获取表结构和元数据&…...

