Spring 中的 JdbcTemplate
它是 spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装。 spring 框架为我们提供了很多
的操作模板类。
除了默认构造函数之外,都需要提供一个数据源依赖注入即可
在 dao 中使用 JdbcTemplate注意事项
第一种在 Dao 类中定义 JdbcTemplate 的方式,适用于所有配置方式(xml 和注解都可以)。
第二种让 Dao 继承 JdbcDaoSupport 的方式,只能用于基于 XML 的方式,注解用不了。
Spring 中的事务控制API 介绍
PlatformTransactionManager此接口是 spring 的事务管理器
--TransactionStatus getTransaction(TransactionDefinition definition)获取事务状态
--void commit(TransactionStatus status)提交事务
--void rollback(TransactionStatus status)
真正管理事务的对象
org.springframework.jdbc.datasource.DataSourceTransactionManager 使用 Spring
JDBC 或 iBatis 进行持久化数据时使用
org.springframework.orm.hibernate5.HibernateTransactionManager 使用
Hibernate 版本进行持久化数据时使用
TransactionDefinition事务的定义信息对象
--String getName()获取事务对象名称
--int getIsolationLevel()获取事务隔离级别
--int getPropagationBehavior()获取事务传播行为
--int getTimeout() 获取事务超时时间
--boolean isReadOnly()是否只读事务
TransactionStatus
--void flusth()刷新事务
--Boolean hasSavepoint()是否存在存储点
--boolean isNewTransaction()事务是否是新的
--boolean isCompleted()事务是否完成
--boolean isRollbackOnly()是否回滚
事务的隔离级别反应事务提交并发访问时的处理态度
read uncommitted
读未提交的数据
read committed
读已经提交的数据,解决脏读问题(Oracle 默认级别)
repeatable read
读取其它事务提交修改后的数据,解决不可重复读(Mysql默认级别 )
serializable
是否读取其它事务提交添加后的数据,解决幻影读问题
事务的传播行为
REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值)
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)
MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常
REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
NEVER:以非事务方式运行,如果当前存在事务,抛出异常
NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行 REQUIRED 类似的操作。
基于 XML 的声明式事务控制(配置方式)
第一步: 配置事务管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
第二步:配置事务的通知引用事务管理器
<tx:advice id="txAdvise" transaction-manager="transactionManager">
<!-- 配置service实现类中,每一个方法对事务的支持情况
propagation:传播行为
read-only:是否只读
name : 方法名称
可以支持通配符的写法(*:代表任意字符串)
-->
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" read-only="false"/>
</tx:attributes>
</tx:advice>
第三步:配置 AOP 切入点表达式
<!-- 定位需要添加事务的类和方法 -->
<aop:config>
<!-- 定义切入点 -->
<aop:pointcut expression="execution(* cn.ithehe.service.impl.*.*(..))" id="pt"/>
<!-- 定义事务通知
将切入点和事务通知联系起来
-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt" />
</aop:config>
基于注解的配置方式
第一步:配置事务管理器并注入数据源
第二步:在业务层使用@Transactional 注解
出现接口上,表示该接口的所有实现类都有事务支持。
出现在类上,表示类中所有方法有事务支持
出现在方法上,表示方法有事务支持。
以上三个位置的优先级:方法>类>接口
第三步:在配置文件中开启 spring 对注解事务的支持
<tx:annotation-driven transaction-manager="transactionManager"/>(默认)
第四步:开启对事务注解的支持@EnableTransactionManagement