MyBatis---多表查询,动态sql的详细介绍

news2025/4/18 12:53:09

目录

1.命名规则

1.resultMap(对应类属性名称与数据库字段名称)

2.多表查询(ResultMap)

1.创建articleInfo类

2.创建ArticleMapper.xml配置文件和ArticleMapper接口

①:不建议使用 (文件之间耦合严重)

②常用的写法(将文件之间尽可能的解耦)

3.动态sql

1.<if>标签

2.<trim>标签 

3.<where>标签

①在where后面加1=1

②使用标签

4.<set> 标签 

5.<foreach>标签


1.命名规则

还有一个问题,在上面代码中我们数据库字段的命名和Java类中的命名是一一对应并且相等的

但是在我们实际开发中,数据库字段和Java的命名规则并不相同

  • 数据库命名:字母小写,用下划线分割,比如user_name
  • Java属性命名:小驼峰,比如:userName

那么我们应该如何将他们对应起来呢?

1.resultMap(对应类属性名称与数据库字段名称)

我们设置Java类中的userName,和passWord字段与数据库中的名称不一样,

此时我们使用resultMap来将他们一一映射起来(只需要映射字段名称不相同的即可)

测试查询方法:

结果如下:

可以看到虽然数据库字段名称与Java类中的属性名称不一样,但是我们通过resultMap查询到了数据

2.多表查询(ResultMap)

一般项目中很少用,因为写法复杂,并且运行效率不高,交给数据库去实现,时间不可控

对性能要求高的项目几乎不会用,尤其是面向用户的项目

比如:根据文章id获取文章相关信息,然后根据作者id获取作者信息

1.创建articleInfo类

@Data
public class ArticleInfo {
    private Integer id;
    private String title;
    private String content;
    private Date createtime;
    private Date updatetime;
    private Integer rcount;
    // 作者相关信息
    private User user;
}

2.创建ArticleMapper.xml配置文件和ArticleMapper接口

在ArticleMapper接口写方法

根据文章id获取文章相关信息,然后根据作者id获取作者信息

①:不建议使用 (文件之间耦合严重)

xml中代码 

查询到了结果

②常用的写法(将文件之间尽可能的解耦)

在文章类中只把我们需要的字段传入进来

在xml文件中传属性即可

可以看到同样是查询到了结果,但是这个方法比起刚才的方法,不需要去调用另一个xml文件里的代码,将两个xml文件解耦,我们在写项目的时候一定要尽量避免文件之间耦合

3.动态sql

动态 sql 是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接, 根据输入情况的不同,拼接生成不同的sql语句,不至于sql语句因此运行失败
有些字段是有默认值的,所以不能统一赋值为null
我们先来看一下正常情况下:
所有字段全部传入数据:(使用了三个字段来测试)  
可以看到运行成功,数据库也添加成功

那么如果我们只传一部分数据呢? 

比如我们之传入题目和用户id,来测试一下:

 

我们发现同样是运行成功了,但是他的值却为空,但这是在我们没有默认值的情况下,如果我们有默认值,那么为空可能会带来意想不到的后果

 那么我们应该如何解决呢?

1.<if>标签

我们使用if标签如果用户传入数据,就设置成用户传入的数据,如果没有传入数据,就设置为默认值或者null

如果所有字段都可以不传数据呢?那我们把全部字段使用<if>包起来就可以了吗?

显而易见,如果有用户第一个数据不传或者最后一个数据不传,那么逗号的位置我们没办法放置,有可能会多一个逗号,此时我们就可以使用另外一个标签

2.<trim>标签 

这样就可以解决逗号放置的问题了,

注意如果什么都不填写,还是会报错的,但是这个场景不太符合实际,因为什么都不填,那也不需要插入数据了,这种情况在前端就直接pass了,也不会传到后端来

3.<where>标签

 我们在购物的时候,经常会去筛选一些条件,这样的动态sql语句应该如何拼接呢?

此时我们传入两个参数

发现查询到了结果 

那如果我们之传入第二个参数呢?

 

 报错了,where后面直接跟的是and,第一个数据不传,结果where和and中间的数据没有了,造成sql语句报错,那么该如何解决呢?

①在where后面加1=1

这样1=1在第一条语句,就不用担心第一条语句为空的情况了

②使用<where>标签

他会自动的为我们添加合理的and,并且如果后面没有数据传入,它会将where关键字也去掉

 此时我们不传第一条数据,也运行成功了

 一条数据也不传,也运行成功了

4. <set>标签 

<set>标签作用 

当我们更新多个字段的时候,也会发生与where同样的情况

所以我们直接使用<set>标签,并且如果后面没有数据传入,它会将set关键字也去掉,但是后面没有数据,也没有更新的必要了不是(在前端就会被拦截)

5.<foreach>标签

批量操作的时候  ,比如批量插入,删除以及更新数据

 例如:批量删除id2-4的数据

 测试:

查看运行结果:

 成功删除了id为2,3,的文字,因为id为4的文章不存在,所以只删除了两条数据

同理,添加,更新等批量操作都是如此,小伙伴们可以下来自己去试试,操作一下

到这里,我们mybatis的学习就告一段落啦~~我们下篇博客见~

 

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

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

相关文章

十大排序算法详解

目录 1. 冒泡排序 a. 思路 b. code 2. 插入排序 a. 思路 b. code 3. 希尔排序【插入排序plus】 a. 思路 b. code 4. 选择排序 a. 思路 b. code 5. 基数排序 a. 前置知识 b. 思路 c. code 6. 计数排序 a. 思路 b. code 7. 桶排序&#xff08;计数排序plus &…

怎么在shell中查看python版本以及降低anaconda的python版本

输入命令 python --version 电脑anaconda的python版本为3.11&#xff0c;如何降低版本 &#xff0c;输入命令 conda install python3.9 当安装完anaconda后&#xff0c;ubuntu系统的shell命令行最前面会出现base字样&#xff0c;此时要退出&#xff0c;就输入命令 conda deacti…

如何开启QQ邮件的SMTP服务以及如何使用Python发送邮件

如何开启QQ邮件的SMTP服务以及如何使用Python发送邮件 &#x1f607;博主简介&#xff1a;我是一名正在攻读研究生学位的人工智能专业学生&#xff0c;我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑&#xff0c;欢迎随时来交流哦&…

Qt应用开发——Drag and Drop

目录 一、前言 二、相关事件和类 三、实例 拖动文件到编辑框 一、前言 在实际场景中&#xff0c;经常会有导入文件的需求。导入文件一般两种方式&#xff0c;第一种QFileDialog显示一个文件选择窗口&#xff0c;选择后处理和显示。第二种就是使用拖放机制实现。还有在一些制…

.faust加密勒索数据库恢复---惜分飞

有客户的win服务器被勒索病毒加密,里面运行有用友系统的Oracle数据库&#xff0c;加密提示为&#xff08;camry2020aol.com&#xff09;&#xff1a; 加密的数据文件类似&#xff08;.DBF.id[0E564ACA-3493].[camry2020aol.com].faust&#xff09;: 通过工具检测发现少量bl…

(2)前端控制器的扩展配置, 视图解析器类型以及MVC执行流程的概述

SpringMVC入门程序的扩展说明 注册前端控制器的细节 在web.xml文件注册SpringMVC的前端控制器DispatcherServlet时使用url-pattern标签中使用/和/*的区别 /可以匹配.html或.js或.css等方式的请求路径,但不匹配*.jsp的请求路径/*可以匹配所有请求(包括.jsp请求), 例如在过滤器…

Kotlin空安全类型之平台类型

前言 众所周知,Kotlin的空安全很方便,能避免绝大部分的空安全问题 一般类型分为: 可空类型如 String? 不可空类型 String其中可空类型的String?可以赋值null或String类型的值,在使用时必须显式的进行空处理 而不可空类型的String,只能赋值String类型,无法向其赋值null,使用时…

JAVA基础-Stream流

引言 Java 8 版本新增的Stream&#xff0c;配合同版本出现的Lambda &#xff0c;给我们操作集合&#xff08;Collection&#xff09;提供了极大的 便利。Stream流是JDK8新增的成员&#xff0c;允许以声明性方式处理数据集合&#xff0c;可以把Stream流看作是遍历数据集 合的一个…

【后端面经-Java】Java基本概念

【后端面经-Java】Java基本概念&#xff09; 1. 面向对象和面向过程1.1 概念1.2 优缺点对比 2. C和Java的区别2.1 "去其糟粕"——Java同学&#xff0c;你对C的这些东西有什么意见&#xff1f;2.2 改进之处————Java同学&#xff0c;你的这个论文&#xff0c;&…

伦敦金投资仓位控制的方法

留意本栏目过去的文章的朋友都会发现&#xff0c;其实小编认为资金管理很重要&#xff0c;甚至重要性超过技术分析找到入场机会。在资金管理中&#xff0c;关于仓位的控制是一门很大的学问&#xff0c;在伦敦金投资中&#xff0c;仓位的控制关系到我们盈亏的多少&#xff0c;甚…

利用百度地图做个亚洲范围地震可视化特效果

地图叠加等值面效果&#xff0c;绘制掩体模型 地震闪动特效 地震热力图效果

【人工智能】局部搜索算法、爬山法、模拟退火、局部剪枝、遗传算法

文章目录 局部搜索算法内存限制局部搜索算法示例:n-皇后爬山算法随机重启爬山模拟退火算法局部剪枝搜索遗传算法小结局部搜索算法 在某些规模太大的问题状态空间内,A*往往不够用 问题空间太大了无法访问 f 小于最优的所有状态通常,甚至无法储存整个边缘队列解决方案 设计选择…

vue-cli脚手架创建创建的项目打包后无法正常打开报 Failed to load resource: net::ERR_FILE_NOT_FOUND错误

亲爱的小伙伴们&#xff0c;你们最近是否有遇到用使用最新的脚手架打包项目后index.html文件无法正常打开&#xff0c;然后控制台报错的情况呢&#xff0c;不要担心&#xff0c;这个坑今天被我踩到了并且被我解决了&#xff0c;下边就让我来给大家分享一下经验吧&#xff01; …

树莓派4B通过wiringP库实现串口通信的实验

1.实现串口通信前的准备 树莓派4b实现与其它设备之间的串口通信需要做一些配置&#xff0c;可以点进这篇文章进行查看参考文章 wiringPi库串口相关的API参考文章链接wiringPI库串口API 2.实现单个字符的发送 #include <stdio.h> #include <wiringPi.h> #includ…

MFC第二十一天 CS架构多页面开发与数据交互、CImageList图像列表介绍 、CListCtrl-SetItem设置列表项的方法

文章目录 CImageList图像列表介绍CListCtrl图标的原理CListCtrl列表图标设置CListCtrl-SetItem设置列表项的方法 CS架构多页面开发与数据交互添加用户实现向导多页数据交互pch.hCLientXq.h CAppCPage1.hCPage1.cppCPage2.hCPage2.cppCWorkerDlg .hCWorkerDlg.cpp 多页数据修改C…

javascript实现九九乘法表

乘法表是初学者学习乘法基础的一个重要工具&#xff0c;同时也是程序员实践编程技能的一个常见项目。在本文中&#xff0c;我将介绍如何使用JavaScript实现一个简单的乘法表。 首先&#xff0c;我们需要明确乘法表的基本结构。乘法表通常是一个正方形的表格&#xff0c;包含从…

Ubuntu22.04部署K8s集群

Ubuntu22.04部署K8s集群 一、基础环境准备1.1 VMware Workstation Pro 17.01.2 Ubuntu22.04 二、系统环境配置2.1 设置Master与工作节点的机器名称及配置2.2 解析主机2.3 虚拟内存swap分区关闭2.4 开启IPv4转发2.5 设置时间同步2.6 开启防火墙的端口&#xff08;可选&#xff0…

【Spring Boot Admin】使用(整合Spring Security服务,添加鉴权)

Spring Boot Admin 监控平台 背景&#xff1a;Spring Boot Admin 监控平台不添加鉴权就直接访问的话&#xff0c;是非常不安全的。所以在生产环境中使用时&#xff0c;需要添加鉴权&#xff0c;只有通过鉴权后才能监控客户端服务。本文整合Spring Security进行实现。 pom依赖 …

前端开发实习总结参考范文(合集)

▼前端开发实习总结篇一 今天就简单聊聊上面的StrutsSpringHibernate吧。 Struts 代表&#xff1a;表示层;Spring代表&#xff1a;业务逻辑层;Hibernate则代表持久层。他们是目前在Java Web编程开发中用得最多的框架&#xff0c;其实这样区分是为了适应软件开发过程中各个分工…

SOC FPGA介绍及开发设计流程

目录 一、SoC FPGA简介 二、SoC FPGA开发流程 2.1 硬件开发 2.2 软件开发 一、SoC FPGA简介 SOC FPGA是在FPGA架构中集成了基于ARM的硬核处理器系统(HPS)&#xff0c;包括处理器、外设和存储器控制器。相较于传统的仅有ARM处理器或 FPGA 的嵌入式芯片&#xff0c;SOC FPGA既…