查询
一对一查询:
resultType:自定义一个pojo类包含查询结果的所有字段即可实现映射,无特殊需求(其别名、延迟加载)是用resultType
resultMap:映射到一个项目的vo类,关联的属性用association进行进一步的关联查询,用javaType表示类型,用可实现延迟加载,可用继承省略相同的联系
一对多查询:
由于一对多关系较为特殊,多的部分如果列入每个pojo则一的部分会出现重复,及每个情况一条记录,一对多也可使用resultMap,多的部分设为一的部分的集合属性,用collection关键字,用oftype表示类型
多对多查询:
同理,有映射要求的(关联关系定义)用resultMap,且collection和association可自嵌套和互相嵌套
延迟加载
collection和association可实现延迟加载
association中的select指定执行的statement的id
延迟加载配置:
<settings>
<setting name="lazyLoadingEnable" value="true" />
<setting name="agressiveLazyLoading" value="false"/>
</settings>
缓存
缓存的作用:减少数据库操作
一级缓存
1.sqlsession级别,不同sqlsession互不干扰,每个对象中有一个hashmap
2.在查询时先查询一级缓存,如果查询不到,再去数据库查询,一旦执行插入、清除、更新操作,就清空缓存,避免脏读
3.一级缓存是默认的,不需要配置
二级缓存
1.mapper级别,多个sqlsession操作同一个mapper的sql语句,多个session共用二级缓存,二级缓存是跨session的
2.一个sqlsession查询的结果存在二级缓存中,其他sqlsession执行同样查询是可以直接从二级缓存中取,一个mapper二级缓存只有一个,多个sqlsession共享一个hashmap(按照namespace划分)
3.二级缓存默认不开启,需要配置
sqlMapConfig.xml:
<setting name="cacheEnabled" value="true"></setting>
mapper.xml
<cache />
4.需要将数据序列化,因为二级缓存的介质不一定是内存,取出时需要反序列化
5.在sqlsession关闭的时候执行写入二级缓存操作
6.提交之后清空缓存
分布式缓存
作用:不使用分布式缓存,缓存的数据单独存在一个服务器,导致服务器之间的协作困难
实现方法:mybatis提供cache接口,重写接口的方法整合第三方缓存即可
mybatis默认实现的cache类PerpetualCache
示例:ehcache的整合
1.导入对应的ehcahe包
2.在mapper.xml文件中配置
<cache type="org.mybatis.cache.ehcache.EhchaheCache">
3.配置ehcache.xml
引用场景:查询频繁或查询耗时且实时要求不高
处理:间隔一段时间更新缓存(flushinterval)
局限性:一次更新是整个mapper更新,不适合细粒度的缓存