15.2 Транзакционный доступ к JDBC
Spring позволяет добавлять транзакции в наш код без необходимости непосредственного взаимодействия с классами JDBC. Для этой цели Spring предоставляет пакет управления транзакциями, который не только заменяет управление транзакциями JDBC, но также позволяет декларативное управление транзакциями (настройка вместо кода).
Для использования транзакционного доступа к базе данных, нам нужно изменить движок хранения таблиц в базе данных world. Загруженный скрипт явно создает таблицы MyISAM, которые не поддерживают транзакционные семантики. Движок хранения InnoDB поддерживает транзакции, и именно его мы будем использовать. Мы можем изменить движок хранения следующими операторами.
ALTER TABLE City ENGINE=InnoDB;
ALTER TABLE Country ENGINE=InnoDB;
ALTER TABLE CountryLanguage ENGINE=InnoDB;
Хорошей программистской практикой, подчеркиваемой Spring, является разделение интерфейсов и реализаций. Это означает, что мы можем создать Java интерфейс и использовать только операции с этим интерфейсом без каких-либо внутренних знаний о фактической реализации. Мы позволим Spring управлять реализацией, и с этим он будет управлять транзакциями для нашей реализации.
Сначала создайте простой интерфейс:
public interface Ex3Dao {
Integer createCity(String name, String countryCode,
String district, Integer population);
}
Этот интерфейс содержит один метод, который создаст новую запись города в базе данных и вернет идентификатор новой записи. Затем вам необходимо создать реализацию этого интерфейса.
public 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();
}
}
Вы можете видеть, что мы работаем только с абстрактными объектами запросов и не имеем дело напрямую с API JDBC. Кроме того, это полная реализация. Все наше управление транзакциями будет обрабатываться в конфигурации. Чтобы начать конфигурацию, нам нужно создать DAO.
<bean id="dao" class="code.Ex3DaoImpl">
<property name="dataSource" ref="dataSource"/>
<property name="updateQuery">...</property>
<property name="idQuery">...</property>
</bean>
Теперь нам нужно настроить конфигурацию транзакций. Первое, что мы должны сделать, это создать менеджер транзакций для управления источником данных и указать, какие свойства транзакций требуются для методов dao.
<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.
<aop:config>
<aop:pointcut id="daoMethods"
expression="execution(* code.Ex3Dao.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="daoMethods"/>
</aop:config>
Это в основном означает, что все методы, вызываемые на интерфейсе Ex3Dao, будут обернуты в транзакцию. Чтобы воспользоваться этим, нам нужно только получить dao из контекста приложения и вызвать метод на экземпляре dao.
Ex3Dao dao = (Ex3Dao) ctx.getBean("dao");
Integer id = dao.createCity(name, countryCode, district, pop);
Из этого мы можем убедиться, что в нашем Java-коде нет управления транзакциями, и все это настроено с помощью Spring. Это очень мощное понятие и считается одной из самых полезных функций Spring.
© 2025 Oracle
Licensed under the GPLv2 License.