Mybatis框架学习第四天

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值