mybatis_基础学习_04

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之间,不然暴红,原因不知

猜你喜欢

转载自blog.csdn.net/terstdfhuc/article/details/83591550