SSM(加载策略、Mybatis缓存)
延迟加载:
就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称 懒加载。
在多表中,一对多和多对多通常是采用延迟加载的,在一对一和多对一的情况下采用的是立即加载。
在association和collection标签中有一个fetchType属性,通过修改它的值,可以修改局部的加载策略。
UserMapper.xml:
局部延迟加载:
fetchType属性: lazy。 表示的就是懒加载。eager 表示的是立即加载策略。这样的是局部设置为懒加载。
<resultMap id="userMap2" type="com.findyou.entity.User"><!--这个是属性是集合的 其他对象--><id column="id" property="id"/><result column="username" property="username"/><!--这里是一对多 属性是集合类别的 因此 用的是 collection --><collection property="ordersList" ofType="com.findyou.entity.Orders"select="com.findyou.mapper.OrdersMapper.findAllOrdersByUid" column="id"fetchType="lazy"></collection></resultMap>
触发延迟加载:
要是不写setting的话,就不会去触发懒加载。
在mybatis的核心配置文件里面适用<setting>修改全局的加载策略。下面这个代码是触发的是toString(),当你调用toString()方法的时候,也就是你输出打印的时候,就会触发。
<settings><!--触发延迟加载方法 所有方法都会延迟加载--><setting name="lazyLoadTriggerMethods" value="toString()"/></settings>
全局延迟加载:
在Mybatis的核心配置文件里面中可以使用<setting>修改全局的加载策略。
但是在输出打印对象的时候,是没有懒加载的,因此要加上触发延迟加载。这样,无论什么方法都会被懒加载的。也即是相当于都被加上了 fetchType = lazy。
<settings><!--全局延迟加载--><setting name="lazyLoadingEnabled" value="true"/></settings>
注意:
局部的加载策略优先级是高于全局的加载策略。
测试代码:
/*** 一对多的嵌套查询 延迟查询*/@Testpublic void test05() {InputStream inputStream = null;try {inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");} catch (IOException e) {throw new RuntimeException(e);}SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession(); /*默认的是手动的提交 如果里面的参数是true的话 就为自动提交了*/// 这个是获取mapper对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> userList = userMapper.findAllWithOrders2();for (User user : userList) {System.out.println(user);}sqlSession.close();}
运行结果:
要是不开启懒查询的话,是:
开启懒查询的话,是:
Mybatis缓存:
经常查询一些不经常发生变化的数据,使用缓存来提高查询的效率。
mybatis是默认开启一级缓存的。
一级缓存是SqlSession范围的缓存,执行SqlSession的 增、删、改或者用ClearCache()、commit()、close()方法都会清空缓存。那么下一次用的时候就,去缓存里面找不到,就会去数据库里面找了。