Spring 允许我们在代码中添加事务,而无需直接处理 JDBC 类。为此,Spring 提供了一个事务管理包,它不仅取代了 JDBC 事务管理,而且还支持声明式事务管理(配置而不是代码)。
要使用事务性数据库访问,我们需要更改 world 数据库中表的存储引擎。下载的脚本显式创建了 MyISAM 表,它们不支持事务语义。InnoDB 存储引擎支持事务,这是我们将要使用的存储引擎。我们可以使用以下语句更改存储引擎。
Press CTRL+C to copyALTER TABLE City ENGINE=InnoDB; ALTER TABLE Country ENGINE=InnoDB; ALTER TABLE CountryLanguage ENGINE=InnoDB;
Spring 强调的一种良好的编程实践是分离接口和实现。这意味着我们可以创建一个 Java 接口,并且只使用该接口上的操作,而无需任何关于实际实现的内部知识。我们将让 Spring 管理实现,并使用它来管理我们实现的事务。
首先,您创建一个简单的接口
Press CTRL+C to copypublic interface Ex3Dao { Integer createCity(String name, String countryCode, String district, Integer population); }
此接口包含一个方法,该方法将在数据库中创建一个新的城市记录并返回新记录的 ID。接下来,您需要创建此接口的实现。
Press CTRL+C to copypublic class Ex3DaoImpl implements Ex3Dao { protected DataSource dataSource; protected SqlUpdate updateQuery; protected SqlFunction idQuery; public Integer createCity(String name, String countryCode, String district, Integer population) { updateQuery.update(new Object[] { name, countryCode, district, population }); return getLastId(); } protected Integer getLastId() { return idQuery.run(); } }
您可以看到,我们只对抽象查询对象进行操作,而不是直接处理 JDBC API。此外,这是完整的实现。我们所有的事务管理都将在配置中处理。要开始配置,我们需要创建 DAO。
Press CTRL+C to copy<bean id="dao" class="code.Ex3DaoImpl"> <property name="dataSource" ref="dataSource"/> <property name="updateQuery">...</property> <property name="idQuery">...</property> </bean>
现在我们需要设置事务配置。我们必须做的第一件事是创建事务管理器来管理数据源以及对 dao
方法所需事务属性的规范。
Press CTRL+C to copy<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*"/> </tx:attributes> </tx:advice>
上面的代码创建一个事务管理器,它处理为其提供的数据源的事务。txAdvice
使用此事务管理器,并且属性指定为所有方法创建事务。最后,我们需要使用 AOP 切点应用此建议。
Press CTRL+C to copy<aop:config> <aop:pointcut id="daoMethods" expression="execution(* code.Ex3Dao.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="daoMethods"/> </aop:config>
这基本上表示对 Ex3Dao
接口调用的所有方法都将被包装在一个事务中。要使用它,我们只需从应用程序上下文检索 dao
并对 dao
实例调用方法即可。
Press CTRL+C to copyEx3Dao dao = (Ex3Dao) ctx.getBean("dao"); Integer id = dao.createCity(name, countryCode, district, pop);
我们可以从此验证,我们的 Java 代码中没有发生事务管理,它全部通过 Spring 配置完成。这是一个非常强大的概念,被认为是 Spring 最有益的功能之一。