当前位置: 首页 > news >正文

MyBatis的使用(XML映射文件)

MyBatis的使用(XML映射文件)

MyBatis基于注解开发简单便捷,但是弊端是失去SQL语句的灵活性,不能根据实际情况产生不同的SQL语句

MyBatis除了支持注解开发以外,还支持一种开发方式:XML映射文件,将SQL语句写到XML映射文件中,基于更多种的选择可以让SQL变得更加灵活

1.开发方式

1.和基于注解开发方式一样,有映射类/编写配置文件/编写Mapper持久层接口

2.将方法执行时候要运行的SQL语句放到XML文件中进行编写,提高灵活性

2.三重绑定
  • 接口与XML文件的绑定关系,在XML映射文件的namespace中声明绑定的接口的全类名

    <?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>
    

    必须还要在配置文件中声明xml文件位置,MyBatis才可以扫描到这些文件,扫描到与接口建立绑定关系

    mybatis.mapper-locations=classpath:mappers/*.xml
    
  • 接口中的方法与XML文件中标签的绑定关系

    如果接口中有一个方法,XML文件中就必须有对应的标签保存该方法对应的SQL语句

    根据方法功能的不同,提供四种标签:< select >、< update >、< delete >、< insert >

    public void deleteEmp(@Param("id") Integer id);
    

    标签必须给出id属性,属性就是对应的方法名称

    <delete id="deleteEmp">DELETE FROM emp WHERE id = #{id}
    </delete>
    
  • 查询语句的返回值类型与XML文件中标签属性的绑定关系

    如果执行的是DQL语句,< select >标签中除了要生命id为方法名之外,还需要声明一个属性resultType值为封装结果的全类名

    public Emp selectEmpById(@Param("id") Integer id);
    
    <select id="selectEmpById" resultType="com.itheima.entity.Emp">SELECT * FROM emp WHERE id = #{id}
    </select>
    
3.动态SQL概述

可以随着条件的改变随之发生改变的SQL语句就是动态SQL,在MyBatis中只有XML映射文件的方式支持动态SQL

  • 动态SQL使用-IF

    < if >标签的核心功能对条件进行判断,当条件为true,则标签中的内容参与SQL拼接,否则不参与

    if标签中有一个核心属性test,基于test传递条件可以进行判断

    (1)在test条件中可以直接获取本次参数的内容并且不需要加#{}

    (2)test条件中可以基于=、!=、>、>=、<、<=对数据进行判断,并且可以基于and或者or进行多条件连接

    <if test="empQuery.name != null and empQuery.name != ''">name LIKE CONCAT('%', #{empQuery.name}, '%')
    </if>
    

    **如果有多个test条件,那么除了第一个之外后续的条件需要加 前AND **

    <if test="empQuery.name != null and empQuery.name != ''">name LIKE CONCAT('%', #{empQuery.name}, '%')
    </if>
    <if test="empQuery.gender != null">AND gender = #{empQuery.gender} 
    </if>
    
  • 动态SQL使用-WHERE

    如果if经过了判断第一个条件前包含AND,基于where标签进行包裹可以自动将前AND去掉

    如果没有任何一个if满足,基于where标签进行包裹可以不在SQL中拼接WHERE

    SELECT *
    FROM emp
    <where><if test="empQuery.name != null and empQuery.name != ''">name LIKE CONCAT('%', #{empQuery.name}, '%')</if><if test="empQuery.gender != null">AND gender = #{empQuery.gender}  <!-- 注意:多个条件判断除了第一个之外剩余条件需要前AND --></if><if test="empQuery.begin != null">AND entrydate >= #{empQuery.begin}</if><if test="empQuery.end != null">AND entrydate &lt;= #{empQuery.end} <!-- <在XML中有特殊含义 需要被转义字符代替 --></if>
    </where>
    
  • 动态SQL使用-SET

    如果if经过了判断第一个更新字段包含前,,基于set标签进行包裹可以自动将前逗号去掉

    UPDATE emp
    <set><if test="emp.username != null and emp.username != ''">username = #{emp.username}</if><if test="emp.password != null and emp.password != ''">, password = #{emp.password}</if><if test="emp.name != null and emp.name != ''">, name = #{emp.name}</if><if test="emp.gender != null">, gender = #{emp.gender}</if>
    </set>
    WHERE id = #{emp.id}
    
  • 动态SQL使用-FOREACH

    foreach标签可以用于遍历接口中的集合/数组参数,在SQL语句中进行动态的拼接

    //基于集合删除员工信息
    public void batchDelete(@Param("deleteIds") List<Integer> deleteIds);
    
    <delete id="batchDelete">DELETE FROM emp WHERE id IN<foreach collection="deleteIds" item="deleteId" separator="," open="(" close=")">#{deleteId}</foreach>
    </delete>
    
  • 动态SQL使用-SQL

    SQL片段标签可以将XML文件重复的内容抽取出来,并且可以在多处复用

    当要使用指定SQL片段的内容进行拼接时,使用include标签

    <!-- SQL片段可以抽取XML文件中重复的内容 -->
    <sql id="BASE_COLUMN">id, username, password, name, gender, image, job, entrydate, dept_id
    </sql><select id="selectEmpById" resultType="com.itheima.entity.Emp">SELECT<include refid="BASE_COLUMN"></include>FROM empWHERE id = #{id}
    </select><select id="selectEmpListByCondition" resultType="com.itheima.entity.Emp">SELECT<include refid="BASE_COLUMN"></include>FROM emp
    </select>
    

相关文章:

MyBatis的使用(XML映射文件)

MyBatis的使用&#xff08;XML映射文件&#xff09; MyBatis基于注解开发简单便捷&#xff0c;但是弊端是失去SQL语句的灵活性&#xff0c;不能根据实际情况产生不同的SQL语句 MyBatis除了支持注解开发以外&#xff0c;还支持一种开发方式&#xff1a;XML映射文件&#xff0c…...

localhost知识

文章目录 一、localhost是什么&#xff1f;二、localhost 在平时用到的地方三、 localhost 与 127.0.01 一、localhost是什么&#xff1f; localhost 是一个特殊的主机名&#xff0c;通常指代本机。它被用来进行本地开发和测试&#xff0c;也常被用作网络配置中的占位符&#…...

PyTorch入门学习(八):神经网络-卷积层

目录 一、数据准备 二、创建卷积神经网络模型 三、可视化卷积前后的图像 一、数据准备 首先&#xff0c;需要准备一个数据集来演示卷积层的应用。在这个示例中&#xff0c;使用了CIFAR-10数据集&#xff0c;该数据集包含了10个不同类别的图像数据&#xff0c;用于分类任务。…...

【EI会议征稿】 2024年遥感、测绘与图像处理国际学术会议(RSMIP2024)

2024年遥感、测绘与图像处理国际学术会议(RSMIP2024) 2024 International Conference on Remote Sensing, Mapping and Image Processing 2024年遥感、测绘与图像处理国际学术会议(RSMIP2024)将于2024年1月19日-21日在中国厦门举行。会议主要围绕遥感、测绘与图像处理等研究领…...

MySQL 8 - 处理 NULL 值 - is null、=null、is not null、<> null 、!= null

处理 NULL 值&#xff1a; IS NULL&#xff1a;IS NULL 用于检查一个列是否为 NULL。例如&#xff0c;如果查找一个表中某一列的值为 NULL 的行&#xff0c;可以使用以下语法&#xff1a; SELECT * FROM table_name WHERE column_name IS NULL;IS NOT NULL&#xff1a;IS NOT N…...

高教社杯数模竞赛特辑论文篇-2018年C题:大型百货商场会员画像描述(附获奖论文及MATLAB代码实现)

目录 摘 要 一、问题重述 1.1 问题背景 1.2 问题提出 二、问题分析 2.1 问题一的分析...

#力扣:2315. 统计星号@FDDLC

2315. 统计星号 - 力扣&#xff08;LeetCode&#xff09; 一、Java class Solution {public int countAsterisks(String s) {int cnt 0;boolean flag true;for(char c: s.toCharArray()) {if(c |) flag !flag;else if(c * && flag) cnt;}return cnt;} }...

设计模式——单例模式详解

目录 设计模式类型单例模式单例模式方式饿汉式静态常量方式静态代码块形式 懒汉式线程不安全&#xff08;不推荐&#xff09;懒汉式优化&#xff08;不推荐&#xff09; 双重检查&#xff08;推荐方式&#xff09;静态内部类&#xff08;推荐方式&#xff09;枚举方式&#xff…...

一、W5100S/W5500+RP2040树莓派Pico<静态配置网络信息>

文章目录 1. 前言2. 相关网络信息2.1 简介2.2 优点2.3 应用 3. WIZnet以太网芯片4. 静态IP网络设置示例讲解以及使用4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 编译烧录 5. 注意事项6. 相关链接 1. 前言 从本章开始我们将用WIZnet的W5100S/W5500以太网芯片结合RP…...

【C++的OpenCV】第十四课-OpenCV基础强化(二):访问单通道Mat中的值

&#x1f389;&#x1f389;&#x1f389; 欢迎各位来到小白 p i a o 的学习空间&#xff01; \color{red}{欢迎各位来到小白piao的学习空间&#xff01;} 欢迎各位来到小白piao的学习空间&#xff01;&#x1f389;&#x1f389;&#x1f389; &#x1f496;&#x1f496;&…...

elementUI el-collapse 自定义折叠面板icon 和 样式 或文字展开收起

: :v-deep{.el-collapse-item__arrow {width: 40px;}.el-icon-arrow-right:before {content: "展开";font-size: 15px;font-family: heiti;color: #2295ff;font-weight: bold;}.el-collapse-item__arrow.is-active {transform: none;}.el-collapse-item__arrow.is-a…...

如何用个人数据Milvus Cloud知识库构建 RAG 聊天机器人?(上)

生成式人工智能时代,开发者可以借助大语言模型(LLM)开发更智能的应用程序。然而,由于有限的知识,LLM 非常容易出现幻觉。检索增强生成(RAG)https://zilliz.com/use-cases/llm-retrieval-augmented-generation 通过为 LLM 补充外部知识,有效地解决了这一问题。 在 Chat …...

2023年江西省“振兴杯”工业互联网安全技术技能大赛暨全国大赛江西选拔赛 Write UP

文章目录 一、协议分析 - modbus二、协议分析 - 异常的流量三、协议分析 - S7Error四、协议分析 - OmronAttack五、组态编程 - 工程的秘密六、组态编程 - 工程的秘密七、组态编程 - 简单的计算八、组态编程 - 交通灯九、组态编程 - 有趣的转盘十、应急处置 - 登录日志分析十一、…...

PostMan 之 Mock 接口测试

在测试的时候经常会碰到后端开发工程师的接口还没有开发完成&#xff0c;但是测试任务已经分配过来。没有接口怎么测试呢&#xff1f; 测试人员可以通过 mock server 自己去造一个接口来访问。mock server 可用于模拟真实的接口。收到请求时&#xff0c;它会根据配置返回对应的…...

LuatOS-SOC接口文档(air780E)--libgnss - NMEA数据处理

示例 -- 提醒: 本库输出的坐标,均为 WGS84 坐标系 -- 如需要在国内地图使用, 要转换成对应地图的坐标系, 例如 GCJ02 BD09 -- 相关链接: https://lbsyun.baidu.com/index.php?titlecoordinate -- 相关链接: https://www.openluat.com/GPS-Offset.html-- 方案1, 经lua层进行数…...

基于华为云 IoT 物联网平台实现家居环境实时监控

01 智能家居环境监测 智能家居环境监测采用 Ruff 开发板作为主控&#xff0c;串口线连接温湿度传感器 DHT11 和空气质量传感器 SDS011&#xff0c;每5分钟采集一次数据&#xff0c;通过 MQTT 协议发送到华为云 IoT 物联网平台&#xff0c;并基于数据分析服务实时计算出整个家庭…...

【开源框架】Glide的图片加载流程

本篇文章从Glide 4.11源码入手&#xff0c;简单的分析整个图片请求的流程&#xff0c;本着 ”只见树林&#xff0c;不见树木“ 的原则&#xff0c;宏观请求流程&#xff0c;不细究实现细节&#xff08;细节留坑埋点&#xff0c;之后慢慢写&#xff09; 引入依赖 以下的所有分…...

win10下Mariadb绿色版安装步骤

使用绿色版的mariadb数据库管理软件&#xff0c;免费开源&#xff0c;可以用来替换MySQL。首先从mariadb官网下载绿色版本的压缩包。解压后、配置好即可以使用。 把他解压缩到C:\mariadb\之下。打开powershell&#xff1a; Cd c:\mariadb\bin .\mysql_install_db.exe 这一…...

wiresharak捕获DNS

DNS解析&#xff1a; 过滤项输入dns&#xff1a; dns查询报文 应答报文&#xff1a; 事务id相同&#xff0c;flag里 QR字段1&#xff0c;表示响应&#xff0c;answers rrs变成了2. 并且响应报文多了Answers 再具体一点&#xff0c;得到解析出的ip地址&#xff08;最底下的add…...

vue源码分析(一)——源码目录说明

文章目录 一、如何下载源码&#xff08;可忽略&#xff09;&#xff08;1&#xff09;打开地址&#xff08;2&#xff09;复制链接&#xff08;3&#xff09;git clone 链接 二、源码目录说明1.可以根据你下载的源码通过package.json文件查看vue版本2.源码目录说明 一、如何下载…...

【深度学习】吴恩达课程笔记(二)——浅层神经网络、深层神经网络

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 笔记链接 【深度学习】吴恩达课程笔记(一)——深度学习概论、神经网络基础 吴恩达课程笔记——浅层神经网络、深层神经网络 四、浅层神经网络1.双层神经网络表示2.双层神经网络的前向传播第一层前向传播第二层前…...

UI自动化概念 + Web自动化测试框架介绍

1.UI自动化测试概念:我们先明确什么是UI UI&#xff0c;即(User Interface简称UI用户界面)是系统和用户之间进行交互和信息交换的媒介 UI自动化测试: Web自动化测试和移动自动化测试都属于UI自动化测试&#xff0c;UI自动化测试就是借助自动化工具对程序UI层进行自动化的测试 …...

在 macOS 上的多个 PHP 版本之间切换

文章目录 前言一、前提条件1.引入库需要安装 Xcode 2.安装多个PHP版本2.PHP版本切换 开源替代品 前言 不同项目使用php版本可能不同&#xff0c;需要安装不同版本php 一、前提条件 1.引入库 需要安装 Xcode 命令行工具和Homebrew xcode-select --install检查brew是否已安…...

地址解析协议ARP

地址解析协议&#xff08;Address Resolution Protocol&#xff0c;ARP&#xff09;&#xff0c;用于根据本网内目的主机或默认网关的IP地址获取其MAC地址。 ARP的基本思想&#xff1a;在每一台主机中设置专用内存区域&#xff0c;称为ARP高速缓存&#xff08;也称为ARP表&…...

Go学习第十三章——Gin入门与路由

Go web框架——Gin入门与路由 1 Gin框架介绍1.1 基础介绍1.2 安装Gin1.3 快速使用 2 路由2.1 基本路由GET请求POST请求 2.2 路由参数2.3 路由分组基本分组带中间件的分组 2.4 重定向 1 Gin框架介绍 github链接&#xff1a;https://github.com/gin-gonic/gin 中文文档&#xf…...

[减脂期食谱] 自制千岛酱

[减脂期食谱] 自制千岛酱 成品如下&#xff1a; 最中间的那个&#xff0c;算比较居中的颜色吧&#xff0c;其实自己家做原版的千岛酱还是比较简单的&#xff0c;它的底就是蛋黄酱(蛋黄油乳化的酱)&#xff0c;随后里面的材料比较自由&#xff0c;维基百科是这么介绍的&#xf…...

Android 系统架构

目录 Android 系统架构 1. Android 应用层 2. Android应用框架层 2.1 Activity Manager &#xff08;活动管理器&#xff09; 2.2 Window Manager &#xff08;窗口管理器&#xff09; 2.3 Content Provider (内容提供器) 2.4 View System&#xff08;视图系统&a…...

【Docker】Python Flask + Redis 练习

一、构建flask镜像 1.准备文件 创建app.py,内容如下 from flask import Flask from redis import Redis app Flask(__name__) redis Redis(hostos.environ.get(REDIS_HOST,127.0.0.1),port6379)app.route(/) def hello():redis.incr(hits)return f"Hello Container W…...

shell_52.Linux测试与其他网络主机的连通性脚本

实战演练 本节将展示一个实用脚本&#xff0c;该脚本在处理用户输入的同时&#xff0c;使用 ping 命令或 ping6 命令来测试与其他网络主机的连通性。 ping 命令或 ping6 命令可以快速测试网络主机是否可用。这个命令很有用&#xff0c;经常作为首选工具。如果只是检查单个主机&…...

OpenCV C++ 图像处理实战 ——《缺陷检测》

OpenCV C++ 图像处理实战 ——《缺陷检测》 一、结果演示二、缺陷检测算法2.1、多元模板图像2.2、训练差异模型三、图像配准3.1 功能源码3.1 功能效果四、多元模板图像4.1 功能源码五、缺陷检测5.1 功能源码六、源码测试图像下载总结一、结果演示...