文章目录
- mybatis 连接池
- mybatis 多表查询
- 一对一查询(建立实体类关系)
- 一对多关系
- mybatis 延迟加载
- mybatis 缓存技术
- 一级缓存
- 二级缓存
mybatis 连接池
连接池就是用于存储连接的一个容器,减少我们获取数据库连接所消耗的时间,该集合必须是线程安全的,保证两个线程不会拿到同一个连接。
SqlMapConfig.xml
文件中的配置:
dataSource type取值类型:
- POOLED:从池中获取连接,用完还给池
- UNPOOLED:每次都创建连接,用完关闭
mybatis 多表查询
一对一查询(建立实体类关系)
例子:一个员工有多个账户
两个对象:Employee 和 Account
两个表:einfo 和 account
Account对象中建立 对Employee对象的引用
AccountMapper.xml文件中定义,映射resultMap。
property:映射到对象中的变量名
column:sql语句查询得到的列名
因为两个表都有id 所以对其中一个起别名
<association>:colunm是account表中外键的名称,对应account对象中的 Employee对象的变量名。
javaType:设定返回的对象类型
一对多关系
在Employee
类中建立List<Account>
链表来存储查询到的多个账户信息。
配置文件EmployeeMapper.xml
中,一对多关联关系
使用<collection>标签
property:类对象中,链表的变量名
ofType:链表中的对象类型,全限定类名
mybatis 延迟加载
案例:
- 在查询用户时,用户在账户信息应该是什么时候用,什么时候查询。
- 在查询账户时,应该是账户所属用户信息随着账户查询时一起出现。
加载类型:
- 延迟加载:真正在使用的时候才发起查询。
一对多,多对多
的情况,查出来是个集合一般延迟加载 - 立即加载:不管用不用,调用时就发起查询。
多对一,一对一
一般查出来时单个信息,立即加载。
mybatis 缓存技术
一级缓存
同一个sqlsession对象下,使用同一个一级缓存。
连续调用两次查询方法,实际只查询一次,第二次调用缓存并且两次对象相同。
当调用SqlSession的修改,添加,删除,commit(),close()等方法时,就会清空一级缓存。
清除缓存的方法
sqlSession.clearCache();
可以看出两次查询结果不是同一个对象,没有调用缓存,并且使用了两次查询语句
二级缓存
这是指,mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFacotry对象创建的SqlSession共享缓存。
使用步骤:
- Mybatis框架配置
SqlMapConfig.xml
,默认已经打开为true - 当前映射文件支持二级缓存
EmployeeMapper.xml
- 当前操作支持二级缓存
select
操作中修改
结果如下图:
可以看出第二次查询没有使用查询语句,直接从缓存提取。但是两次对象结果不同是因为:二级缓存中存储的不是对象,而是具体的数据,取出时生成不同的对象。