文章目录

  • mybatis 连接池
  • mybatis 多表查询
  • 一对一查询(建立实体类关系)
  • 一对多关系
  • mybatis 延迟加载
  • mybatis 缓存技术
  • 一级缓存
  • 二级缓存


mybatis 连接池

连接池就是用于存储连接的一个容器,减少我们获取数据库连接所消耗的时间,该集合必须是线程安全的,保证两个线程不会拿到同一个连接。

SqlMapConfig.xml文件中的配置:

MyBatisCursorItemReader是线程不安全的 mybatis多线程查询数据_缓存


dataSource type取值类型:

  1. POOLED:从池中获取连接,用完还给池
  2. UNPOOLED:每次都创建连接,用完关闭

mybatis 多表查询

一对一查询(建立实体类关系)

例子:一个员工有多个账户
	两个对象:Employee 和 Account
	两个表:einfo 和 account

Account对象中建立 对Employee对象的引用

MyBatisCursorItemReader是线程不安全的 mybatis多线程查询数据_二级缓存_02


AccountMapper.xml文件中定义,映射resultMap。

property:映射到对象中的变量名
column:sql语句查询得到的列名
因为两个表都有id 所以对其中一个起别名

<association>:colunm是account表中外键的名称,对应account对象中的 Employee对象的变量名。
javaType:设定返回的对象类型

MyBatisCursorItemReader是线程不安全的 mybatis多线程查询数据_数据库_03

一对多关系

Employee类中建立List<Account>链表来存储查询到的多个账户信息。

MyBatisCursorItemReader是线程不安全的 mybatis多线程查询数据_二级缓存_04


配置文件EmployeeMapper.xml中,一对多关联关系

使用<collection>标签
property:类对象中,链表的变量名
ofType:链表中的对象类型,全限定类名

MyBatisCursorItemReader是线程不安全的 mybatis多线程查询数据_mysql_05

mybatis 延迟加载

案例:

  • 在查询用户时,用户在账户信息应该是什么时候用,什么时候查询。
  • 在查询账户时,应该是账户所属用户信息随着账户查询时一起出现。

加载类型:

  • 延迟加载:真正在使用的时候才发起查询。一对多,多对多的情况,查出来是个集合一般延迟加载
  • 立即加载:不管用不用,调用时就发起查询。多对一,一对一一般查出来时单个信息,立即加载。

mybatis 缓存技术

一级缓存

同一个sqlsession对象下,使用同一个一级缓存。

MyBatisCursorItemReader是线程不安全的 mybatis多线程查询数据_数据库_06


连续调用两次查询方法,实际只查询一次,第二次调用缓存并且两次对象相同。

MyBatisCursorItemReader是线程不安全的 mybatis多线程查询数据_数据库_07


当调用SqlSession的修改,添加,删除,commit(),close()等方法时,就会清空一级缓存。

清除缓存的方法
sqlSession.clearCache();

MyBatisCursorItemReader是线程不安全的 mybatis多线程查询数据_mybatis_08


可以看出两次查询结果不是同一个对象,没有调用缓存,并且使用了两次查询语句

MyBatisCursorItemReader是线程不安全的 mybatis多线程查询数据_二级缓存_09

二级缓存

这是指,mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFacotry对象创建的SqlSession共享缓存。
使用步骤:

  1. Mybatis框架配置SqlMapConfig.xml,默认已经打开为true
  2. MyBatisCursorItemReader是线程不安全的 mybatis多线程查询数据_mybatis_10

  3. 当前映射文件支持二级缓存EmployeeMapper.xml
  4. MyBatisCursorItemReader是线程不安全的 mybatis多线程查询数据_二级缓存_11

  5. 当前操作支持二级缓存select操作中修改
  6. MyBatisCursorItemReader是线程不安全的 mybatis多线程查询数据_数据库_12

结果如下图:

MyBatisCursorItemReader是线程不安全的 mybatis多线程查询数据_二级缓存_13


可以看出第二次查询没有使用查询语句,直接从缓存提取。但是两次对象结果不同是因为:二级缓存中存储的不是对象,而是具体的数据,取出时生成不同的对象。