一.延迟加载
概念:延迟加载也叫懒加载,具体的意思就是:在关联查询时,利用延迟加载,先加载主信息。使用关联信息时再去加载关联信息。
作用:什么时候用就什么时候加载,延迟加载特性可有效的减少数据库压力。
**操作步骤:**
在settings里面配置两句话,相当于开启缓存配置的按钮
<!--开启延迟加载-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--关闭积极加载-->
<setting name="aggressiveLazyLoading" value="false"/>
<!--当你调用toString方法无效时加载-->
<setting name=”lazyLoadTriggerMethods value=’’”/>
查询主表的信息(根据id来查询(子查询加载哪(resultMap(select=””(如果是另外一个mapper引入进来,要加上完成包名加上类名)))))
二.缓存
概念:就是将程序或系统经常要调用的对象存在内存中,以便其使用时可以快速调用,不必再去创建新的重复的实例。
好处:提高加载速度,同样的数据不用一直查询数据库。可以减少系统开销,提高系统效率。
缺点:可能查询出来的不是最新的数据(可能是脏数据)。
缓存分为一级缓存,二级缓存和自定义缓存
一级缓存的作用域只在当前的sqlSsesion有效(默认一级缓存自动开启)
二级缓存作用域是针对整个mapper,只要在同一个mapper中二级缓存都有效。
使用二级缓存的步骤:
1.在使用二级缓存的时候要关闭一级缓存(调用其commit()方法)
2. 对象要进行序列化操作Serialization
3. 对象的xml里面namespace下面配置
禁用缓存的方法:userCache=”false”。
刷新二级缓存的方法:sqlSsetion.clearCache()。
自定义缓存:(待补充,,,,,,)
三.声明式事务
spring支持编程式事务管理和声明式事务管理两种方式。
编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中.
声明式事务管理也有两种常用的方式
一种是基于tx和aop名字空间的xml配置文件,
另一种就是基于@Transactional注解。
显然基于注解的方式更简单易用,更清爽。
基于tx和aop名字空间的xml
<!--定义事物通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManger">
<tx:attributes><!--tx的一些属性,name声明式对哪些方法有效(只要包含find,事务就对其有效)-->
<!--name代表对应的方法名 第二个代表是事物的传播行为,事物失效的时间,事物的隔离级别-->
<!--指定异常进行回滚-->
<tx:method name="find" propagation="SUPPORTS" timeout="-1" isolation="DEFAULT" />
<tx:method name="add" propagation="REQUIRED"></tx:method>
<tx:method name="*" propagation="REQUIRED"></tx:method>
</tx:attributes>
</tx:advice>
基于@Transactional注解的xml
<!--自动扫描包-->
<context:component-scan base-package="com.offcn.service"/>
<!--开启注解驱动-->
<tx:annotation-driven/>
用法:
// @Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。
//虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。
//另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。
//默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰
复习前面学过的注解
dao层的注解 @Repository
service 层的@service
@Autowired 按照类型
@Qualifier(按照名称) @Resource
四.Mybatis-spring整合
第一步导入jar包mybatis-spring-1.2.0.jar
第二步 所有的都是由spring来进行管理,写spring的核心配置文件applicationContex.xml(第一个bean 获取连接数据源,第二个bean 获取工厂sqlSsesionFactory(引入数据库资源(dataSource),引入mybatis核心配置文件))
第三个bean(配置dao层,第一种方式通过MapperFactoryBean引入你的接口类和sqlSessionFactory。第二种方式MapperScannerConfigurer))