- 延迟加载
- 第一步:在核心配置文件SqlMapConfig.xml
<settings> <setting name="lazyLoadingEnabled" value="true" /> <setting name="aggresiveLazyLoading" value="false" /> </settings>
- 第二步:
- 一对一(多对一) IAccountDao.xml ```xml
与IUserDao.xml的映射文件 ```xml <select id="findUserById2" parameterType="int" > select * from user where id=#{aaa} </select>
- 一对多(多对多) IUserDao.xml
<resultMap type="user"> <id column="id2" property="id" /> <collection property="accountList" ofType="cn.flyingd.domain.Account" javaType="java.util.List" column="id2" select="cn.flyingd.dao.IAccountDao.findAccountsByUid2" ></collection> </resultMap>
IAccountDao.xml
<select id="findAccountsByUid2" parameterType="int"> select * from account where uid = #{aaa} </select>
- 延迟加载:
- 基于性能的考虑,查询A对象的时候,要不要把A关联的B对象,或者是List集合对象查出来。
- 当然,有些情况下,还必须得用立即加载,比如说商品详情。
- 第一步:在核心配置文件SqlMapConfig.xml
- 缓存,Mybatis默认支持一级缓存、二级缓存(企业中不用)
- 一级缓存,其实就是SqlSession级别的缓存
IUserDao userDao = sqlSession.getMapper(IUserDao.class); User user1 = userDao.findById(41); User user2 = userDao.findById(41); 此时只发一条sql语句,并且user1与user2是同一个对象,一级缓存,缓存的是对象
``` IUserDao userDao = sqlSession.getMapper(IUserDao.class); User user1 = userDao.findById(41); sqlSession 增、删、改 sqlSession.clearCache(); User user2 = userDao.findById(41); 此时只发两条sql语句,并且user1与user2不是同一个对象
IUserDao userDao = sqlSession.getMapper(IUserDao.class); User user1 = userDao.findById(41); sqlSession.close();
sqlSession = sqlSessionFacotry.openSession(); userDao = sqlSession.getMapper(IUserDao.class); User user2 = userDao.findById(41); 此时只发两条sql语句,并且user1与user2不是同一个对象
- 二级缓存,其实就是SqlSessionFactory级别的缓存 ```xml 第一步:在核心配置文件SqlMapConfig.xml配置 <settings> <setting name="cacheEnabled" value="true" /> </settings> 第二步:在IUserDao.xml映射文件中使用二级缓存 <cache /> <select id="" parameterType="" useCache="true"> select ... </select>
IUserDao userDao = sqlSession.getMapper(IUserDao.class); User user1 = userDao.findById(41); sqlSession.close(); sqlSession = sqlSessionFacotry.openSession(); userDao = sqlSession.getMapper(IUserDao.class); User user2 = userDao.findById(41); 此时只发一条sql语句,并且user1与user2不是同一个对象 为什么不是同一个对象?因为二级缓存中缓存的数据本身,而不是缓存对象
- 一级缓存,其实就是SqlSession级别的缓存