MyBatis(四)
第一章:MyBatis延迟加载策略
1. 延迟加载的概念
立即加载和延迟加载的区别,使用一对多的环境举例子。
立即加载:当前查询用户的时候,默认也把该用户所拥有的帐户信息查询出来了。
延迟加载:当前查询用户的时候,没有把该用户所拥有的帐户信息查询出来,而是使用帐户数据的时候,再去查询账户的数据。
2. 立即加载和延迟加载的应用场景
例如查询账户的时候,可以直接把用户查询出来,即查询多对一,这个时候可以选择立即加载。
例如查询用户的时候,可以先不查账号信息,等需要使用帐户信息的时候,再去查询,选择延迟加载。
3. 多对一的延迟加载查询演示
在AccountMapper接口中编写方法
public List<Account> findAll();
编写配置文件和SQL语句
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qcbyjy.mapper.AccountMapper">
<!-- 内连接的查询 -->
<select id="findAll" resultMap="accountMap">
SELECT * from account
</select>
<!-- 通过用户的id查询账户信息 -->
<select id="findByUid" parameterType="int" resultType="account">
select * from account where uid = #{uid}
</select
<!-- 配置映射 -->
<resultMap type="Account" id="accountMap">
<id column="id" property="id"/>
<result column="uid" property="uid"/>
<result column="money" property="money"/>
<!-- 配置延迟加载 -->
<association property="user" javaType="User" select="com.qcbyjy.mapper.UserMapper.findById" column="uid">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="birthday" property="birthday"/>
<result column="sex" property="sex"/>
<result column="addresss" property="addresss"/>
</association>
</resultMap>
</mapper>
在UserMapper接口中编写方法
public User findById(Integer uid);
编写配置文件
<select id="findById" parameterType="int" resultType="User">
select * from user where id = #{id}
</select>
在SqlMapConfig.xml配置文件中开启延迟加载的配置
<settings>
<!-- 开启延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 将积极加载改为消极加载及按需加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
编写测试方法
@Test
public void testFindAll() throws Exception {
// 调用方法
List<Account> list = mapper.findAll();
for (Account account : list) {
System.out.println("开始...");
System.out.println(account.getMoney());
System.out.println("结束...");
System.out.println();
}
}
4. 一对多的延迟加载查询演示
如果拷贝之前的项目,默认是不延迟加载的。编写的是SQL语句把所有数据全部都查询出来了。
在UserMapper中编写方法
public interface UserMapper {
public List<User> findAll();
}
在UserMapper.xml配置文件中编写配置和SQL语句
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qcbyjy.mapper.UserMapper">
<!-- 一对多的查询 -->
<select id="findAll" resultMap="userMap">
select * from user
</select>
<!-- 数据封装 -->
<resultMap type="user" id="userMap">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="birthday" property="birthday"/>
<result column="sex" property="sex"/>
<result column="addresss" property="addresss"/>
<!--
select="" 使用帐户的方法查询
column="id" 使用id值去查询账户
-->
<collection property="accounts" ofType="Account" select="com.qcbyjy.mapper.AccountMapper.findByUid" column="id" >
<id column="id" property="id"/>
<result column="uid" property="uid"/>
<result column="money" property="money"/>
</collection>
</resultMap>
</mapper>
在AccountMapper接口中编写方法
public List<Account> findByUid(Integer uid);
在AccountMapper.xml配置文件中编写配置和SQL语句
<!-- 通过用户的id查询账户信息 -->
<select id="findByUid" parameterType="int" resultType="account">
select * from account where uid = #{uid}
</select>
在SqlMapConfig.xml配置文件中开启延迟加载的配置
<settings>
<!-- 开启延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 将积极加载改为消极加载及按需加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
编写测试方法
/**
* 测试查询
* @throws Exception
*/
@Test
public void testFindAll() throws Exception {
// 调用方法
List<User> list = mapper.findAll();
for (User user : list) {
System.out.println(user.getUsername());
System.out.println(user.getAccounts());
System.out.println("==============");
}
}
第二章:MyBatis框架的缓存
1. 缓存的概念
缓存的概念
在内存中临时存储数据,速度快,可以减少数据库的访问次数。
经常需要查询,不经常修改的数据,不是特别重要的数据都适合于存储到缓存中。
2. MyBatis的一级缓存
MyBatis的一级缓存也是SqlSession的缓存。
SqlSession对象中维护了一个Map集合,用于存储相互的缓存数据。
查询的时候,先从SqlSession的缓存中查找,如果有,直接返回。如果没有,查询数据库。
证明一级缓存的存在,通过用户id查询2次,查看结果。
/**
* 测试一级缓存是否存在
*/
@Test
public void testFindById() {
User user = mapper.findById(41);
System.out.println(user);
User user2 = mapper.findById(41);
System.out.println(user2);
}
一级缓存的原理分析
一级缓存底层使用的是Map集合,key存储的是执行的SQL语句,value存放的是查询的对象
BaseExecutor类的152行源码地方先查询缓存,再查询数据库。
一级缓存的生命周期和SqlSession的生命周期相同,SqlSession对象关闭,一级缓存也会关闭。
session.clearCache();调用该方法可以清空缓存
调用调用SqlSession的update、insert、delete、commit和close等方法的时候也会清空缓存。
相关文章:
MyBatis(四)
第一章:MyBatis延迟加载策略 1. 延迟加载的概念 立即加载和延迟加载的区别,使用一对多的环境举例子。 立即加载:当前查询用户的时候,默认也把该用户所拥有的帐户信息查询出来了。 延迟加载:当前查询用户的时候&…...

【从零开始的LeetCode-算法】3285. 找到稳定山的下标
有 n 座山排成一列,每座山都有一个高度。给你一个整数数组 height ,其中 height[i] 表示第 i 座山的高度,再给你一个整数 threshold 。 对于下标不为 0 的一座山,如果它左侧相邻的山的高度 严格大于 threshold ,那么我…...

Docker常用命令总结~
1、关于镜像 获取镜像 docker pull [image name] [option:tag]AI助手//获取postgres镜像(没有设置镜像版本号则默认获取最新的,使用latest标记) docker pull postgres or docker pull postgres:11.14 列出本地镜像 docker imagesAI助手 指定镜像启动一个容…...

浅谈怎样系统的准备前端面试
前言 创业梦碎,回归现实,7 月底毅然裸辞,苦战两个月,拿到了美团和字节跳动的 offer,这算是从业以来第一次真正意义的面试,遇到蛮多问题,比如一开始具体的面试过程我都不懂,基本一直是…...

如何配置防火墙提高服务器安全性
配置防火墙是提高服务器安全性的重要措施之一。防火墙可以控制网络流量,限制未经授权的访问,防止恶意攻击。以下是配置防火墙以提高服务器安全性的详细指南。 一、为什么需要配置防火墙 防火墙的主要作用是: 限制未经授权的访问:…...
java集合-Map HashMap 源码解析
hashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,无序,不可重复。HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。HashMap 实现了Ser…...

案例分享|企查查的数据降本增效之路
分享嘉宾 任何强 企查查科技股份有限公司 大数据架构负责人 关于企查查 “企查查”是企查查科技股份有限公司旗下的一款企业信用查询工具。2023年5月20日,企查查正式发布全球首款商查大模型——“知彼阿尔法”,该模型基于企查查覆盖的全球企业信用数据进…...

图书馆管理系统(四)基于jquery、ajax--完结篇
任务3.6 后端代码编写 任务描述 这个部分主要想实现图书馆管理系统的后端,使用 Express 框架来处理 HTTP 请求,并将书籍数据存储在一个文本文件 books.txt 中。 任务实施 3.6.1 引入模块及创建 Express 应用 const express require(express); cons…...

什么是Modbus协议网关?
在工业自动化领域,设备间的通信与数据交换是实现高效、智能控制的关键。Modbus协议作为一种广泛应用的通信协议,自1971年由Modicon公司首次推出以来,便以其标准、开放、支持多种电气接口等特点,在工业控制系统中占据了重要地位。然…...
Docker 容器中启用 SSH 服务
在 Docker 容器中运行 SSH 服务需要一些调整,因为 Docker 容器通常使用 init 系统而不是完整的 systemd。以下是配置 SSH 服务在 Docker Ubuntu 容器中运行的步骤: 1. 安装 SSH 服务 如果还未安装 OpenSSH,请先安装: apt update…...

Linux系统—利用systemd管控系统以及服务详解(十四)
本文为Ubuntu Linux操作系统- 第十四弹~~ 新的一周开始了,时间过得真快,这星期就要冬至啦!! 今天继续Linux系统高级管理板块,主要讲述使用systemd管控系统和服务~ 上期回顾:“Linux系统—进程管理详解” 更…...
人工智能 AI 大模型研究设计与实践应用技术毕业论文
标题:人工智能 AI 大模型研究设计与实践应用技术 内容:1.摘要 人工智能 AI 大模型是当前人工智能领域的研究热点之一,它具有高度的通用性、灵活性和智能性,可以应用于多种领域,如自然语言处理、计算机视觉、语音识别等。本文旨在探讨人工智能…...
已有 containerd 的情况下部署二进制 docker 共存
文章目录 [toc]学习目的开始学习dockerd启动 containerd准备配置文件启动 containerd 启动 docker准备配置文件启动 docker 环境验证停止 docker 和 containerd 学习目的 使用容器的方式做一些部署的交付,相对方便很多,不需要担心别人的环境缺少需要的依…...

VSCode 搭建Python编程环境 2024新版图文安装教程(Python环境搭建+VSCode安装+运行测试+背景图设置)
名人说:一点浩然气,千里快哉风。—— 苏轼《水调歌头》 创作者:Code_流苏(CSDN) 目录 一、Python环境安装二、VScode下载及安装三、VSCode配置Python环境四、运行测试五、背景图设置 很高兴你打开了这篇博客,更多详细的安装教程&…...

vue+springboot+cas配置及cookie传递问题
cookie的注意事项 前边的文章已经介绍过cookie的基本信息,这里再次说明一点:cookie是无法进行跨域传递的,很多时候cookie无法设置和传递都是因为跨域问题,ip/端口不一致。 主要就是:被设置cookie和要传递cookie的地址…...

0009.基于springboot+layui的ERP企业进销存管理系统
一、系统说明 基于springbootlayui的ERP企业进销存管理系统,系统功能齐全, 代码简洁易懂,适合小白学编程,课程设计,毕业设计。 二、系统架构 前端:html| layui 后端:springboot | mybatis| thymeleaf 环境:jdk1.8 |…...

ZYNQ初识2(zynq_7010)基于vivado,从PL端调用PS端的时钟
由于需要进行一些FPGA的简单开发,但板载PL端没有焊接晶振,所以需要从PS端借用时钟到PL端使用。 首先新建项目,根据自己的板载选择芯片,我的板载芯片是zynq_7010。 一路next,在自己的vivado的工作文档新建文件夹并给自…...
Android详解——ConstraintLayout约束布局
目录 一、ConstraintLayout概述 二、ConstraintLayout属性介绍 1. 相对位置 2. 边距 3. 中心和偏移位置 中心位置 偏移位置 4. 圆形位置 5. 可见性 6. 尺寸约束 最小尺寸 WRAP_CONTENT :强制约束 MATCH_CONSTRAINT Min和Max 百分比尺寸 比率 7. 链式布局 创建…...

docker简单命令
docker images 查看镜像文件 docker ps -a 查看容器文件 docker rm 0b2 删除容器文件,id取前三位即可 docker rmi e64 删除镜像文件(先删容器才能删镜像),id取前三位即可 在包含Dockerfile文件的目录…...
【linux】shell(36)-文件操作
1. 文件创建 1.1 使用 touch 命令创建空文件 touch filename创建一个名为 filename 的空文件。如果文件已存在,touch 会更新该文件的时间戳。 示例: touch file1.txt1.2 使用重定向符创建文件 > filename使用 > 符号创建一个空文件。如果文件…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...