Nutz DAO与spring集成讨论

本文介绍了NutzDAO与Spring框架集成的两种方式:仅使用Spring的IoC管理NutzDAO,事务由Nutz管理;使用Spring进行声明式事务管理。通过修改配置文件和NutzDAO源代码,实现了Spring对事务的控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Nutz DAO和spring集成也有两种方式:
    1、采用spring的Ioc,但是事务还是采用Nutz自己管理控制;
    2、采用spring的声明式事务管理控制;
    接下来我们仔细讨论下这两种方式。
    方式1:方式1非常简单,Nutz DAO不需要做任何修改即能完成,你可以在你的项目的spring配置文件中添加如下配置即可:
Java代码 复制代码  收藏代码
  1. <!-- the DataSource -->  
  2. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  3.     <property name="driverClassName" value="com.mysql.jdbc.Driver"/>  
  4.     <property name="url" value="jdbc:mysql://127.0.0.1:3306/zdtest"/>  
  5.     <property name="username" value="root"/>  
  6.     <property name="password" value="root"/>  
  7. </bean>  
  8.   
  9. <!-- Nutz DAO -->  
  10. <bean id="dao" class="org.nutz.dao.impl.NutDao">  
  11.     <property name="dataSource" ref="dataSource"/>  
  12. </bean>  
  13.   
  14. <!-- your service object that refer to the Nutz DAO -->  
  15. <bean id="petService" class="cn.zj.pubinfo.nutz.pet.PetService">  
  16.     <property name="dao" ref="dao"/>  
  17. </bean>  
	<!-- the DataSource -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
		<property name="url" value="jdbc:mysql://127.0.0.1:3306/zdtest"/>
		<property name="username" value="root"/>
		<property name="password" value="root"/>
	</bean>
	
	<!-- Nutz DAO -->
	<bean id="dao" class="org.nutz.dao.impl.NutDao">
		<property name="dataSource" ref="dataSource"/>
	</bean>

	<!-- your service object that refer to the Nutz DAO -->
	<bean id="petService" class="cn.zj.pubinfo.nutz.pet.PetService">
		<property name="dao" ref="dao"/>
	</bean>

    这种模式下,spring只提供了Ioc,事务还是有Nutz自己管理和控制。

    方式2:
    我们要在spring中声明事务管理,大致可以如下:
Java代码 复制代码  收藏代码
  1. <!-- Nutz DAO -->  
  2. <bean id="dao" class="org.nutz.dao.impl.NutDao">  
  3.     <property name="dataSource" ref="dataSource"/>  
  4. </bean>  
  5.   
  6. <bean id="petDao" class="cn.zj.pubinfo.nutz.pet.PetDao">  
  7.     <property name="dao" ref="dao"/>  
  8. </bean>  
  9.   
  10. <!-- this is the service object that we want to make transactional -->  
  11. <bean id="petService" class="cn.zj.pubinfo.nutz.pet.PetService">  
  12.     <property name="petDao" ref="petDao"/>  
  13. </bean>  
  14.   
  15. <!-- the transactional advice (what 'happens'; see the <aop:advisor/> bean below) -->  
  16. <tx:advice id="txAdvice" transaction-manager="txManager">  
  17.     <!-- the transactional semantics... -->  
  18.     <tx:attributes>  
  19.     <!-- all methods starting with 'get' are read-only -->  
  20.     <tx:method name="get*" read-only="true"/>  
  21.     <!-- other methods use the default transaction settings (see below) -->  
  22.     <tx:method name="*"/>  
  23.     </tx:attributes>  
  24. </tx:advice>  
  25.   
  26. <!-- ensure that the above transactional advice runs for any execution  
  27. of an operation defined by the FooService interface -->  
  28. <aop:config>  
  29.     <aop:pointcut id="petServiceOperation" expression="execution(* cn.zj.pubinfo.nutz.pet.PetService.*(..))"/>  
  30.     <aop:advisor advice-ref="txAdvice" pointcut-ref="petServiceOperation"/>  
  31. </aop:config>  
  32.   
  33. <!-- don't forget the DataSource -->  
  34. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  35.     <property name="driverClassName" value="com.mysql.jdbc.Driver"/>  
  36.     <property name="url" value="jdbc:mysql://127.0.0.1:3306/zdtest"/>  
  37.     <property name="username" value="root"/>  
  38.     <property name="password" value="root"/>  
  39. </bean>  
  40.   
  41. <!-- similarly, don't forget the PlatformTransactionManager -->  
  42. <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  43.     <property name="dataSource" ref="dataSource"/>  
  44. </bean>  
  45. <!-- other <bean/> definitions here -->  
	<!-- Nutz DAO -->
	<bean id="dao" class="org.nutz.dao.impl.NutDao">
		<property name="dataSource" ref="dataSource"/>
	</bean>
	
	<bean id="petDao" class="cn.zj.pubinfo.nutz.pet.PetDao">
		<property name="dao" ref="dao"/>
	</bean>
	
	<!-- this is the service object that we want to make transactional -->
	<bean id="petService" class="cn.zj.pubinfo.nutz.pet.PetService">
		<property name="petDao" ref="petDao"/>
	</bean>
	
	<!-- the transactional advice (what 'happens'; see the <aop:advisor/> bean below) -->
	<tx:advice id="txAdvice" transaction-manager="txManager">
		<!-- the transactional semantics... -->
		<tx:attributes>
		<!-- all methods starting with 'get' are read-only -->
		<tx:method name="get*" read-only="true"/>
		<!-- other methods use the default transaction settings (see below) -->
		<tx:method name="*"/>
		</tx:attributes>
	</tx:advice>
	
	<!-- ensure that the above transactional advice runs for any execution
	of an operation defined by the FooService interface -->
	<aop:config>
		<aop:pointcut id="petServiceOperation" expression="execution(* cn.zj.pubinfo.nutz.pet.PetService.*(..))"/>
		<aop:advisor advice-ref="txAdvice" pointcut-ref="petServiceOperation"/>
	</aop:config>
	
	<!-- don't forget the DataSource -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
		<property name="url" value="jdbc:mysql://127.0.0.1:3306/zdtest"/>
		<property name="username" value="root"/>
		<property name="password" value="root"/>
	</bean>
	
	<!-- similarly, don't forget the PlatformTransactionManager -->
	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"/>
	</bean>
	<!-- other <bean/> definitions here -->

    然后,我们对org.nutz.dao.impl.NutDao进行必要的修改,把NutDao中的run()方法:
Java代码 复制代码  收藏代码
  1. public void run(ConnCallback callback) {  
  2.     ConnectionHolder ch = Daos.getConnection(getDataSource());  
  3.     try {  
  4.         ch.invoke(callback);  
  5.     }  
  6.     catch (Throwable e) {  
  7.         try {  
  8.             ch.rollback();  
  9.         }  
  10.         catch (SQLException e1) {}  
  11.         if (e instanceof RuntimeException)  
  12.             throw (RuntimeException) e;  
  13.         else  
  14.             throw new RuntimeException(e);  
  15.     }  
  16.     finally {  
  17.         Daos.releaseConnection(ch);  
  18.     }  
  19. }  
	public void run(ConnCallback callback) {
		ConnectionHolder ch = Daos.getConnection(getDataSource());
		try {
			ch.invoke(callback);
		}
		catch (Throwable e) {
			try {
				ch.rollback();
			}
			catch (SQLException e1) {}
			if (e instanceof RuntimeException)
				throw (RuntimeException) e;
			else
				throw new RuntimeException(e);
		}
		finally {
			Daos.releaseConnection(ch);
		}
	}

    修改为:
Java代码 复制代码  收藏代码
  1. import org.springframework.jdbc.datasource.DataSourceUtils;  
  2.       
  3.     public void run(ConnCallback callback) {  
  4.     Connection con = DataSourceUtils.getConnection(getDataSource());  
  5.     try {  
  6.         callback.invoke(con);  
  7.     } catch (Exception e) {  
  8.         if (e instanceof RuntimeException)  
  9.             throw (RuntimeException) e;  
  10.         else  
  11.             throw new RuntimeException(e);  
  12.     } finally {  
  13.         DataSourceUtils.releaseConnection(con, getDataSource());  
  14.     }  
  15. }  
	import org.springframework.jdbc.datasource.DataSourceUtils;
		
		public void run(ConnCallback callback) {
		Connection con = DataSourceUtils.getConnection(getDataSource());
		try {
			callback.invoke(con);
		} catch (Exception e) {
			if (e instanceof RuntimeException)
				throw (RuntimeException) e;
			else
				throw new RuntimeException(e);
		} finally {
			DataSourceUtils.releaseConnection(con, getDataSource());
		}
	}

    OK,运行一下测试,得到如下日志,事务成功的日志:
Java代码 复制代码  收藏代码
  1. 2010-04-30 13:12:33,498 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [cn.zj.pubinfo.nutz.pet.IPetService.createTwoCat]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT  
  2. 2010-04-30 13:12:33,498 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver] for JDBC transaction  
  3. 2010-04-30 13:12:33,499 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver] to manual commit  
  4. 2010-04-30 13:12:33,499 [main] DEBUG org.nutz.dao.impl.NutDao - INSERT INTO t_pet(age,name) VALUES( 0'Cat 1')  
  5. 2010-04-30 13:12:33,500 [main] DEBUG org.nutz.dao.impl.NutDao - SELECT MAX(id) FROM t_pet  
  6. 2010-04-30 13:12:33,501 [main] DEBUG org.nutz.dao.impl.NutDao - INSERT INTO t_pet(age,name) VALUES( 0'Cat 2')  
  7. 2010-04-30 13:12:33,501 [main] DEBUG org.nutz.dao.impl.NutDao - SELECT MAX(id) FROM t_pet  
  8. 2010-04-30 13:12:33,502 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Initiating transaction commit  
  9. 2010-04-30 13:12:33,502 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Committing JDBC transaction on Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver]  
  10. 2010-04-30 13:12:33,529 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Releasing JDBC Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver] after transaction  
  11. 2010-04-30 13:12:33,529 [main] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource  
2010-04-30 13:12:33,498 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [cn.zj.pubinfo.nutz.pet.IPetService.createTwoCat]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
2010-04-30 13:12:33,498 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver] for JDBC transaction
2010-04-30 13:12:33,499 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver] to manual commit
2010-04-30 13:12:33,499 [main] DEBUG org.nutz.dao.impl.NutDao - INSERT INTO t_pet(age,name) VALUES( 0, 'Cat 1')
2010-04-30 13:12:33,500 [main] DEBUG org.nutz.dao.impl.NutDao - SELECT MAX(id) FROM t_pet
2010-04-30 13:12:33,501 [main] DEBUG org.nutz.dao.impl.NutDao - INSERT INTO t_pet(age,name) VALUES( 0, 'Cat 2')
2010-04-30 13:12:33,501 [main] DEBUG org.nutz.dao.impl.NutDao - SELECT MAX(id) FROM t_pet
2010-04-30 13:12:33,502 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Initiating transaction commit
2010-04-30 13:12:33,502 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Committing JDBC transaction on Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver]
2010-04-30 13:12:33,529 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Releasing JDBC Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver] after transaction
2010-04-30 13:12:33,529 [main] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource

    事务失败的日志:
Java代码 复制代码  收藏代码
  1. 2010-04-30 13:15:17,438 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [cn.zj.pubinfo.nutz.pet.IPetService.createTwoCat]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT  
  2. 2010-04-30 13:15:17,439 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver] for JDBC transaction  
  3. 2010-04-30 13:15:17,439 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver] to manual commit  
  4. 2010-04-30 13:15:17,440 [main] DEBUG org.nutz.dao.impl.NutDao - INSERT INTO t_pet(age,name) VALUES( 0'Cat 1')  
  5. 2010-04-30 13:15:17,440 [main] DEBUG org.nutz.dao.impl.NutDao - SELECT MAX(id) FROM t_pet  
  6. 2010-04-30 13:15:17,441 [main] DEBUG org.nutz.dao.impl.NutDao - INSERT INTO t_pet(age,name) VALUES( 0'Cat 2')  
  7. 2010-04-30 13:15:17,442 [main] DEBUG org.nutz.dao.impl.NutDao - SELECT MAX(id) FROM t_pet  
  8. 2010-04-30 13:15:17,442 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Initiating transaction rollback  
  9. 2010-04-30 13:15:17,442 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Rolling back JDBC transaction on Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver]  
  10. 2010-04-30 13:15:17,465 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Releasing JDBC Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver] after transaction  
  11. 2010-04-30 13:15:17,465 [main] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource  
  12. java.lang.RuntimeException: 测试Nutz DAO和spring集成事务回滚异常  
  13.     at cn.zj.pubinfo.nutz.pet.PetService.createTwoCat(PetService.java:35)  
  14. ......  
2010-04-30 13:15:17,438 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [cn.zj.pubinfo.nutz.pet.IPetService.createTwoCat]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
2010-04-30 13:15:17,439 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver] for JDBC transaction
2010-04-30 13:15:17,439 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver] to manual commit
2010-04-30 13:15:17,440 [main] DEBUG org.nutz.dao.impl.NutDao - INSERT INTO t_pet(age,name) VALUES( 0, 'Cat 1')
2010-04-30 13:15:17,440 [main] DEBUG org.nutz.dao.impl.NutDao - SELECT MAX(id) FROM t_pet
2010-04-30 13:15:17,441 [main] DEBUG org.nutz.dao.impl.NutDao - INSERT INTO t_pet(age,name) VALUES( 0, 'Cat 2')
2010-04-30 13:15:17,442 [main] DEBUG org.nutz.dao.impl.NutDao - SELECT MAX(id) FROM t_pet
2010-04-30 13:15:17,442 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Initiating transaction rollback
2010-04-30 13:15:17,442 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Rolling back JDBC transaction on Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver]
2010-04-30 13:15:17,465 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Releasing JDBC Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver] after transaction
2010-04-30 13:15:17,465 [main] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource
java.lang.RuntimeException: 测试Nutz DAO和spring集成事务回滚异常
	at cn.zj.pubinfo.nutz.pet.PetService.createTwoCat(PetService.java:35)
......

    日志表明,并查询了数据库证明,spring声明式事物工作正常。

转载于:https://www.cnblogs.com/hxy520/archive/2013/03/28/2987137.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值