1、mybatis的延迟加载
<resultMap id="userAccountMap" type="user">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="address" column="address"></result>
<result property="sex" column="sex"></result>
<result property="birthday" column="birthday"></result>
<!-- 配置user对象中accounts集合的映射 -->
<collection property="accounts" ofType="account"
select="com.itheima.dao.IAccountDao.findAccountByUid" column="id">
</collection>
</resultMap>
2、mybatis的一级缓存二级缓存
一级缓存:它指的是Mybatis中SqlSession对象的缓存,当我们执行查询之后,查询的结果会同时存入到SqlSession为我们提供一块区域中。
该区域的结构是一个Map。当我们再次查询同样的数据,mybatis会先去sqlsession中查询是否有,有的话直接拿出来用,
当SqlSession对象消失时,mybatis的一级缓存也就消失了。(默认开启)
二级缓存:它指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。
适用于缓存:
经常查询并且不经常改变的。
数据的正确与否对最终结果影响不大的。
不适用于缓存:
经常改变的数据
数据的正确与否对最终结果影响很大的。
例如:商品的库存,银行的汇率,股市的牌价。
- 在SqlMapConfig中开启二级缓存支持
<!--配置开启二级缓存-->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
- 在持久层接口中使用注解配置二级缓存
@CacheNamespace(blocking = true)
public interface IUserDao {
…
}
注意:
1、记得关闭session, sqlSession1.close();//一级缓存消失
2、sqlSession—>insert,update,delete操作会清空所在namespace下的全部缓存(包括一级缓存、二级缓存)
3、缓存是以namespace为单位的,不同namespace下的操作互不影响
3、mybatis中的注解开发(重点)
@Results(
id = "userMap",
value = {
@Result(property = "userId", column = "id", id = true),
@Result(property = "userName", column = "username"),
@Result(property = "userAddress", column = "address"),
@Result(property = "userSex", column = "sex"),
@Result(property = "userBirthday", column = "birthday"),
@Result(property = "accounts", column = "id", many = @Many(select =
"com.itheima.dao.IAccountDao.findAccountByUid", fetchType=FetchType.LAZY))
}
)
@Select("select * from user")
List<User> findAll();
- 注
<!-- mybatis的主配置文件 -->
<configuration>
<!--引入外部配置文件-->
<properties resource="jdbcConfig.properties"/>
<!--配置参数-->
<settings>
<!--开启Mybatis支持延迟加载-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"></setting>
</settings>
<typeAliases>
<!--用于在接口配置文件中,指定某个类时,避免写全限定类名,起别名-->
<!--<typeAlias type="lorihen.domain.User" alias="user"/>这是一种方式-->
<!--另外一种方式,导入整个包,该包所有的类都直接写类名-->
<package name="lorihen.domain"/>
</typeAliases>
bug : settings必须在typeAliases和 properties之间,不然暴红,原因不知