当前位置: 首页 > 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等方法的时候也会清空缓存。

http://www.lryc.cn/news/506586.html

相关文章:

  • 【从零开始的LeetCode-算法】3285. 找到稳定山的下标
  • Docker常用命令总结~
  • 浅谈怎样系统的准备前端面试
  • 如何配置防火墙提高服务器安全性
  • java集合-Map HashMap 源码解析
  • 案例分享|企查查的数据降本增效之路
  • 图书馆管理系统(四)基于jquery、ajax--完结篇
  • 什么是Modbus协议网关?
  • Docker 容器中启用 SSH 服务
  • Linux系统—利用systemd管控系统以及服务详解(十四)
  • 人工智能 AI 大模型研究设计与实践应用技术毕业论文
  • 已有 containerd 的情况下部署二进制 docker 共存
  • VSCode 搭建Python编程环境 2024新版图文安装教程(Python环境搭建+VSCode安装+运行测试+背景图设置)
  • vue+springboot+cas配置及cookie传递问题
  • 0009.基于springboot+layui的ERP企业进销存管理系统
  • ZYNQ初识2(zynq_7010)基于vivado,从PL端调用PS端的时钟
  • Android详解——ConstraintLayout约束布局
  • docker简单命令
  • 【linux】shell(36)-文件操作
  • c语言——数据结构【链表:单向链表】
  • ​Python 标识符是啥?​
  • 视频及JSON数据的导出并压缩
  • VScode使用教程(菜鸟版)
  • 【漏洞复现】Grafana 安全漏洞(CVE-2024-9264)
  • Android AOSP 源码中批量替换“phone“为“tablet“的命令详解
  • 基于JavaWeb(SSM+MySQL)问卷调查管理系统设计与实现毕业论文
  • 域内用户枚举与密码喷洒与密码爆破
  • DIY 集合求并集(union)运算的代码 ← Python
  • Redis bitmaps 使用
  • vue深层数据响应的问题