spring 学习笔记二

二十一 spring+jdbc
1)配置数据源 (单例的bean,一般需要使用 destory-method 方法)
2)配置事物 (xml,annotation两种方式)
annotation 声明事物
(1) 声明 txManager <tx:annotation-driven transaction-manager="transactionManager" />
3)定义实体 bean
4)定义业务接口
5)实现业务接口
6)在spring中声明业务类
7)注入dataSource(不建议使用),建议使用 jdbcTemplate
jdbcTemplate.update("insert into person(name) values (?)",new Object[]{"zhangsan"},new int[]{java.sql.Types.VARCHAR})
queryForObject 采用回调方法进行数据封装

二十三 事物
使用 @Transactional 声明事物
默认对于runtimeException (unchecked)会进行回滚,对于checked exception 不回滚。
设定回滚异常 rollbackFor=Exception.class rollbackForClassName
设定不会滚异常 noRollbackFor=RuntimeException.class noRollbackForClassName
propagation 设定事务的传播行为
七种事务传播行为,比ejb多一种NESTED
REQUIRED 需要在一个事务中运行,如果在事务中运行,则加入事务,否则创建新事务。
NO_SUPPORTED 不需要事务,如果在一个事务中,则事务被挂起,执行完后恢复。
REQUIRESNEW 总是开启新事务,两个不同的事务,不会互相影响。
MANDATORY 需要在一个已有事务中运行,如果不存在事务,抛出异常
SUPPORTS 有事务的情况下,使用当前事务,否则不使用事务。
Never 不能在事物中运行,如果有事务,会抛出异常
NESTED 与REQUIRESNEW类似,ejb中没有,只针对DataSourceTransactionManager中有效,原理是在遇到 NESTED 会设定一个savepoint(保存点),如果遇到问题,回滚到保存点,在执行下面的操作。不影响外部事务,如果外部事务出错了,所有的操作都无效,内部的也无效。

readOnly=true 只读事务,不能进行更新操作,提高效率,避免hibernate自动提交
timeout 超时时间,默认30秒

isolation 隔离界别
数据库提供4中隔离级别
read uncommited  (脏读)
read commited
repeatable read
seializable

脏读:一个事务读取了另一个事务未提交的数据
不可重复读:一个事务中多次读取同一个数据,返回结果不同
可重复读:一个事务中多次读取同一个数据,返回结果相同 (快照)
幻读:一个事务去读另一个事务已经insert的数据(一般没有问题)

sql server 默认 read commited
mysql 默认 repeatable read

二十四 xml配置事务
可以使用aop的方式配置事务,不能做到精确控制了。
	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"/>	
	</bean>
	<aop:config>
		<aop:pointcut id="transactionPointcut"" expression="exceution(* ..*.*(..))"/>	
		<aop:advisor advice-ref="txAdvice" pointcute-ref="transactionPointcut"/>
	</aop:config>
	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED"/>
			<tx:method name="*"/>
		</tx:attributes>
	</tx:advice>	


二十五 spring+hibernate
创建 web 项目
只用调用 getCurrentSession() 方法才能使用事务
persist方法也save方法作用一样,都是保存。
merge与update方法一样。都是更新

你可能感兴趣的:(spring,Hibernate,bean,SQL Server,ejb)