Mybatis中的延迟加载
- 什么是延迟加载:在真正使用数据时发起查询,不使用时不查询,也叫按需加载(懒加载)
- 正常加载:不管用不用,一调用方法立刻发起查询。
- 在对应的四种表的关系中:
一对多,多对多:一般采用延迟加载,
一对一,多对一:一般采用正常加载。
注意:要使用延迟加载的技术需要在mybatis主配置文件中作如下配置,
<settings>
<!--开启全局关联对象的延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
同时要在需要做延迟加载的dao类对应mapper的配置文件中,例如是延迟加载查询一个用户的账户信息,配置如下
property是对应的实体的属性名称,oftype是集合的元素类型,colum代表了下一次对象相关查询需要的当前表列名的参数名称,select是另一个dao查询方法的映射配置调用,如有属性映射也会从对应的配置中自动解析。
<--配置延迟加载的对象的参数信息-->
<collection property="userId" ofType="account" column="user_id" select="fun.borened.dao.AccountDao.findByUid"></collection>
延迟加载:当用户不使用相应的关联对象的属性时,就不会查询,按需查询。
Mybatis中的缓存
缓存:存在内存中的临时数据,减少了和数据库的交互,提高了执行效率。
适用于缓存:用于不经常改变的数据且经常查询的数据,且缓存的数据正确与操作结果影响不大。
不适用的举例:银行的汇率,股市的牌价。
Mybatis中的一级缓存:它指的是mybatis中的SqlSession对象的缓存。
查询数据时,mybatis结果集会存到SqlSession中的一块区域中,它是一个Map集合,当有相同的查询请求时,不会再执行sql,而是从缓存中取。
当该SqlSession对象关闭时(或手动清除了缓存),缓存也就消失了。
此外,更新,添加,删除等操作都会清空缓存。
使用同一个SqlSession对象查询
Mybatis中的二级缓存:它指的是mybatis中SqlSessionFactory对象的缓存,由同一个SqlSessionFactory对象生产的SqlSession共享其缓存内容。
二级缓存使用步骤:
1.在主配置文件中开启支持全局缓存(默认是开启)
2.在映射配置文件中添加标签,同时在需要使用缓存的select标签中添加useCache="true"属性。
即可使用二级缓存,注意二级缓存存的仅仅是数据,因此从二级缓存中取到的对象是不同的。如图:
Mybatis中常用注解的使用
注意:如果dao中使用了注解,将不能再配置mapper映射文件。
在主配置文件中需要使用以下配置
<!--指定带有注解的dao接口的位置 -->
<mappers>
<package name="fun.borened.dao"/>
</mappers>
基本的CURD,注解写在dao的方法上方即可:
@Select @Insert @Update @Delete
- 当实体类的属性和数据表列名不一致,需要使用别名的配置方法
//1.查询所有用户
@Select("select *from user")
@Results(id="userMap",value={
@Result(id=true,property="userId",column="id"),//主键列
@Result(property="username",column="username"),
@Result(property="sex",column="sex"),
@Result(property="birthday",column="birthday"),
@Result(property="address",column="address"),
})
List<User> findAll();
//2.根据id查询
@Select("select *from user where id=#{userId}")
@ResultMap(value = { "userMap" })
User findById(Integer id);
- 一对一的查询
配置多对一(mybatis把多对一看成是一对一)时,最后一行@Result的
colum代表了下一次对象相关查询需要的当前表列名的参数名称,One是代表一对一的的接口,
select是调用一个全限定类的方法路径,fetchType设置是否使用延迟加载。
//查询所有账户信息以及相关的用户信息
@Select("select *from account")
@Results(id="accountMap",value={
@Result(id=true,property="accountId",column="id"),
@Result(property="userId",column="user_id"),
@Result(property="money",column="money"),
@Result(property="user",column="user_id",one=@One(select="fun.borened.dao.UserDao.findById",fetchType=FetchType.EAGER))
})
List<Account> findAll();
- 一对多
大概步骤同上,只需要将一对一的属性One更改为Many(一对多),mybatis就会为我们自动一对多的查询。 - 注解配置是否启用二级缓存(SqlSessionFactory)技术(一级SqlSession对象的缓存默认开启)
主配置文件中开启二级缓存(默认开启可不设置),必须在Dao的类名前加上@CacheNamespace(blocking=true)的配置,这样就开启了。
结束… in the end,keep on fighting