当前位置: 首页 > news >正文

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(四)

第一章&#xff1a;MyBatis延迟加载策略 1. 延迟加载的概念 立即加载和延迟加载的区别&#xff0c;使用一对多的环境举例子。 立即加载&#xff1a;当前查询用户的时候&#xff0c;默认也把该用户所拥有的帐户信息查询出来了。 延迟加载&#xff1a;当前查询用户的时候&…...

【从零开始的LeetCode-算法】3285. 找到稳定山的下标

有 n 座山排成一列&#xff0c;每座山都有一个高度。给你一个整数数组 height &#xff0c;其中 height[i] 表示第 i 座山的高度&#xff0c;再给你一个整数 threshold 。 对于下标不为 0 的一座山&#xff0c;如果它左侧相邻的山的高度 严格大于 threshold &#xff0c;那么我…...

Docker常用命令总结~

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

浅谈怎样系统的准备前端面试

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

如何配置防火墙提高服务器安全性

配置防火墙是提高服务器安全性的重要措施之一。防火墙可以控制网络流量&#xff0c;限制未经授权的访问&#xff0c;防止恶意攻击。以下是配置防火墙以提高服务器安全性的详细指南。 一、为什么需要配置防火墙 防火墙的主要作用是&#xff1a; 限制未经授权的访问&#xff1a…...

java集合-Map HashMap 源码解析

hashMap简介 HashMap是基于哈希表实现的&#xff0c;每一个元素是一个key-value对&#xff0c;无序&#xff0c;不可重复。HashMap是非线程安全的&#xff0c;只是用于单线程环境下&#xff0c;多线程环境下可以采用concurrent并发包下的concurrentHashMap。HashMap 实现了Ser…...

案例分享|企查查的数据降本增效之路

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

图书馆管理系统(四)基于jquery、ajax--完结篇

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

什么是Modbus协议网关?

在工业自动化领域&#xff0c;设备间的通信与数据交换是实现高效、智能控制的关键。Modbus协议作为一种广泛应用的通信协议&#xff0c;自1971年由Modicon公司首次推出以来&#xff0c;便以其标准、开放、支持多种电气接口等特点&#xff0c;在工业控制系统中占据了重要地位。然…...

Docker 容器中启用 SSH 服务

在 Docker 容器中运行 SSH 服务需要一些调整&#xff0c;因为 Docker 容器通常使用 init 系统而不是完整的 systemd。以下是配置 SSH 服务在 Docker Ubuntu 容器中运行的步骤&#xff1a; 1. 安装 SSH 服务 如果还未安装 OpenSSH&#xff0c;请先安装&#xff1a; apt update…...

Linux系统—利用systemd管控系统以及服务详解(十四)

本文为Ubuntu Linux操作系统- 第十四弹~~ 新的一周开始了&#xff0c;时间过得真快&#xff0c;这星期就要冬至啦&#xff01;&#xff01; 今天继续Linux系统高级管理板块&#xff0c;主要讲述使用systemd管控系统和服务~ 上期回顾&#xff1a;“Linux系统—进程管理详解” 更…...

人工智能 AI 大模型研究设计与实践应用技术毕业论文

标题:人工智能 AI 大模型研究设计与实践应用技术 内容:1.摘要 人工智能 AI 大模型是当前人工智能领域的研究热点之一&#xff0c;它具有高度的通用性、灵活性和智能性&#xff0c;可以应用于多种领域&#xff0c;如自然语言处理、计算机视觉、语音识别等。本文旨在探讨人工智能…...

已有 containerd 的情况下部署二进制 docker 共存

文章目录 [toc]学习目的开始学习dockerd启动 containerd准备配置文件启动 containerd 启动 docker准备配置文件启动 docker 环境验证停止 docker 和 containerd 学习目的 使用容器的方式做一些部署的交付&#xff0c;相对方便很多&#xff0c;不需要担心别人的环境缺少需要的依…...

VSCode 搭建Python编程环境 2024新版图文安装教程(Python环境搭建+VSCode安装+运行测试+背景图设置)

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

vue+springboot+cas配置及cookie传递问题

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

0009.基于springboot+layui的ERP企业进销存管理系统

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

ZYNQ初识2(zynq_7010)基于vivado,从PL端调用PS端的时钟

由于需要进行一些FPGA的简单开发&#xff0c;但板载PL端没有焊接晶振&#xff0c;所以需要从PS端借用时钟到PL端使用。 首先新建项目&#xff0c;根据自己的板载选择芯片&#xff0c;我的板载芯片是zynq_7010。 一路next&#xff0c;在自己的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 删除容器文件&#xff0c;id取前三位即可 docker rmi e64 删除镜像文件&#xff08;先删容器才能删镜像&#xff09;&#xff0c;id取前三位即可 在包含Dockerfile文件的目录…...

【linux】shell(36)-文件操作

1. 文件创建 1.1 使用 touch 命令创建空文件 touch filename创建一个名为 filename 的空文件。如果文件已存在&#xff0c;touch 会更新该文件的时间戳。 示例&#xff1a; touch file1.txt1.2 使用重定向符创建文件 > filename使用 > 符号创建一个空文件。如果文件…...

c语言——数据结构【链表:单向链表】

上篇→快速掌握C语言——数据结构【创建顺序表】多文件编译-CSDN博客 一、链表 二、单向链表 2.1 概念 2.2 单向链表的组成 2.3 单向链表节点的结构体原型 //类型重定义,表示存放的数据类型 typedef int DataType;//定义节点的结构体类型 typedef struct node {union{int l…...

​Python 标识符是啥?​

Python 的标识符就是我们写代码时用来给变量、函数、类等取名字的东西。 你写的 my_variable 是个标识符&#xff0c; 定义的 add_numbers 函数名也是个标识符&#xff0c; 甚至你写的 Cat 类名&#xff0c;也是标识符。 一句话总结&#xff1a;标识符就是代码里给“东西”起…...

视频及JSON数据的导出并压缩

npm下载安装 jszip 和 file-saver 这两个库来实现文件的压缩和保存功能&#xff1a; npm install jszip npm install file-saver 导入依赖库&#xff1a; import JSZip from jszip; import { saveAs } from file-saver; 方法实现&#xff1a; batchDownload() {const zip…...

VScode使用教程(菜鸟版)

目录 1.VScode是什么&#xff1f; 2.VScode的下载和安装&#xff1f; 2.1下载和安装 下载路径&#xff1a; 安装流程&#xff1a; 一、点击【Download for Windows】 二、等一小会儿的下载&#xff0c;找到并双击你下载好的.exe文件&#xff0c;开始进入安装进程 三、点…...

【漏洞复现】Grafana 安全漏洞(CVE-2024-9264)

🏘️个人主页: 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦 一、漏洞概述 1.1漏洞简介 漏洞名称:Grafana 安全漏洞 (CVE-2024-9264)漏洞编号:CVE-2024-9264 | CNNVD-202410-1891漏洞类型:命令注入、本地文件包含漏洞威胁等级:…...

Android AOSP 源码中批量替换“phone“为“tablet“的命令详解

我来帮你写一篇关于这条命令的分析博客。 Android 项目中批量替换"phone"为"tablet"的命令详解 前言 在 Android 开发中,有时我们需要批量修改资源文件中的某些文本内容。今天我们来分析一条结合了 grep 和 sed 的强大命令,该命令用于将项目中的 “ph…...

基于JavaWeb(SSM+MySQL)问卷调查管理系统设计与实现毕业论文

标题:基于 JavaWeb&#xff08;SSMMySQL&#xff09;问卷调查管理系统设计与实现 内容:1.摘要 摘要&#xff1a;本文介绍了一个基于 JavaWeb&#xff08;SSMMySQL&#xff09;的问卷调查管理系统的设计与实现。该系统旨在为用户提供一个高效、便捷的问卷调查工具&#xff0c;帮…...

域内用户枚举与密码喷洒与密码爆破

域控&#xff1a;192.168.72.163 攻击者&#xff1a;192.168.72.162 域&#xff1a;hacker.com 用户枚举 as-rep 回复状态判断域用户 用户存在且启用&#xff1a;KDC_ERR_PREAUTH_REQUIRED (需要额外的预认证) 用户存在但禁用&#xff1a;KDC_ERR_CLIENT_REVOKED NT Stat…...

DIY 集合求并集(union)运算的代码 ← Python

【算法分析】 已知 Python 提供了求并集运算的函数 union。代码示例如下; >>> s1{1,2,3} >>> s2{2,3,7,1,9} >>> s1.union(s2) {1, 2, 3, 7, 9} >>> 不过&#xff0c;知其然也要知其所以然。 本例自己 DIY 集合求并集&#xff08;union…...

Redis bitmaps 使用

应用场景&#xff1a; 记录id为 1 的用户&#xff0c;2024年12月签到情况&#xff0c;并统计&#xff1b; 记录 1号签到 zxys-redis:0>setbit 1:202412 1 1 记录 2号签到 zxys-redis:0>setbit 1:202412 2 1 记录 3号未签到 zxys-redis:0>setbit 1:202412 3 0 …...