[Spring学习笔记 7 ] Spring中的数据库支持 RowMapper,JdbcDaoSupport 和 事务处理Transaction

1.Spring中的数据库支持
把具有相同功能的代码模板抽取到一个工具类中。
2.关于jdbc template的应用
jdbcTemplate模板操作类,把访问jdbc的模板抽取到template中,使用模板类,可以不用管有关连接管理,关闭等细节,只关注核心业务代码,外围事情交给 Spring的模板去处理。
3.Spring框架关于对数据库的支持
A、统一的事务平台trasaction Management

B、提供Dao support,support封装了有关template.
public class SpringJdbcTemplateBestSupport extends JdbcDaoSupport implements IpersonDao {
public void save(Person p) {
//使用spring的jdbc Mapping工具,简化jdbc的调用
String sql = "insert into person(name,age) values('" + p.getName() + "'," + p.getAge() + ")";
System.out.println("save:" + sql);
getJdbcTemplate().update(sql);
}
}

C、提供对jdbc Mapping工具,简化了jdbc的调用 。
@SuppressWarnings({ "rawtypes", "unchecked" })
public List<Person> loadAll() {
return getJdbcTemplate().query("select * from person", new RowMapper() {
public Person mapRow(ResultSet rs, int rowNum) throws SQLException {
Person person = new Person();
person.setId(rs.getLong("id"));
person.setAge(rs.getInt("age"));
person.setName(rs.getString("name"));
return person;
}
});
}

D、把数据访问异常统一 封装起来。DataAccessException
E、整合其它ormapping框架


四、事务处理
1.事务概述
atomic(原子性):要么发生,要么都不发生
consistent(一致性):数据应该不被破坏 两个人同时访问数据库,其中一个人对数据库进行了操作,另一个人看到的数据应当保持刚开始的状态,不受到影响。
isolate(隔离性):用户间操作不相混淆
Durable(持久性):永久保存,例如保存到数据库等
jdbc事务的调用
Connection conn;
conn.setAutoCommit(false);
操作1.。
操作2.。
conn.commit();
hiberante
session.save(...);
tx.commit();

基于Spring操作事务的应用方式,编程式事务/声明式事务

2.Spring中的事务管理API

1)PlatformTransactionManager 事务管理器接口
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;

2)TransactionStatus 事务状态
isNewTransaction() 是否是新事务
hasSavepoint() 保存点,oracle
void flush();刷新

3.声明式事务管理使用----基于xml
把事务控件有关的操作在配置文件中进行说明,代码中不要任何事务控制的代码

Spring中事务的传播:REQUIRED(需要事务,对会引起数据更新的方法)/SUPPORTSA(支持事务,对于查询类的就
去)
<!-- 配置事务 -->
<!-- 配置一个事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="mydataSource"></property>
</bean>

<!-- 配置事务通知 -->
<tx:advice id="transferServieAdvice" transaction-manager="transactionManager">
<!-- 事务属性 -->
<tx:attributes>
<tx:method name="transferMoney" propagation="REQUIRED" />
<tx:method name="saveMoney" propagation="REQUIRED" />
<tx:method name="takeMoney" propagation="REQUIRES_NEW" />
<!-- 查询类的方法用下面的配置 ,不用强制开事务,则可以提升性能 -->
<tx:method name="*" propagation="SUPPORTS" read-only="true" />
<!-- <tx:method name="*" propagation="REQUIRED" />
--> </tx:attributes>
</tx:advice>
<aop:config>
<!-- 增强,对哪一些切一点(pointcut)进行什么样(advice-ref)的事务增强。 -->
<aop:advisor advice-ref="transferServieAdvice" pointcut="execution(* com.amos..*
(..))" />
</aop:config>

4.声明式事务管理使用----基于注解
1)在配置文件 中告诉spring通过注解去扫描业务Bean的事务配置信息。

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


<!-- 表示事务的配置均在注解中 -->
<tx:annotation-driven/>
2)、写业务Bean时,在需要开启事务的Bean上或者方法使用@Transactional标签来指定事务配置的特性。
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void saveMoney(String name, Double money) {
......
}

@Transactional(propagation=Propagation.SUPPORTS)
public void takeMoney(String name, Double money) {
......
}

事务是定义在业务层!hibernate中把事务写在持久层会导致许多问题。

代码实现可参考https://github.com/amosli/lspring_jdbc.git

你可能感兴趣的:(transaction)