Mybatis-spring整合

一.延迟加载

概念:延迟加载也叫懒加载,具体的意思就是:在关联查询时,利用延迟加载,先加载主信息。使用关联信息时再去加载关联信息。

作用:什么时候用就什么时候加载,延迟加载特性可有效的减少数据库压力。

**操作步骤:**
在settings里面配置两句话,相当于开启缓存配置的按钮
		
		
		
		


查询主表的信息(根据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/>

Mybatis-spring整合_第1张图片

用法:

// @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))

你可能感兴趣的:(mybatis,spring,延迟加载,缓存,声明式事务)