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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章