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了解到此结束!

相关推荐
程序员-珍12 分钟前
使用openapi生成前端请求文件报错 ‘Token “Integer“ does not exist.‘
java·前端·spring boot·后端·restful·个人开发
sealaugh3216 分钟前
aws(学习笔记第一课) AWS CLI,创建ec2 server以及drawio进行aws画图
笔记·学习·aws
CXDNW20 分钟前
【网络篇】计算机网络——应用层详述(笔记)
服务器·笔记·计算机网络·http·web·cdn·dns
向上的车轮26 分钟前
Django学习笔记五:templates使用详解
笔记·学习·django
2401_8572979139 分钟前
招联金融2025校招内推
java·前端·算法·金融·求职招聘
福大大架构师每日一题1 小时前
23.1 k8s监控中标签relabel的应用和原理
java·容器·kubernetes
与衫1 小时前
掌握嵌套子查询:复杂 SQL 中 * 列的准确表列关系
android·javascript·sql
金灰1 小时前
HTML5--裸体回顾
java·开发语言·前端·javascript·html·html5
菜鸟一皓1 小时前
IDEA的lombok插件不生效了?!!
java·ide·intellij-idea
爱上语文1 小时前
Java LeetCode每日一题
java·开发语言·leetcode