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

人生呐......

文章目录

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

一、多表关联查询

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

1.1 定制类

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

sql 复制代码
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 的成员属性。

xml 复制代码
    <select id="findOrdersUser" resultMap="orderUserResultMap">
        SELECT orders.*,user.`sex`,user.`username`,user.`address`
        FROM orders,USER
        WHERE 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 标签了。(例子给的是一个订单中有多个订单详情

xml 复制代码
	//映射关系也是可以继承的
    <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,orderdetail
        WHERE orders.`user_id` = user.`id` AND orderdetail.`orders_id` = orders.`id`;
    </select>

二、懒加载

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

2.1 配置

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

xml 复制代码
<setting name="lazyLoadingEnabled" value="ture"/>

2.2 实现

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

xml 复制代码
    <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中的缓存,可以跨会话。需要手动设置开启。

xml 复制代码
       <setting name="cacheEnabled" value="ture"/>

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

xml 复制代码
<mapper namespace="mapper.UserMapper">
    <cache
            eviction="FIFO"
            flushInterval="60000"
            size="512"
            readOnly="true"/>
</mapper>

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

相关推荐
MrZhangBaby9 分钟前
SQL-leetcode—1158. 市场分析 I
java·sql·leetcode
东软吴彦祖16 分钟前
包安装利用 LNMP 实现 phpMyAdmin 的负载均衡并利用Redis实现会话保持nginx
linux·redis·mysql·nginx·缓存·负载均衡
一只淡水鱼6624 分钟前
【spring原理】Bean的作用域与生命周期
java·spring boot·spring原理
五味香30 分钟前
Java学习,查找List最大最小值
android·java·开发语言·python·学习·golang·kotlin
jerry-8944 分钟前
Centos类型服务器等保测评整/etc/pam.d/system-auth
java·前端·github
Jerry Lau44 分钟前
大模型-本地化部署调用--基于ollama+openWebUI+springBoot
java·spring boot·后端·llama
小白的一叶扁舟1 小时前
Kafka 入门与应用实战:吞吐量优化与与 RabbitMQ、RocketMQ 的对比
java·spring boot·kafka·rabbitmq·rocketmq
幼儿园老大*1 小时前
【系统架构】如何设计一个秒杀系统?
java·经验分享·后端·微服务·系统架构
小爬菜1 小时前
Django学习笔记(启动项目)-03
前端·笔记·python·学习·django
小爬菜1 小时前
Django学习笔记(bootstrap的运用)-04
笔记·学习·django