Mybatis -- 关联查询 1017笔记
Mybatis关联查询
一对一查询
- 实际案例:
查询所有订单信息,关联查询下单用户信息 - sql语句:
SELECT orders.*,
user.username,user.addressFROM
orders,user
WHERE orders.user_id = user.id
- 操作:
首先定义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对象中
一多对查询
- 案例
查询所有订单信息及订单下的订单明确信息 - 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
- 操作:(其余操作与一对一对应)
Mapper.xml定义:
resultMap定义:
黄色部分与我们的一对一查询订单及用户信息定义的resultMap相同.
collection 部分定义了查询订单明细信息
collection: 表示关联查询结果集
小结:
使用collection完成关联查询,将关联查询信息映射到集合对象。
多对多查询
- 案例
查询用户购买的商品信息 - 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
- 操作:
resultMap配置
小结:
一对多是多对多的特例,如下需求:
查询用户购买的商品信息,用户和商品的关系是多对多关系。
- 需求1:
查询字段:用户账号、用户名称、用户性别、商品名称、商品价格(最常见)企业开发中常见明细列表,用户购买商品明细列表,使用resultType将上边查询列映射到pojo输出。 - 需求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查询缓存
一级缓存
- 作用域 :
同一个SqlSession下,同样查询结果可以直接从缓存中获取, - 使用场景:
使用场景不多 - 状态:
默认打开的;
二级缓存
- 作用域:
一个配置文件访问内,多个SqlSession是可以共享的,Mapper(namespace) 二级缓存 ,同查询结果可在缓存中直接获取 - 使用场景:
多个人开发公用查询结果 - 状态:
默认关闭, 开启:<setting name="cacheEnable" value = "true" />
- 二级缓存区域划分:
二级缓存区域是根据mapper的 namespace划分的,相同namespace的 mapper查询数据放在同一个区域,如果使用mapper代理方法每个mapper 的namespace,都不同,此时可以理解为二级缓存区域是根据mapper划分。。
每次查询会先从缓存区域找,如果找不到从数据库查询,查询到数据将数据写入缓存。。Mybatis.内部存储缓存使用一个HashMap,key为 hashcode+sglId+Sql语句。value为从查询出来映射生成的java对象。
salSession执行insert、update、delete等操作commit提交后会清空缓存区域。。
mybatis缓存机制
当执行增改删等操作时他就会将缓存中的数据直接清除,非常不智能,缓存机制差,过于暴力.泛用性差.
面试题描述:
请描述一下Mybatis的缓存机制 :
- mybatis 总有两级缓存;其中一级缓存作用域一个sqlsession;二级缓存作用域一个mapper/namespace,二级缓存可以多个sqlsession共享
- 描述mybatis的基本操作: mybatis默认打开1级缓存,2级缓存默认是关闭的,如果要打开2级缓存,则需要配置cacheEnable = true;使用二级缓存的话,映射的java对象必须实现serialable接口.
- 描述缓存更新机制: mybatis的缓存更新,是属于比较粗犷的更新方式,只要有insert,update,delete操作,那么就会清空对应的缓存.
- 描述缓存之后的查询顺序: ①从二级缓存中查询 ②从一级缓存中查询 ③从数据库中查询(查询后自动填充1\2级缓存内容)