【Mybatis - Mybatis关联查询- Mybatis查询缓存】

Mybatis关联查询

一对一查询

  1. 实际案例:
    查询所有订单信息,关联查询下单用户信息
  2. sql语句:
SELECT orders.*,
user.username,user.addressFROM
orders,user
WHERE orders.user_id = user.id
  1. 操作:
    首先定义pojo类
Public class Orders{
	//order数据表中的字段
	private User user;
}

配置Mapper.xml:
这里的resultMap 指定 为 userordermap

<!-- -->
<select id="findOrdersListResultMap" resultMap="userordermap">
	SELECT
	orders.*,
	user.username,user.addressFROM
	orders , user
	WHERE orders.user_id = user.id
</ select>

resultMap配置:

<! --订单信息resultmap -->
<resultMap type="edu.etime.mybatis.pojo.orders" id="userordermap">
<! -- 这里的id,是mybatis在进行一对一查询时将user字段映射为user对象时要使用,必须写-->
<id property="id" column="id" />
<result property= "user_id" column="user_id" /><result property="number" column="number" />
<association property="user" javaType="edu.etime.mybatis.pojo.User">
<! --这里的id为user的id,如果写上表示给user的id属性赋值-->
<id property="id" column="user_id" />
<result property="username" column="username"/><result property="address" column="address" />< / association>
</ resultMap>

在这里插入图片描述

小结:

使用association 完成关联查询,将查询到的信息映射到pojo对象中

一多对查询

  1. 案例
    查询所有订单信息及订单下的订单明确信息
  2. sql 语句:
SELECT
orders.*user.username,user.address,
orderdetail.id orderdetail_id,orderdetail.items_id,
orderdetail.items_numFROM
orders,user,orderdetail
WHERE orders.user_id = user.idAND orders.id = orderdetail.orders_id
  1. 操作:(其余操作与一对一对应)
    Mapper.xml定义:
    在这里插入图片描述

resultMap定义:
在这里插入图片描述
黄色部分与我们的一对一查询订单及用户信息定义的resultMap相同.
collection 部分定义了查询订单明细信息
collection: 表示关联查询结果集

小结:

使用collection完成关联查询,将关联查询信息映射到集合对象。

多对多查询

  1. 案例
    查询用户购买的商品信息
  2. SQL语句
SELECT
orders.*USER .username,USER .address,
orderdetail.id orderdetail_id,orderdetail.items_id,
orderdetail.items_num,items.name items_name,items.detail items_detailFROM
orders,USER,orderdetail,items
WHERE

  1. 操作:

resultMap配置
在这里插入图片描述

小结:

一对多是多对多的特例,如下需求:
查询用户购买的商品信息,用户和商品的关系是多对多关系。

  1. 需求1:
    查询字段:用户账号、用户名称、用户性别、商品名称、商品价格(最常见)企业开发中常见明细列表,用户购买商品明细列表,使用resultType将上边查询列映射到pojo输出。
  2. 需求2:
    查询字段:用户账号、用户名称、购买商品数量、商品明细(鼠标移上显示明细>使用resultMap将用户购买的商品明细列表映射到user对象中。

resultMap总结

resultType:
作用:
将查询结果按照sql列名pojo属性名一致性映射到 pojo中。场合:
常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo>即可。
resultMap:
使用association和collection完成一对一和一对多高级映射(对结果有特殊的映射要求)。

association:
作用:
将关联查询信息映射到一个pojo对象中。场合:
为了方便查询关联信息可以使用association将关联订单信息映射为用户对象的 pojo 属性中,比如:查询订单及关联用户信息。
使用resultType无法将查询结果映射到 pojo对象的pojo属性中,根据对结渠集查询遍历的需要选择使用resultType还是resultMap.

collection:
作用:
将关联查询信息映射到一个list集合中。场合:
为了方便查询遍历关联信息可以使用collection将关联信息映射到 list集合中,比如:查询用户权限范围模块及模块下的菜单,可使用collection将模块映射到模块list 中,将菜单列表映射到模块对象的菜单list属性中,这样的作的目的也是方便对查询结果集进行遍历查询。
如果使用resultType无法将查询结果映射到 list集合中。

mybatis查询缓存

一级缓存

  1. 作用域 :
    同一个SqlSession下,同样查询结果可以直接从缓存中获取,
  2. 使用场景:
    使用场景不多
  3. 状态:
    默认打开的;

二级缓存

  1. 作用域:
    一个配置文件访问内,多个SqlSession是可以共享的,Mapper(namespace) 二级缓存 ,同查询结果可在缓存中直接获取
  2. 使用场景:
    多个人开发公用查询结果
  3. 状态:
    默认关闭, 开启:<setting name="cacheEnable" value = "true" />
  4. 二级缓存区域划分:
    二级缓存区域是根据mapper的 namespace划分的,相同namespace的 mapper查询数据放在同一个区域,如果使用mapper代理方法每个mapper 的namespace,都不同,此时可以理解为二级缓存区域是根据mapper划分。。
    每次查询会先从缓存区域找,如果找不到从数据库查询,查询到数据将数据写入缓存。。Mybatis.内部存储缓存使用一个HashMap,key为 hashcode+sglId+Sql语句。value为从查询出来映射生成的java对象。
    salSession执行insert、update、delete等操作commit提交后会清空缓存区域。。

mybatis缓存机制

mybatis缓存机制图
当执行增改删等操作时他就会将缓存中的数据直接清除,非常不智能,缓存机制差,过于暴力.泛用性差.

面试题描述:
请描述一下Mybatis的缓存机制 :

  1. mybatis 总有两级缓存;其中一级缓存作用域一个sqlsession;二级缓存作用域一个mapper/namespace,二级缓存可以多个sqlsession共享
  2. 描述mybatis的基本操作: mybatis默认打开1级缓存,2级缓存默认是关闭的,如果要打开2级缓存,则需要配置cacheEnable = true;使用二级缓存的话,映射的java对象必须实现serialable接口.
  3. 描述缓存更新机制: mybatis的缓存更新,是属于比较粗犷的更新方式,只要有insert,update,delete操作,那么就会清空对应的缓存.
  4. 描述缓存之后的查询顺序: ①从二级缓存中查询 ②从一级缓存中查询 ③从数据库中查询(查询后自动填充1\2级缓存内容)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值