MyBatis-03

MyBatis

1.联查

1.1 一对一

例如,有user表和address表,其中每一个用户可以有多个地址,每个地址只能对应一个用户

以address表为主表,user表为副表,通过address表联查user表的形式就是一对一

如何进行一对一查询?

首先,在vo包下创建一个AddressAndUserVO类,并在mapper包下的IAddressMapper接口中定义一个抽象方法

package com.tledu.mydemo.vo;import com.tledu.mydemo.entity.User;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** ClassName: AddressAndUserVO* Pacakage: com.tledu.mydemo.vo* Description:** @Author: 刘松泽* @Create 2024/3/27 11:07* @Version 1.0*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AddressAndUserVO {private Integer id;private String addr;private String phone;private String postcode;private Integer userId;private User user;
}
/*** 一对一的联查 主表为t_address 副表为t_user* @param id* @return*/
AddressAndUserVO getAddressAndUser(int id);

然后,到对应的xml文件中

    <resultMap id="AddressAndUserMap" type="AddressAndUserVO" autoMapping="true"><id column="id" property="id"/><result column="user_id" property="userId"/><association property="user" javaType="User" column="user_id" autoMapping="true"><id column="uid" property="id"/></association></resultMap><!--联查 一对一-->
<select id="getAddressAndUser" parameterType="int" resultMap="AddressAndUserMap">select ta.*, tu.*, tu.id as uidfrom t_address as taleft join t_user as tu on ta.user_id = tu.idwhere ta.id = #{id}
</select>

1.2 一对多

还是以user表和address表为例,以user表为主表,address表为副表,通过user表联查address表的形式就是一对多

如何进行一对多查询?

首先,在vo包下创建一个UserAndAddressVO类,在mapper包下的IUserMapper接口中定义一个抽象方法

package com.tledu.mydemo.vo;import com.tledu.mydemo.entity.Address;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;/*** ClassName: UserAndAddressVO* Pacakage: com.tledu.mydemo.vo* Description:** @Author: 刘松泽* @Create 2024/3/27 11:07* @Version 1.0*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserAndAddressVO {private Integer id;private String username;private String password;private String nickname;private Integer type;private List<Address> addressList;
}
/*** 一对多的联查 主表为t_user 副表为t_address* @param id* @return*/
UserAndAddressVO userAndAddress(int id);

然后,到对应的xml文件中

    <resultMap id="UserAndAddressMap" type="userAndAddressVO" autoMapping="true"><id column="id" property="id"/><collection property="addressList" column="id" javaType="list" ofType="com.tledu.mydemo.entity.Address"autoMapping="true"><id column="aid" property="id"/><result column="user_id" property="userId"/></collection></resultMap><!--联查 一对多-->
<select id="userAndAddress" parameterType="int" resultMap="UserAndAddressMap">select tu.*, ta.*, ta.id as aidfrom t_user as tuleft join t_address as ta on tu.id = ta.user_idwhere tu.id = #{id}
</select>

2.事务

2.1 事务的四大特性(ACID)

① 原子性:不可再分

② 一致性:对数据库影响前后数据保持一致

③ 隔离性:处理数据的请求之间时隔离的

④ 持久性: 对数据库的影响是持久的

2.2 隔离机制

① 读未提交

② 读已提交(默认隔离机制)

③ 可重复读

④ 序列化

3.分页

3.1 为什么要分页?

当数据特别多的时候,单次请求返回大量的数据会消耗很多时间。对于数据量特别大的查询,我们都会采用分页查询

3.2 如何分页?

(1)手动分页

首先,在dto包下创建一个类帮助我们进行分页相关的计算

例如

package com.tledu.mydemo.dto;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** ClassName: PageUtilDTO* Pacakage: com.tledu.mydemo.dto* Description:** @Author: 刘松泽* @Create 2024/3/27 16:15* @Version 1.0*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageUtilDTO {private Integer pageNum;	//要获取第几页private Integer pageSize;   //每一页的数据个数//通过次方法将pageNum设置为该页开始的索引public void getStartNum() {this.pageNum = (this.pageNum - 1) * this.pageSize;}
}

然后,在接口中定义一个抽象方法

/*** 手动分页查询地址* @param pageUtilDTO* @return*/
List<Address> getAddressPage(PageUtilDTO pageUtilDTO);

之后,在xml文件中

    <resultMap id="AddressPageMap" type="address" autoMapping="true"><id column="id" property="id"/><result column="user_id" property="userId"/></resultMap><!--分页查询-->
<select id="getAddressPage" parameterType="pageUtilDTO" resultMap="AddressPageMap">select *from t_address limit #{pageNum},#{pageSize}
</select>

测试

//手动分页
@Test
public void getAddressPage() {Integer pageNum = 3;Integer pageSize = 2;PageUtilDTO pageUtilDTO = new PageUtilDTO();pageUtilDTO.setPageNum(pageNum);pageUtilDTO.setPageSize(pageSize);pageUtilDTO.getStartNum();List<Address> addressList = session.getMapper(IAddressMapper.class).getAddressPage(pageUtilDTO);System.out.println(addressList);
}
(2) 自动分页

首先,需要引入依赖

<!-- 分页插件 -->
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.2.0</version>
</dependency>

然后,在mybatis-config.xml文件中的typeAliases标签与environments标签之间增加插件

<plugins><!-- com.github.pagehelper为PageHelper类所在包名 --><plugin interceptor="com.github.pagehelper.PageInterceptor"><!-- 使用下面的方式配置参数,后面会有所有的参数介绍 --><property name="param1" value="value1"/></plugin>
</plugins>

然后就可以使用自动分页的插件了

例如

在接口中定义一个抽象方法

/*** 自动分页查询地址* @return*/
List<Address> getAddressAutoPage();

然后,到对应的xml文件中

    <resultMap id="AddressPageMap" type="address" autoMapping="true"><id column="id" property="id"/><result column="user_id" property="userId"/></resultMap><!--分页查询-->
<select id="getAddressAutoPage" resultMap="AddressPageMap">select *from t_address
</select>

测试

//自动分页
@Test
public void getAddressAutoPage() {Integer pageNum = 2;Integer pageSize = 4;PageHelper.startPage(pageNum, pageSize);List<Address> addressList = session.getMapper(IAddressMapper.class).getAddressAutoPage();System.out.println(addressList);
}

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

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

相关文章

Kali远程操纵win7

一.准备 1.介绍 攻击方&#xff1a;kali IPV4:192.168.92.133 被攻击方&#xff1a;win7 IPV4:192.168.92.130 2.使用永恒之蓝漏洞 (1.使用root权限 (2.进入msfconsole (3.添加rhosts (4.run进行一下 二.进行远程操作 1.获取用户名和密码 在cmd5查询 2.获取syste…

抓包工具charles修改请求和返回数据

数据篡改的主要使用场景&#xff1a; &#xff08;1&#xff09;mock场景&#xff0c;mock入参和返回值参数&#xff0c;实现mock测试 &#xff08;2&#xff09;安全测试&#xff0c;对于支付金额等比较重要的字段&#xff0c;可以修改请求参数来进行安全测试 1.首先选择要…

[数据集][目标检测]道路交通事故检测数据集VOC+YOLO格式11819张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;11819 标注数量(xml文件个数)&#xff1a;11819 标注数量(txt文件个数)&#xff1a;11819 标…

Qt中QIcon图标设置(标题、菜单栏、工具栏、状态栏图标)

1 exe程序图标概述 在 Windows 操作系统中&#xff0c;程序图标一般会涉及三个地方&#xff1b; &#xff08;1&#xff09; 可执行程序&#xff08;以及对应的快捷方式&#xff09;的图标 &#xff08;2&#xff09; 程序界面标题栏图标 &#xff08;3&#xff09;程序在任务…

[激光原理与应用-77]:基于激光器加工板卡的二次开发软件的系统软硬件架构

目录 一、1个板卡、1个激光器、1个振镜的应用架构、1个工位 &#xff08;1&#xff09;PLC &#xff08;2&#xff09;MES &#xff08;3&#xff09;加工板卡 &#xff08;4&#xff09;激光加工板卡与激光器之间的转接卡 &#xff08;5&#xff09;DB25、DB15 &#x…

Typecho如何去掉/隐藏index.php

Typecho后台设置永久链接后&#xff0c;会在域名后加上index.php&#xff0c;很多人都接受不了。例如如下网址&#xff1a;https://www.jichun29.cn/index.php/archives/37/&#xff0c;但我们希望最终的形式是这样&#xff1a;https://www.jichun29.cn/archives/37.html。那么…

图神经网络实战(6)——使用PyTorch构建图神经网络

图神经网络实战&#xff08;6&#xff09;——使用PyTorch构建图神经网络 0. 前言1. 传统机器学习与人工智能2. 人工神经网络基础2.1 人工神经网络组成2.2 神经网络的训练 3. 图神经网络4. 使用香草神经网络执行节点分类4.1 数据集构建4.2 模型构建4.3 模型训练 5. 实现香草图神…

大话设计模式之装饰模式

装饰模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许向现有对象动态地添加新功能&#xff0c;同时又不改变其结构。装饰模式通过将对象放入包装器中来实现&#xff0c;在包装器中可以动态地添加功能。 在装饰模式中&#xff0c;通常会有…

【教程】JavaScript代码混淆及优化

摘要 本文将介绍常见的JavaScript代码混淆技术&#xff0c;包括字符串转十六进制、Unicode编码、Base64加密、数值加密、数组混淆、花指令、逗号表达式、控制流程平坦化和eval执行。通过对这些混淆技术的理解和应用&#xff0c;可以提高代码的安全性和保护知识产权。 引言 随…

(4)(4.3) Kogger Sonar

文章目录 前言 1 推荐硬件 2 配置回声探测仪模块 3 连接ArduPilot硬件 4 参数说明 前言 KOGGER 声纳(KOGGER Sonar)是一款结构紧凑、成本低廉的水下回声测深仪模块&#xff0c;带有 UART 接口&#xff0c;电源电压为 5-14v。 1 推荐硬件 CP210x USB->UART 转换器和安装…

C++第十三弹---内存管理(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、operator new与operator delete函数 1.1、operator new与operator delete函数 2、new和delete的实现原理 2.1、内置类型 2.2、自定义类型 …

electron vite vue打包

1. 安装所需依赖 electronconcurrently&#xff1a;阻塞运行多个命令&#xff0c;-k参数用来清除其它已经存在或者挂掉的进程wait-on&#xff1a;等待资源&#xff0c;此处用来等待url可访问cross-env: 该库让开发者只需要注重环境变量的设置&#xff0c;而无需担心平台设置el…

SpringBoot单元测试深入剖

SpringBoot作为一种流行的Java框架&#xff0c;其单元测试的重要性不言而喻。在这篇博客中&#xff0c;我们将深入剖析SpringBoot单元测试的底层原理。 单元测试的概念 单元测试是软件开发过程中的一个重要环节&#xff0c;它是对软件中的最小可测试单元进行检查和验证。对于…

开源项目ChatGPT-Next-Web的容器化部署(二)-- jenkins CI构建并推送镜像

一、背景 接着上文已制作好了Dockerfile&#xff0c;接下来就是docker build/tag/push等一系列操作了。 不过在这之前&#xff0c;你还必须在jenkins等CI工具中&#xff0c;拉取源码&#xff0c;然后build构建应用。 因为本文的重点不是讲述jenkins ci工具&#xff0c;所以只…

Java习题中 反转字符串 替换空格 翻转字符串里的单词 kmp算法

关于 反转字符串 空间问题&#xff1a;c的字符串可以原地修改&#xff0c;Java和python语言的字符串不可以&#xff0c;需要额外空间。这里用到的额外空间是没关系的&#xff0c;不影响原地修改的做法。 s[i] ^ s[j]; s[j] ^ s[i]; s[i] ^ s[j]; 这段代码是用来交换数组s中第…

亮数据——让你的IP走出去,让价值返回来

亮数据——让你的IP走出去&#xff0c;让价值返回来 前言跨境电商最最最大的痛点——让IP走出去超级代理服务器加速网络免费的代理管理软件亮数据解决痛点亮数据优势介绍亮数据浏览器的使用示例总结 前言 当前社会信息的价值是不可想象的&#xff0c;今天在亮数据中看到了个【…

Ipython与Jupyter之间的关系

IPython 和 Jupyter 之间的关系可以从它们的历史和目标中得到很好的解释。IPython&#xff08;Interactive Python&#xff09;最初是由 Fernando Prez 于 2001 年创建的&#xff0c;旨在提升 Python 的交互式计算体验。它提供了一个强大的交互式 Python shell 和一个面向高效计…

Linux C++ 007-指针

Linux C 007-指针 本节关键字&#xff1a;Linux、C、指针、函数指针 相关库函数&#xff1a; 基本概念 指针的作用&#xff1a;可以通过指针间接访问内存。内存编号是从0开始记录的&#xff0c;一般用于十六进制数字表示&#xff0c;可以利用指针变量保存地址。 定义和使用…

『VUE』03. 模板语法 使用js与插入html(详细图文注释)

目录 vscode终端中创建项目什么是模板语法?模板语法--js"变量"用法模板语法--插入html总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 vscode终端中创建项目 回顾一遍前面的cmd. 首先在vscode中打开一个新的空文件…

SpringAOP+自定义注解实现限制接口访问频率,利用滑动窗口思想Redis的ZSet(附带整个Demo)

目录 1.创建切面 2.创建自定义注解 3.自定义异常类 4.全局异常捕获 5.Controller层 demo的地址&#xff0c;自行获取《《—————————————————————————— Spring Boot整合Aop面向切面编程实现权限校验&#xff0c;SpringAop自定义注解自定义异常全局…