加载
- 延迟加载:
在真正使用数据时才发起查询,也叫按需(懒)加载。通常用于:多对多,一对多。
单独配置文件
<!--select属性指定的内容:查询用户的唯一标识 (调用之前编写的方法全限定类名+方法名)-->
<collection property="accounts" ofType="com.mybatisDemo.domain.Account" select="">
<id column="id" property="id"></id>
<result column="uid" property="uid"></result>
<result column="money" property="money"></result>
</collection>
主配置文件
<!--开启全局延迟加载-->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
- 立即加载:
不管用不用只要调用方法马上发起查询;默认是立即加载。通常用于:一对一,多对一。
缓存
- 缓存是什么:
存在于内存中的临时数据。 - 为什么使用缓存:
减少和数据库的交互次数,提高执行效率。 - 适用于缓存的数据:
经常查询,不经常改变的,正确与否最终结果影响不大的。 - 一级缓存:
指的是Mybatis中SqlSession对象的缓存,当执行查询之后,结果会同时存到sqlSession对象中,结果是一个Map。再次查询时,就先去sqlSesion中查询是否有,有的话会直接拿来用。当sqlSession消失时,Mybatis的一级缓存也就消失了。当调用添加,修改,删除,commit,close方法时会清空一级缓存。 - 二级缓存:
Mybatis是SqlSessionFactory对象的缓存,由同一个sqlSessionFactory对象创建的sqlSession缓存。
存放的是数据而不是对象。
主配置文件开启二级缓存:
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
单独配置文件开启:
<!--开启二级缓存-->
<cache/>
<!--配置查询所有-->
<select id="findAll" resultMap="userAccountMap" useCache="true">
select * from user u left outer join account a on u.id = a.uid
</select>
注解
使用注解开发会更简便,不需要去编写单独的配置文件,只需要编写一个主配置文件。
当domian中属性名称与字段名字不同时,在dao中添加:
// 新建UserMap
@Results(id = "userMap",value = {
@Result(id = true,column = "id",property = "userId"),
@Result(column = "username",property = "userName")
})
//引用编写好的UserMap
@ResultMap(value = {"userMap"})
一对一(多对一):
除了要在主表中添加从表的对象还要添加对应的Map
// 添加关联表信息
@Results(id = "accountId",value = {
@Result(id = true,column = "id",property = "id"),
@Result(column = "uid",property = "uid"),
@Result(column = "money",property = "money"),
// 关联字段uid select = 全限定类名+可以执行的方法 fetchType设置加载类型(立即/延时),
@Result(property = "user",column = "uid" , one=@One(select = "com.mybatis.dao.AccountDao.findById",fetchType=FetchType.EAGER))
})
一对多:
主表实体类添加从表list对象将一对多的one改成many
二级缓存:
主配置文件添加:
<!--开启二级缓存-->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
在dao层的类上发添加注解:
@CacheNamespace(blocking = true)
Mybatis的学习结束了,但是我觉得我与Mybatis的故事才刚刚开始。