Mybatis-xml和动态sql

在这里插入图片描述

xml映射方式

在这里插入图片描述

除了之前那种

@select(语句)
public void ...();

通过注解定义sql语句,还可以通过xml的方式来定义sql语句
在这里插入图片描述
注意
在resource创建的是目录,要用斜线分隔
在这里插入图片描述
创建出文件后
先写约束

<?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属性,对应接口全类名的字符串
这样就能获取接口全类名
在这里插入图片描述
然后就在mapper里面定义语句
id对应接口里面的方法名
查询语句多一个resultType用来表示单条记录所封装的类型

List<Emp>单条记录封装的类型,就是Emp员工对象,不过要全类名

还是复制一下
在这里插入图片描述
然后就ok了
在这里插入图片描述

底层

mybatis底层
当调用EmpMapper这个接口中list方法时Mybatis框架会自动去查找namespace属性和该接口全类名相同的xml映射文件
且在该xml文件找到id属性值与list(方法名)相同的sql语句
最终运行对应sql语句

使用场景

简单的sql语句可以直接用注解来
复杂的sql语句用xml映射文件比较好

在这里插入图片描述

MybatisX

可以下载该插件来更明显的看接口和xml之间的关系
包含方法对应sql语句
在这里插入图片描述
下完后,你点击方法或sql会跳到对应的的小鸟会跳到它对应方法/sql语句

蓝鸟对应接口和xml里面的sql
红鸟对应xml文件和接口里面的方法

在这里插入图片描述

动态sql语句

在这里插入图片描述

看我们之前写的语句
都是写死了三个条件
如果没输出是不是就是null,三个null是不是就查询不到数据
但一般我们如果上面都不加的默认应该显示所有数据,所以我们需要动态sql
就是需要实现:指定哪个用那个查询,指定name就用name查询,不要带上gender和后面的
mybatis提供了一个动态sql标签
if,用来做条件判断来实现动态sql
改造前
在这里插入图片描述
改造后
在这里插入图片描述

if标签

在这里插入图片描述

在这里插入图片描述

进行代码的修改后
在这里插入图片描述
但其实这个代码是有bug的
当name=null,而gender=1,其他都null
这样的话
对应执行的sql语句是
在这里插入图片描述

select * from emp where and gender=1; 

无缘无故多了个and,肯定会报错
而且当你所有都传null时
执行

select * from emp where;

也不合理
怎么解决呢?
用where标签
把这个where变成

<where>
<if test="name!=null">
name like contact('%',#{name},'%')
</if>
...
</where>

这样

where标签的作用

1.当你里面的条件一个都不成立的时候,就不会生成where关键字(动态生成where)
2.会自动清除条件前面多余的and或者是or
在这里插入图片描述

set标签

set标签会取出掉字段之后多余的逗号
在这里插入图片描述

原先更新案例
在这里插入图片描述
固定死一定要全部更改
在这里插入图片描述
如果我这样写代码
本意是不想更新入职时间那些的
在这里插入图片描述

但实际上会把那些变为null
所以需要更改
在这里插入图片描述
用if标签来做呗
先删除注解
然后我们这个EmpMapper这个会报错
因为xml文件没有对应的标签
直接按alt+enter生成对应标签(点第一个)
在这里插入图片描述
对应的生成
在这里插入图片描述

自己往里面填入我们想要的逻辑
在这里插入图片描述
当然这样也不是完全对的
当你只更新username的时候
在这里插入图片描述
执行的语句就是
显然不对(其实只要没更新updatetime就不对,就它后面没逗号)

update emp set username=? , where id =?

所以提供了一个标签
把set关键字替换成

<set>
<if test="usrename!=null">username=#{username},</if>
...
</set>

set标签作用

set标签会取出掉字段之后多余的逗号

foreach标签

一般用于批量操作当中
在这里插入图片描述

批量删除操作
在这里插入图片描述
对应的我们的方法要传一个集合
在这里插入图片描述
我们肯定是要遍历集合里面的元素而不是集合本身
foreach就能来遍历集合里面的元素
注意open和close
(#{id},#{id}…)差不多能理解吧
注意每个属性的用处
在这里插入图片描述

sql&include

在这里插入图片描述

这样写代码复用性差
后期如果要修改要一个一个改
java里增强代码复用性:提取成方法呗
但这个是xml
我们需要用sql标签和include
在这里插入图片描述
sql和include搭配使用
sql负责定义语句
include负责语句的位置
在这里插入图片描述
这个sql标签要定义对应的id
在xml文件里直接写就行
在这里插入图片描述
然后原来select id… from emp
可以全部改写

<include refid="对应的id"/>

sql片段的抽取和引用就完成了
在这里插入图片描述

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

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

相关文章

HAProxy负载均衡集群

目录 1.1 常用的负载均衡调度器 1.2 Haproxy的简介 2.LVS、Nginx、HAproxy的区别&#xff1a; nginx LVS HAProxy 3.Haproxy搭建 Web 群集 3.1 haproxy 服务器部署 1.关闭防火墙&#xff0c;将安装Haproxy所需软件包传到/opt目录下 2.编译安装 Haproxy 3.Haproxy服务…

event.stopPropagation()和event.preventDefault()之间的联系

目录 阻止事件冒泡&#xff0c;阻止默认事件&#xff0c;event.stopPropagation()和event.preventDefault()&#xff0c;return false的区别 今天来看看前端的冒泡和事件默认事件如何处理 1.event.stopPropagation()方法 这是阻止事件的冒泡方法&#xff0c;不让事件向documen上…

羊驼再度进化,“长颈鹿版”LongLLaMA 来啦,上下文长度冲向 100K ,性能不减

文 | 小戏、ZenMoore 要说当下制约大模型释放更大规模潜力的桎梏&#xff0c;除了机器幻觉&#xff0c;肯定当属受限的上下文长度&#xff0c;前两天微软的 LongNet 正将 Transformer 的上下文长度扩展到夸张的 10 亿量级&#xff0c;这两天撑起了开源大模型一片天的 LLaMA 家族…

Linux 学习记录48(QT篇待完成)

Linux 学习记录48(QT篇) 本文目录 Linux 学习记录48(QT篇)一、1.2. 二、三、四、练习1. 自制文本编辑器(0. main.cpp(1. txt_window.h(2. txt_window.cpp 2. 登录界面完善 一、 1. 2. 二、 三、 四、 练习 1. 自制文本编辑器 (0. main.cpp #include "txt_window.h…

自定义对象作为HashMap的键,同时重写hashCode和equals方法

如果要将自定义类的实例 作为HashMap的 键&#xff0c;必须重写hashCode和equals方法 简单版本&#xff0c;看不懂看后面复杂版本解释 复杂版本解释 当我们用 HashMap存入自定义的类时&#xff0c;如果不重写这个自定义类的equals和hashCode方法&#xff0c;得到的结果会和我们…

MySQL库表操作作业

创建数据库 mysql> create database Market; mysql> use Market; 创建表和约束 mysql> create table customers(c_num int(11) primary key not null UNIQUE Key auto_increment , -> c_name varchar(50), -> c_city varchar(50), -> c_birth datetime…

【华为认证】HCIP-Datacom 2023最新题库

正在备考华为认证的小伙伴应该知道&#xff0c;除了理论知识外&#xff0c;刷题也相当重要&#xff0c;周工这里有一份HCIAHCIP-Datacom带解析的最新题库 点赞留言 即可领取。 1. &#xff08;多选题&#xff09;ISIS的Hello报文主要分为哪几种类型? A.P2P LAN IIH B.…

Pytorch-ResNet50-MINIST Classify 网络实现流程

分两个文件讲解&#xff1a;1、train.py训练文件 2、test.py测试文件. 1、train.py训练文件 1&#xff09;从主函数入口开始&#xff0c;设置相关参数 # 主函数入口 if __name__ __main__:# ----------------------------## 是否使用Cuda# 没有GPU可以设置成Fasle# -…

SPEC CPU 2006 在 CentOS 5.0 x86_64 古老系统测试【2】

上一篇 SPEC CPU 2006 在 CentOS 5.0 x86_64 古老系统测试_hkNaruto的博客-CSDN博客 虚拟机时间&#xff0c;一天后获得结果 由于ssh版本太低&#xff0c;采用nc把文件拷贝出来 结果 SPEC CFP2006 Result Copyright 2006-2023 Standard Performance Evaluation Corporatio…

SpringBoot集成Quartz集群模式

<!-- quartz定时任务 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency> 单机版本&#xff1a; SpringBoot集成Quartz动态定时任务_jobgroupname_小…

09_Linux内核定时器

目录 Linux时间管理和内核定时器简介 内核定时器简介 Linux内核短延时函数 定时器驱动程序编写 编写测试APP 运行测试 Linux时间管理和内核定时器简介 学习过UCOS或FreeRTOS的同学应该知道, UCOS或FreeRTOS是需要一个硬件定时器提供系统时钟,一般使用Systick作为系统时钟…

人工智能(pytorch)搭建模型17-pytorch搭建ReitnNet模型,加载数据进行模型训练与预测

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型17-pytorch搭建ReitnNet模型&#xff0c;加载数据进行模型训练与预测&#xff0c;RetinaNet 是一种用于目标检测任务的深度学习模型&#xff0c;旨在解决目标检测中存在的困难样本和不平衡…