Spring总结笔记(三)

来源:互联网 发布:mac版cad字体乱码 编辑:程序博客网 时间:2024/05/22 04:34
JDBCTemplate
JDBCTemplate基础
作用 : 执行JDBC操作
步骤
1). 加入jar 包 :  spring-jdbc  , spring-tx , mysql-connector-...jar
2). 构造DataSource  , 使用Spring提供的连接池 : DriverManagerDataSource
3). JdbcTemplate template = new JdbcTemplate(dataSource);
JdbcTemplate标准开发+数据源配置方式
标准开发
1). Dao中注入JdbcTemplate
2). Spring容器声明JdbcTemplate的bean : <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
3). 在应用程序中注入 jdbcTemplate
数据源配置
1). Spring提供的数据源 : DriverManagerDataSource
2). c3p0 数据源 : ComboPooledDataSource
Spring中加载properties配置文件
1). 通过标签加载
加载方式 : <context:property-placeholder location="classpath:jdbc.properties"/>    支持通配的方式来加载多个配置文件 : classpath:*.properties
注意 : 该方式是先从当前系统的环境变量中加载 , 如果环境变量中存在, 直接返回, 则不从指定的配置文件中加载
2). 通过 PropertyPlaceholderConfigurer 加载 
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:db.properties</value>
</list>
</property>
</bean>
3). xml中的获取方式 : ${key}
JDBCTemplate标准DAO制作
jdbcTemplate.update(...)
jdbcTemplate.queryForObject(...)
jdbcTemplate.query(...)
数据封装
1). 通过RowMapper 实现数据封装 , 自定义数据库表的字段与实体类的属性的对应关系
2). 如果属性名与字段名一致 , 可以使用 BeanPropertyRowMapper 进行封装
JdbcDaoSupport :  内置JdbcTemplate属性,使用时需要注入对应的属性值即可,由于JdbcTemplate依赖DataSource对象执行,无需注入JdbcTemplate对象,注入DataSource对象


事务管理
Spring事务管理的优点
1). 提供一致的对于不同的事务管理的API
2). 支持声明式事务管理(重点)
3). 编程事务管理(在开发中应用比较少)
4). 优秀的整合与Spring的数据访问
Spring 事务的基本概念
PlatformTransactionManager 事务管理器
获取事务状态信息
TransactionStatus getTransaction(TransactionDefinition definition) 


提交事务
void commit(TransactionStatus status) 


回滚事务
void rollback(TransactionStatus status) 
DataSourceTransactionManager : 使用Spring JDBC或iBatis 进行持久化数据时使用
HibernateTransactionManager : 使用Hibernate3.0版本进行持久化数据时使用
TransactionDefinition 事务定义信息
获取事务对象名称
String getName()


获取事务隔离级
int getIsolationLevel()


获取事务传播行为
int getPropagationBehavior()


获取事务超时时间
int getTimeout()


获取事务是否只读
boolean isReadOnly()
name:设置参数事务管理的方法名
isolation:定义事务隔离级别
no-rollback-for:定义不参与事务回滚的异常名
rollback-for:定义参与事务回滚的异常名
Spring 出现异常时, 事务回滚操作, 针对的是运行时异常, 如果是非运行时异常(受检异常), 出现异常时, 默认是不回滚的. 
如果需要非运行时异常出现也执行回滚操作, 需要配置rollback-for属性, 指定异常类型
propagation:定义事务的传播行为
概述 : 多个具有事务控制的service的相互调用时, 所形成的复杂的事务边界控制
1). REQUIRED:该方法必须运行在一个事务中。如果一个事务正在运行,该方法将运行在这个事务中。否则,就开始一个新的事务。
2). REQUIRES_NEW:该方法必须运行在自己的事务中。它将启动一个新的事务。如果一个现有的事务正在运行,将在这个方法的运行期间挂起。
3). NESTED:如果当前存在一个事务,则该方法运行在一个嵌套的事务中。被嵌套的事务可以从当前事务中单独的提交和回滚。如果当前不存在事务,则开始一个新的事务。
4). NEVER(了解):当前方法不应该运行在一个事务中。如果当前存在一个事务,则抛出异常。
5). SUPPORTS(了解):当前方法不需要事务处理环境,但如果一个事务已经在运行的话,这个方法也可以在这个事务里运行。
6). NOT_SUPPORTED(了解):当前方法不应该运行在一个事务中。如果一个事务正在运行,它将在该方法的运行期间挂起。
7). MANDATORY(了解):该方法必须运行在一个事务中。如果当前事务不存在则抛出异常。
readonly:定义事务种类为只读事务或读写事务
只读事务不存在数据的修改,因此数据库将会为只读事务提供一些优化手段,例如Oracle对于只读事务,不启动回滚段,不记录回滚log。
timeout:定义事务超时时间,-1为永不超时
TransactionStatus 事务状态信息 , 描述了某个时间点上事务的状态信息
刷新事务
void flush() 


获取是否是否存在存储点
boolean hasSavepoint() 


获取事务是否完成
boolean isCompleted() 


获取事务是否为新的事务
boolean isNewTransaction() 


获取事务是否回滚
boolean isRollbackOnly()
     
设置事务回滚
void setRollbackOnly()
事务的隔离级别
ISOLATION_DEFAULT : 默认级别,归属下列某一种
ISOLATION_READ_UNCOMMITTED  : 可以读取未提交数据
ISOLATION_READ_COMMITTED : 只能读取已提交数据,解决脏读问题(Oracle默认级别)
ISOLATION_REPEATABLE_READ : 是否读取其他事务提交修改后的数据,解决不可重复读问题(MySQL默认级别)
ISOLATION_SERIALIZABLE : 是否读取其他事务提交添加后的数据,解决幻影读问题


事务管理方式
编程式事务管理 (了解)(开发中不使用)
TransactionTemplate : 事务管理模板对象 , 为Service注入事务管理模板TransactionTemplate
配置事务管理模板 TransactionTemplate 的bean
1). 声明事务管理器的bean , DataSourceTransactionManager , 并为其注入该事务管理的数据源的信息
2). 为TransactionTemplate注入事务管理所需要的 事务管理器
事务控制的方法 : TransactionTemplate.execute(TransactionCallback)
TransactionCallback tc = new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus ts) {
//将所有归属于同一个事务的代码写入到该方法中
accountDao.outMoney(out, money);
accountDao.inMoney(in, money);
}
};
transactionTemplate.execute(tc);
声明式事务控制
声明式事务管理(XML)
1). 在xml中开启 tx , aop 的命名空间
2). 配置事务管理器 : <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 并注入dataSource
3). 使用tx命名空间 , 配置通知
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="transfer"/>
</tx:attributes>
</tx:advice>
tx:advice:定义事务管理的通知(环绕通知)
transaction-manager:声明事务管理的实现类
tx:method:定义参与事务管理的方法
4). 配置切入点
<aop:config>
<aop:advisor advice-ref="txAdvice" 
pointcut="execution(void cn.itcast.sprng.tx.account.AccountService.*(..))"/>
</aop:config>
声明式事务管理(注解)
1). 在spring的配置文件中声明 事务管理器的Bean : <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">...</bean>
2). 开启注解事务驱动: <tx:annotation-driven transaction-manager="transactionManager"/>
3). @Transactional 为方法, 或类, 或接口提供事务管理
XML 配置 与 注解配置 对比
1). XML 配置 方便集中维护, 管理
2). 注解配置方便, 简单