myBatis深入学习

匿名 (未验证) 提交于 2019-12-02 23:55:01

本文在前一篇文章的基础上记录了对mybatis的表之间的关系映射、延迟加载、缓存等高级功能的学习。


1.表之间的关系映射

  既然要明确表之间的关系映射,那么首先要分析数据库中表之间的关系,假设数据库中现在有4张表:user(用户表,记录了购买商品的用户信息)、orders(订单表,记录了用户所创建的订单)、orderdetails(订单明细表,记录了订单的详细信息即购买商品的信息)、items(商品表,记录了商品信息),对数据库中表的分析要重点看表中的主键、非空字段、外键,经过对表的分析,可以得到如下的数据模型分析:

  

 

  •  一对一查询

  一对一的查询在实现时可以使用resultType和resultMap实现,关于二者的区别如下:

  resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。如果没有查询结果的特殊要求建议使用resultType。

  resultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。resultMap可以实现延迟加载,resultType无法实现延迟加载。

  • 一对多查询

  mybatis使用resultMap的collection对关联查询的多条记录映射到一个list集合属性中。

  使用resultType实现:将订单明细映射到orders中的orderdetails中,需要自己处理,使用双重循环遍历,去掉重复记录,将订单明细放在orderdetails中。

  • 多对多查询

  多对多的查询其实就是一对多查询的组合,使用resultMap是针对那些对查询结果映射有特殊要求的功能,比如特殊要求映射成list中包括 多个list。

2.延迟加载

  先从单表查询、需要时再从关联表去关联查询,大大提高 数据库性能,因为查询单表要比关联查询多张表速度要快。或者直接可以理解成当需要用某个表时,再对该表进行查询,不需要时不用查询该表。resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。

  • 延迟加载的配置

  mybatis默认没有开启延迟加载,需要在全局配置文件中setting配置。在mybatis核心配置文件中配置:

  

3.缓存

  mybatis提供查询缓存,用于减轻数据压力,提高数据库性能。mybaits提供一级缓存,和二级缓存。

  

  一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。

  二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。

  如果缓存中有数据就不用从数据库中获取,大大提高系统性能。

  • 一级缓存(默认开启一级缓存)

  

  第一次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,如果没有,从数据库查询用户信息。得到用户信息,将用户信息存储到一级缓存中。

  如果sqlSession去执行commit操作(执行插入、更新、删除),清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。

  第二次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,缓存中有,直接从缓存中获取用户信息。

  • 二级缓存

  

  首先开启mybatis的二级缓存。

  sqlSession1去查询用户id为1的用户信息,查询到用户信息会将查询数据存储到二级缓存中。

  如果SqlSession3去执行相同 mapper下sql,执行commit提交,清空该 mapper下的二级缓存区域的数据。

  sqlSession2去查询用户id为1的用户信息,去缓存中找是否存在数据,如果存在直接从缓存中取出数据。

  二级缓存与一级缓存区别,二级缓存的范围更大,多个sqlSession可以共享一个UserMapper的二级缓存区域。

  UserMapper有一个二级缓存区域(按namespace分) ,其它mapper也有自己的二级缓存区域(按namespace分)。

  每一个namespace的mapper都有一个二缓存区域,两个mapper的namespace如果相同,这两个mapper执行sql查询到数据将存在相同 的二级缓存区域中。

  具体使用方法参考使用手册。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!