Spring学习第四天

193 阅读3分钟

spring中JDBCTemplete

1 JDBCTemplete作用

用于和数据库交互的实现对表的CRUD操作

2 如何创建JDBCTemplete

public JdbcTemplate() {  } 

public JdbcTemplate(DataSource dataSource) {   
setDataSource(dataSource); 
afterPropertiesSet();  
} 

public JdbcTemplate(DataSource dataSource, boolean lazyInit) {   
setDataSource(dataSource); 
setLazyInit(lazyInit);   
afterPropertiesSet();  
} 

dbutils中的QueryRunner的Query方法返回值是 由参数ResultSetHandler决定

spring的JDBCTemplete的Query方法返回值是多种

对象在常用方法

3 配置 spring 内置数据源

spring 框架也提供了一个内置数据源,我们也可以使用 spring 的内置数据源,它就在 spring-jdbc-5.0.2.REEASE.jar 包中:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>  
<property name="url" value="jdbc:mysql:///spring_day02"></property>  
<property name="username" value="root"></property>  
<property name="password" value="1234"></property> 
</bean> 

spring的AOP事务控制

JDBCDaoSupport 如果继承的话org.springframework.jdbc.core.support.JdbcDaoSupport 不能使用注解配置

如果自己实现 可以使用注解配置

第一种在 Dao类中定义 JdbcTemplate 的方式,适用于所有配置方式(xml和注解都可以)。

第二种让 Dao继承 JdbcDaoSupport 的方式,只能用于基于 XML 的方式,注解用不了。

spring的事务控制

PlatformTransactionManager

真正管理事务的对象 org.springframework.jdbc.datasource.DataSourceTransactionManager 使用 Spring JDBC 或 iBatis 进行持久化数据时使用

org.springframework.orm.hibernate5.HibernateTransactionManager 使用 Hibernate 版本进行持久化数据时使用

TransactionDefinition

事务的隔离级别

TransactionDefinition.ISOLATION_DEFAULT:使用后端数据库默认的隔离界别,MySQL默认采用的REPEATABLE_READ隔离级别,Oracle默认采用的READ_COMMITTED隔离级别。

TransactionDefinition.ISOLATION_READ_UNCOMMITTED:最低的隔离级别,允许读取,允许读取尚未提交的的数据变更,可能会导致脏读、幻读或不可重复读。

TransactionDefinition.ISOLATION_READ_COMMITTED:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。

TransactionDefinition.ISOLATION_REPEATABLE_READ:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

TransactionDefinition.ISOLATION_SERIALIZABLE:最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就说,该级别可以阻止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别

环绕通知注解的话 不会出现顺序问题

spring事务管理器

SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务) 查询使用

TransactionStatus

事务按步骤提交 (存储点)

基于XML

配置事务管理器

<!-- 配置一个事务管理器 --> 
<bean id="transactionManager" 
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 


 <!-- 注入 DataSource -->  
<property name="dataSource" ref="dataSource"></property> </bean>

配置事务的通知引用事务管理器

<!-- 事务的配置 --> 
<tx:advice id="txAdvice" transaction-manager="transactionManager"> 
</tx:advice> 

配置事务的属性

<!--在 tx:advice 标签内部 配置事务的属性 --> 
tx:attributes> 
<!-- 指定方法名称:是业务核心方法   
read-only:是否是只读事务。默认 false,不只读。  
isolation:指定事务的隔离级别。默认值是使用数据库的默认隔离级别。   propagation:指定事务的传播行为。  
timeout:指定超时时间。默认值为:-1。永不超时。  
rollback-for:用于指定一个异常,当执行产生该异常时,事务回滚。产生其他异常,事务不回滚。 没有默认值,任何异常都回滚。  
no-rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时,事务回 滚。没有默认值,任何异常都回滚。  -->  
<tx:method name="*" read-only="false" propagation="REQUIRED"/>  <tx:method name="find*" read-only="true" propagation="SUPPORTS"/>
</tx:attributes> 

配置 AOP 切入点表达式

<!-- 配置 aop -->
<aop:config> 
<!-- 配置切入点表达式 --> 
<aop:pointcut expression="execution(* com.itheima.service.impl.*.*(..))" id="pt1"/> 
</aop:config> 

配置切入点表达式和事务通知的对应关系

<!-- 在 aop:config标签内部:建立事务的通知和切入点表达式的关系 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"/> 

基于注解

<!-- 开启 spring 对注解事务的支持 --> 
<tx:annotation-driven transaction-manager="transactionManager"/>

@EnableTransactionManagement 

@Transactional 注解

该注解的属性和 xml 中的属性含义一致。

该注解可以出现在接口上,类上和方法上。

出现接口上,表示该接口的所有实现类都有事务支持。

出现在类上,表示类中所有方法有事务支持

出现在方法上,表示方法有事务支持。

以上三个位置的优先级:方法>类>接口