Mybatis学习笔记:多表关联,懒加载,缓存

人生呐……

文章目录

  • 一、多表关联查询
    • 1.1 定制类
    • 1.2 成员属性(利用association标签和collection标签
  • 二、懒加载
    • 2.1 配置
    • 2.2 实现
  • 三、缓存
    • 3.1 一级缓存(session中的缓存
    • 3.2 二级缓存(Mapper中的缓存


一、多表关联查询

  1. 确定主表
  2. 确定关联表
  3. 确定链接方式

1.1 定制类

很简单,就是继承一下User类写的UserCustom,这样的话可以保存多表关联的其他类的信息。

select * from `user`,orders.`id`,orders.`name` where orders.`user_id` = id;

保存这一块儿的信息需要在UserCustom中额外写上orders的属性,然后用UserCustom去接收数据。

1.2 成员属性(利用association标签和collection标签

我们可以在User类中定义一Orders orders的成员属性。(下面的例子是反着的,即在Orders中定义了一个User user 的成员属性。

    <select id="findOrdersUser" resultMap="orderUserResultMap">SELECT orders.*,user.`sex`,user.`username`,user.`address`FROM orders,USERWHERE orders.`user_id` = user.`id`;</select><resultMap id="orderUserResultMap" type="entity.Orders"><id column="id" property="id"/><result column="user_id" property="userId"/><result column="number" property="number"/><result column="createtime" property="createTime"/><result column="note" property="note"/>//property里写属性名 javaType写属性的类型<association property="user"  javaType="entity.User"><id column="user_id" property="id"/><result column="username" property="username"/><result column="sex" property="sex"/><result column="address" property="address"/></association></resultMap>

类似的,我们可以在用户类下定义一个包含订单类的列表。这时候就要用collection 标签了。(例子给的是一个订单中有多个订单详情

	//映射关系也是可以继承的<resultMap id="orderUserOrderDetailResultMap" type="entity.Orders" extends="orderUserResultMap"><!--Order不用写了--><!--User不用写了--><!--只用写订单详情,然后查询会出现一个订单订了两种物品-->//同理,但是注意这里的javaType变成了ofType<collection property="orderDetails" ofType="entity.OrderDetail" ><id column="orderdetail_id" property="id"/><result column="orders_id" property="ordersId"/><result column="items_id" property="itemsId"/><result column="items_num" property="itemsNum"/></collection></resultMap><select id="findOrderUserOrderDetail" resultMap="orderUserOrderDetailResultMap">SELECT orders.*,user.`sex`,user.`username`,user.`address`,orderdetail.`id` AS orderdetail_id,orderdetail.`items_id`,orderdetail.`items_num`,orderdetail.`orders_id`FROM orders,USER,orderdetailWHERE orders.`user_id` = user.`id` AND orderdetail.`orders_id` = orders.`id`;</select>

二、懒加载

就是之前上面的都是直接查完了,现在是用到了才查。

2.1 配置

在sqlMapConfig.xml中的settings下添加 懒加载(所有的设置都可以搜到

<setting name="lazyLoadingEnabled" value="ture"/>

2.2 实现

实现也很简单,和之前差不多就是在association标签头中添加select和column

<select id="findUserByID" parameterType="int" resultType="entity.User">select * from user where id=#{id}</select><resultMap id="findOrderAndUserLazyLoadingResultMap" type="entity.Orders"><id column="id" property="id"/><result column="user_id" property="userId"/><result column="number" property="number"/><result column="createtime" property="createTime"/><result column="note" property="note"/><!-- select选择可以懒加载的 写好的 之前的select 然后将column中的数据作为输入 --><association  property="user" javaType="entity.User" column="user_id" select="mapper.UserMapper.findUserByID"></association></resultMap><select id="findOrderAndUserLazyLoading" resultMap="findOrderAndUserLazyLoadingResultMap">select * from orders</select>

三、缓存

缓存可以提高效率,
然后在Mybatis中,每次查询都会先去缓存区中找,找不到再去数据库中查询。
每次commit以后就会清空缓存区,防止数据不准确(脏读

3.1 一级缓存(session中的缓存

是保存在会话中的缓存,只在同一个会话下有效,默认开启。

3.2 二级缓存(Mapper中的缓存

是保存在Mapper中的缓存,可以跨会话。需要手动设置开启。

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

然后在需要开启缓存的Mapper配置文件的命名空间里面配置

<mapper namespace="mapper.UserMapper"><cacheeviction="FIFO"flushInterval="60000"size="512"readOnly="true"/>
</mapper>

差不多就没了,Mybatis了解到此结束!

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

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

相关文章

算法设计与分析(实验5)-----图论—桥问题

一&#xff0e;实验目的 掌握图的连通性。掌握并查集的基本原理和应用。 二&#xff0e;实验步骤与结果 1.定义 &#xff08;1&#xff09;图的相关定义 图&#xff1a;由顶点的有穷非空集合和顶点之间的边的集合组成。 连通图&#xff1a;在无向图G中&#xff0c;若对于…

Springboot 集成Rabbitmq之延时队列

1.首先确保已经引入了Spring AMQP和RabbitMQ的相关依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2. 创建一个普通队列并设置TTL&#x…

TPCH工具下载及用法

目录 1. 什么是TPCH&#xff1f; 2. 下载TPCH基准工具 3. 编译TPCH基准工具 3.1. 修改头文件 3.2. 修改编译文件 3.3. 执行编译 4. qgen 的用法 4.1. 异常处理 4.2 常见用法 5. dbgen 的用法 5.1. 语法说明 5.2. 常见用法 6. 总结 1. 什么是TPCH&#xff1f; TPC-…

【rabbitmq】rabbitmq与erlang的版本对应关系

rabbitmq与erlang的版本对应关系 https://www.rabbitmq.com/docs/which-erlang

蓝桥杯练习系统(算法训练)ALGO-957 P0703反置数

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 一个整数的反置数指的是把该整数的每一位数字的顺序颠倒过来所得到的另一个整数。如果一个整数的末尾是以0结尾&#xff0c;那么在它的…

网络基础知识入门

目录 一、局域网与广域网 1、局域网 2、广域网 二、协议 1、概念 2、协议的理解 3、协议的分层 1、分层 2、OSI七层模型 三、网络传输基本流程 1、报头 2、局域网通信原理 3、跨网络传输流程 四、IP地址和MAC地址 1、IP地址 2、MAC地址 3、两者的区别 一、局域…

三种算法实例(二分查找算法、插入排序算法、贪心算法)

当我们听到“算法”这个词时&#xff0c;很自然地会想到数学。然而实际上&#xff0c;许多算法并不涉及复杂数学&#xff0c;而是更多地依赖基本逻辑&#xff0c;这些逻辑在我们的日常生活中处处可见。 在正式探讨算法之前&#xff0c;有一个有趣的事实值得分享&#xff1a;你…

面试题:React的真实DOM和虚拟DOM的区别

真实DOM&#xff0c;就是文档对象类型&#xff0c;在页面上渲染的每一个节点都是一个真实DOM结构。 虚拟DOM&#xff0c;就是一个描述描述DOM结构的对象。 在创建虚拟DOM的目的就是为了更好将虚拟节点渲染到页面上&#xff0c;虚拟DOM对象的节点与真实DOM的属性是一一对应的。…

【云开发笔记NO.22】运用云原生产品打造技术中台

一、云原生产品与技术中台的结合点 云原生产品以其容器化、微服务化、自动化等特性&#xff0c;为技术中台的建设提供了强大的技术支持。容器化技术使得应用可以更容易地进行部署和管理&#xff0c;提高了应用的可移植性和弹性。微服务架构则让应用更加模块化&#xff0c;便于…

石器时代_单机版_1.0到9.0全部版本集_内附教程

一. 版本介绍图 二. 运行环境 pc单机&#xff0c;可在所有windows系统畅玩&#xff0c;内附安装教程。 三. 源码获取 https://githubs.xyz/y27.html

Android 11 添加系统属性

在初识Android 属性一文中提到&#xff0c;系统会默认加载以下文件 /system/etc/prop.default /system/build.prop /system_ext/build.prop /vendor/default.prop /vendor/build.prop /odm/etc/build.prop /product/build.prop /factory/factory.prop要弄清楚我们应该在哪里添…

学浪app中的视频怎么缓存

现在越来越多人在学浪app里面购买课程&#xff0c;有的课程有时间限制&#xff0c;想要下载下来&#xff0c;如果你还不知道下载的方法&#xff0c;可以看看我这篇文章&#xff0c;专门讲解如何缓存学浪app里面的课程 讲技术方法很多人可能听不懂&#xff0c;所以我就将技术融…

【项目实战】【Docker】【Git】【Linux】部署V2rayA项目

今天着手了一个全新领域的项目&#xff0c;从完全没有头绪到成功运行&#xff0c;记录一下具体的部署流程 github项目链接V2rayA 一开始拿到以后完全没有抓手&#xff0c;去阅读了一下他的帮助文档 写着能用docker运行&#xff0c;就去下载了一个Docker配置了一下 拉取代码到…

如何构建和安装 Go 程序

简介 到目前为止&#xff0c;在我们的《如何使用 Go 编程》系列中&#xff0c;您已经使用 go run 命令自动编译您的源代码并运行生成的可执行文件。虽然这个命令对于在命令行上测试代码很有用&#xff0c;但是要分发或部署应用程序&#xff0c;您需要将代码构建成一个可共享的…

瑞_23种设计模式_访问者模式

文章目录 1 访问者模式&#xff08;Visitor Pattern&#xff09;1.1 介绍1.2 概述1.3 访问者模式的结构1.4 访问者模式的优缺点1.5 访问者模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 拓展——双分派4.1 分派4.2 动态分派&#xff08;多态&am…

4.网络编程-websocket(golang)

目录 什么是websocket golang中使用websocket Server端 Client端 什么是websocket WebSocket是一种在互联网上提供全双工通信的协议&#xff0c;即允许服务器和客户端之间进行双向实时通信的网络技术。它是作为HTML5的一部分标准化的&#xff0c;旨在解决传统HTTP协议在实…

uniapp使用vuex

1、uniapp中使用vuex_uniapp使用vuex-CSDN博客 2、uniapp中使用vuex(store)模块的例子 - 简书 (jianshu.com) 3、vuex介绍及使用指南&#xff08;面向实战&#xff09;_vuex 实战应用-CSDN博客

工程中实践的微服务设计模式

大家好&#xff0c;我是 方圆。最近在读《微服务架构设计模式》&#xff0c;开始的时候我非常的好奇&#xff0c;因为在我印象中&#xff0c;设计模式是常说的那23种设计模式&#xff0c;而微服务的设计模式又是什么呢&#xff1f;这个问题也留给大家&#xff0c;在文末我会附上…

opencv图像处理技术(阈值处理与图像平滑)

进行图像处理时&#xff0c;常常需要对图像进行预处理以提取所需的信息或改善图像质量。阈值处理和图像平滑是两种常见的预处理技术。 阈值处理 阈值处理是一种图像分割技术&#xff0c;其基本思想是将图像中的像素值与一个或多个预先设定的阈值进行比较&#xff0c;根据比较…