zoukankan      html  css  js  c++  java
  • myBatis深入学习

    本文在前一篇文章的基础上记录了对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查询到数据将存在相同 的二级缓存区域中。

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

    4.逆向生成工具

  • 相关阅读:
    Java是如何实现平台无关性的
    Java 语法糖详解
    深入分析Java的编译原理
    Java代码的编译与反编译那些事儿
    Java 源码学习系列(三)——Integer
    总结TESTNG与JUNIT的异同
    selenium如何操作cookies实现免登录
    selenium选择弹出窗口
    Selenium+Java(七)Selenium对话框的处理
    Java-控制台接受用户输入数据的方法
  • 原文地址:https://www.cnblogs.com/yunkaiL/p/11411456.html
Copyright © 2011-2022 走看看