Mybatis 系列全解(3)——全网免费最细最全,手把手教,学完就可做项目!

news2024/11/23 22:53:17

Mybatis 系列全解(3)

  • 1. 多对一处理
  • 2. 一对多处理
  • 3. 动态SQL
    • 3.1 什么是动态SQL
    • 3.2 搭建环境
    • 3.3 IF
    • 3.4 Choose(when,otherwise)
    • 3.5 Set
    • 3.6 SQL片段
    • 3.7 Foreach
  • 4. 缓存
    • 4.1 简介
    • 4.2 Mybatis 缓存
    • 4.3 一级缓存
    • 4.4 二级缓存
    • 4.5 缓存原理

1. 多对一处理

1)简介

在这里插入图片描述

       多个学生对应一个老师

       对于学生而言 关联 多个学生关联一个老师

       对于老师而言 集合 一个老师有很多学生

       先创建两个表 student(id name tid) teacher(id name)

       外键:student 的tid和 teacher的id连接

2)测试环境搭建

  • 导入lombok

  • 新建实体类Teacher Student

  • 建立Mapper接口

  • 建立Mapper。XML文件

  • 在核心配置文件中绑定注册我们的Mapper接口或者文件(方式 )

Student 类

@Data
public class Student {
	private int id;
	private String name;
	private Teacher teacher;
}

3)按照结果嵌套查询(推荐)

在这里插入图片描述

4)按照查询嵌套处理

在这里插入图片描述

5)回顾Mysql多对一查询方式

  • 子查询

  • 联表查询

2. 一对多处理

1)简介

       比如一个老师有多个学生

       环境搭建和以前一样,只是student中的private Teacher teacher;改为private int tid;

       teacher实体类中添加private List<Student> students;

2)按结果嵌套查询:

在这里插入图片描述

3)小结

1 关联 - association【多对一】

2 集合 - collection 【一对多】

3 javaType & ofType javaType 用来指定实体类中属性的类型 ofType 用来指定映射到List或者集合中的pojo类型,泛型中的约束类型!

4) 注意点:

  • 保证SQL的可读性,尽量保证通俗易懂

  • 注意一对多和多对一中,属性名和字段的问题!

  • 如果问题不好排查错误,可以使用日志,建议log4j

5) 面试高频

  • Mysql引擎

  • InnoDB底层原理

  • 索引

  • 索引优化

3. 动态SQL

3.1 什么是动态SQL

       什么是动态SQL :根据不同条件生成不同的 SQL 语句。

       如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

3.2 搭建环境

a. 创建数据库blog

b. 创建一个基础工程

  • 导包
  • 编写配置文件
  • 编写实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Blog {
	private String id;
	private String title;
	private String author;
	private Date createtime;
	private int views;
}
  • 编写实体类对应Mapper接口和Mapper.xml

3.3 IF

<select id="querybBlogIf" parameterType="map" resultType="blog">
	select * from mybatis.blog
	<where>
		<if test="title != null">
			title = #{title}
		</if>
		<if test="author != null">
			and author = #{author}
		</if>
	</where>
</select>

3.4 Choose(when,otherwise)

<select id="querybBlogChoose" parameterType="map" resultType="blog">
	select * from mybatis.blog
	<where>
		<choose>
			<when test="title != null">
				title = #{title}
			</when>
			<when test="author != null">
				and author = #{author}
			</when>
			<otherwise>
				and views = #{views}
			</otherwise>
		</choose>
	</where>
</select>

3.5 Set

<update id="updateBlog" parameterType="map">
	update mybatis.blog
	<set>
	<if test="title != null">
		title = #{title},
	</if>
	<if test="author != null">
		author = #{author}
	</if>
	where id = #{id}
	</set>
</update>

       所谓的动态SQL,本质还是SQL语句,只是我们可以在SQL层面,去执行一个逻辑代码。

3.6 SQL片段

       有的时候,我们可能会将一些功能的部分抽取出来,方便复用!

1)使用SQL标签抽取公共的部分(id自定义)

<sql id="title-id">
	<if test="title != null">
		and title = #{title}
	</if>
	<if test="author != null">
		and author = #{author}
	</if>
</sql>

2)在需要使用的地方使用include标签引用即可

<select id="querybBlog" parameterType="map" resultType="blog">
	select * from mybatis.blog where 1=1
	<include refid="title-id"></include>
</select>

注意:

       最好基于单表来定义SQL片段。

       不要存在where标签。

3.7 Foreach

where 1 = 1 and (id = 1 or id =2 or id =3)

<select id="queryBlogFor" parameterType="map" resultType="blog">
	select * from mybatis.blog
<where>
	<foreach collection="ids" item="id" open="and (" separator="or" close=")">
		id = #{id}
	</foreach>
</where>
</select>

       动态SQL就是在拼接SQL语句,我们只要保证SQL的正确性,按照SQL的格式去排列组合就可以了

       建议:先在Mysql写出完整的SQL再对应的去修改称为我们的动态SQL

4. 缓存

4.1 简介

1)什么是缓存Cache ?

  • 存在内存中的临时数据。

  • 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。

2)为什么使用缓存?

  • 减少和数据库的交互次数,减少系统开销,提高系统效率。

3)什么样的数据能使用缓存?

  • 经常查询并且不经常改变的数据。

4.2 Mybatis 缓存

1)MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。

2)MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存

  • 默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存)。

  • 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。

  • 为了提高扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存。

4.3 一级缓存

  • —级缓存也叫本地缓存:SqlSession

  • 与数据库同一次会话期间查询到的数据会放在本地缓存中。

  • 以后如果需要获取相同的数据,直接从缓存中拿,没必须再去查询数据库;

1)测试步骤:

  • 开启日志!

  • 测试在一个Session中查询两次相同记录

  • 查看日志输出
    在这里插入图片描述

2)缓存失效的情况:

1 查询不同的东西

2 增删改操作,可能会改变原来的数据,所以必定会刷新缓存

3 查询不同的Mapper.xml

4 手动清理缓存

在这里插入图片描述

小结:

  • 一级缓存默认是开启的,只在一次Sqlsession中有效,也就是拿到连接到关闭连接这个区间段!

  • 一级缓存就是一个Map

4.4 二级缓存

1)二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存;

2)基于namespace级别的缓存,一个名称空间,对应一个二级缓存;

3)工作机制

a. 一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中;

b. 如果当前会话关闭了,这个会话对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中;

c. 新的会话查询信息,就可以从二级缓存中获取内容;

d. 不同的mapper查出的数据会放在自己对应的缓存(map)中;

4)步骤:

a. 开启全局缓存

<setting name="cacheEnabled" value="true"/>

b. 在要使用二级缓存的Mapper中开启

<mapper namespace="com.kuang.dao.UserMapper">
<cache/>

c. 也可以自定义参数

在这里插入图片描述
5)测试

       问题:我们需要将实体类 序列化!否则会报错!

@Data
public class User implements Serializable {
	private int id;
	private String name;
	private String pwd;
}

小结:

  • 只要开启了二级缓存,在同一个Mapper下就有效

  • 所有的数据都会先放在一级缓存中

  • 只有当会话提交,或者关闭的时候,才会提交到二级缓冲中

4.5 缓存原理

在这里插入图片描述                                                                                    数据库

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

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

相关文章

携程任我行有什么用?

眼看一直到十月份都没啥假期了 五一出去玩买了几张携程的卡&#xff0c;想着买景点门票、酒店啥的能有优惠&#xff0c;但最后卡里的钱没用完不说&#xff0c;还有几张压根就没用出去 但是我又不想把卡一直闲置在手里&#xff0c;就怕过期了 最后在收卡云上99.1折出掉了&…

vue3中的图片懒加载指令及全局注册

vue3中的图片懒加载指令及全局注册 最近重新刷了一遍黑马的小兔鲜前端项目&#xff0c;发现有个懒加载的指令之前还没有用过。而且写法相对固定&#xff0c;因此记录一下 首先&#xff0c;懒加载&#xff08;Lazy Loading&#xff09;的作用是延迟加载某些资源或组件&#xf…

Python生成图形验证码

文章目录 安装pillow基本用法生成代码 安装pillow pip install pillow 基本用法 特殊字体文字 如下所示&#xff0c;将下载下来的ttf字体文件放到py文件同一文件夹下 分享一个免费下载字体网站&#xff1a;http://www.webpagepublicity.com/free-fonts.html 我选的字体是Baj…

专题页面设计指南:从构思到实现

如何设计专题页&#xff1f;你有什么想法&#xff1f;专题页的设计主要以发扬产品优势为核心。一个好的专题页可以从不同的角度向用户介绍产品&#xff0c;扩大产品的相关优势&#xff0c;表达产品的优势&#xff0c;让用户在短时间内了解产品。因此&#xff0c;在设计详细信息…

纯css写一个动态圣诞老人

效果预览 在这篇文章中&#xff0c;我们将学习如何使用CSS来创建一个生动的圣诞老人动画。通过CSS的魔力&#xff0c;我们可以让圣诞老人在网页上摇摆&#xff0c;仿佛在向我们招手庆祝圣诞节和新年。 实现思路 实现这个效果的关键在于CSS的keyframes动画规则以及各种CSS属性…

Python 基础:用 json 模块存储和读取数据

目录 一、用 json 存储数据二、用 json 读取数据 遇到看不明白的地方&#xff0c;欢迎在评论中留言呐&#xff0c;一起讨论&#xff0c;一起进步&#xff01; 本文参考&#xff1a;《Python编程&#xff1a;从入门到实践&#xff08;第2版&#xff09;》 用户关闭程序时&#…

step6:改用单例模式

文章目录 文章介绍codemain.cppSerialPort.qmlSerialPortHandler.h 文章介绍 案例MF改为单例模式 参考之前写过的关于单例模式的文章单例模式1、单例模式2 code main.cpp qmlRegisterSingletonType(“com.example.serialport”, 1, 0, “SerialPortHandler”, SerialPortHan…

【Python】易错题 [1]

目录 一、选择&#xff1a; 1.列表的复制​编辑 2.函数 二、填空 一、选择&#xff1a; 1.列表的复制 在Python中&#xff0c;列表是可变的数据类型。当将一个列表赋值给另一个变量时&#xff0c;实际上是将这个变量的引用指向原始列表。&#xff08;指针&#xff09;因此&…

软件系统测试包括哪些测试内容?有什么作用?

在软件开发的过程中&#xff0c;软件系统测试是不可或缺的环节。它是为了验证并评估软件系统的功能、性能以及其它需要满足的特性。那么&#xff0c;软件系统测试包括哪些测试呢?又有什么作用? 软件系统测试是通过执行一系列策略和技术&#xff0c;检测软件系统是否满足用户…

docker 部署jitsi meet

1. 部署环境&#xff1a; 1.1 vm 虚拟机 安装的 centos 7 1.2 centos7安装docker 和 docker-compose 2.docker命令 官网部署文档地址&#xff1a;&#xff08;文档地址有可能失效&#xff09; Self-Hosting Guide - Docker | Jitsi Meet 2.1Download and extract the late…

AL8807是一款降压型DC/DC转换器,旨在以恒定电流驱动LED,可串联驱动多达9个LED,从6V至36V的电压源

一般描述 AL8807是一款降压型DC/DC转换器&#xff0c;旨在以恒定电流驱动LED。根据LED的正向电压&#xff0c;该设备可串联驱动多达9个LED&#xff0c;从6V至36V的电压源。LED的串联连接提供相同的LED电流&#xff0c;从而实现均匀的亮度&#xff0c;并消除了对镇流电阻…

4大wordpress渐变色网站模板

家居摆件wordpress外贸模板 家居装饰、配件、摆件wordpress外贸模板&#xff0c;适合搞家居装饰的公司官网使用。 https://www.jianzhanpress.com/?p3515 玩具wordpress外贸模板 简洁玩具wordpress外贸模板&#xff0c;适合做跨境电商外贸公司使用的wordpres外贸s网站主题。…

Android U Settings 应用中 APN 菜单实现的代码逻辑

功能简介 MobileNetwork移动网络设置页面下有【接入点设置】(APN)。 问题:为什么Controller初始化找不到pref,然后报错。 Note:什么时候切换成Controller的呢?在Android T&U 上还没有更新成kt实现 ,但是已经有Controller的方案。 流程逻辑 1、界面“telephony_a…

frida的安装使用以及解决抓包app时遇到的证书校验

frida的安装和使用 这里使用夜神模拟器来演示frida的使用&#xff0c;因为真机开启frida-server服务时需要root权限,模拟器自带root 下载夜神模拟器并启动 夜神官网 打开power shell&#xff0c; adb连接模拟器&#xff0c;查看模拟器的系统型号 adb connect 127.0.0.1:6200…

MySQL学习(3):SQL语句之数据定义语言:DDL

1.SQL通用语法与分类 &#xff08;1&#xff09;通用语法 &#xff08;2&#xff09;分类 2.DDL 2.1数据库操作 show DATABASES; #查询所有数据库select DATABASE(); #查询当前数据库create DATABASE 数据库名称 [default charest 字符集] [collate 排列规则]; #default cha…

VC++学习(6)——菜单编程,消息捕获机制和顺序;创建标记、缺省、图形、不可用等菜单;命令更新模式;右键的弹出菜单

目录 引出第6讲 菜单编程在CMainFrame中捕获消息响应捕获顺序插曲&#xff1a;删除函数的方法 消息分类菜单的结构创建标记菜单创建缺省菜单创建图形菜单菜单项不允许使用如何整个菜单取消命令更新模式右键弹出菜单功能添加方式显示位置定义事件 动态添加定义响应 总结第五讲 文…

DELL:利用大语言模型(LLM)生成评论与解释,革新虚假信息检测

ACL 2024 DELL: Generating Reactions and Explanations for LLM-Based Misinformation Detection https://arxiv.org/abs/2402.10426https://arxiv.org/abs/2402.10426 1.概述 大型语言模型(LLM)虽在诸多领域显示出色性能,但在直接应用于新闻真实性鉴别时,面临两大核心挑…

【React】变量 useState

开发需要&#xff0c;随便学学react。上手第一天&#xff0c;感觉这个JS语法很怪&#xff0c;没有什么逻辑性&#xff0c;比较抽象。随便写写笔记。 跟着网上找的项目写写感觉这个项目还不错&#xff1a; 分享给码友 https://zh-hans.react.dev/learn/tutorial-tic-tac-toe 参…

未来一周比特币价格及数字货币市场预测

荷月的比特币市场就像过山车一样&#xff0c;仅仅六月下旬就跌去-12%&#xff0c;本周更是暴跌-6%&#xff0c;至 58,378美元。在这种市场表现&#xff0c;应有的踩踏如期而至。德国政府今日宣布再出售750 比特币的行为继续打击多头&#xff0c;但是小编认为这恰恰预示着市场可…

【Flink metric(1)】Flink指标系统的系统性知识:获取metric以及注册自己的metric

文章目录 一. Registering metrics&#xff1a;向flink注册新自己的metrics1. 注册metrics2. Metric types:指标类型2.1. Counter2.2. Gauge2.3. Histogram(ing)2.4. Meter 二. Scope:指标作用域1. User Scope2. System Scope ing3. User Variables 三. Reporter ing四. System…