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