一、事務管理java
樣例:(使用實現PlatformTransactionManager接口的實現類DataSourceTransactionManager)mysql
applicationContext.xmlspring
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url"> <value>jdbc:mysql://localhost:3306/shopping</value> </property> <property name="username"> <value>root</value> </property> <property name="password"> <value>root</value> </property> </bean> <!-- 配置事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean>
PlatformTransactionManagerDemo.javasql
package com.ljb.spring.transaction; import javax.sql.DataSource; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; public class PlatformTransactionManagerDemo { /** * @param args */ public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); /* * 初始化事務 */ PlatformTransactionManager ptm = (PlatformTransactionManager)context.getBean("transactionManager"); DefaultTransactionDefinition dtd = new DefaultTransactionDefinition(); dtd.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus ts = ptm.getTransaction(dtd); /* * 進行事務 */ try { DataSource ds = (DataSource) context.getBean("dataSource"); JdbcTemplate jt = new JdbcTemplate(ds); jt.execute("insert into person values(22,'name22','password22')"); jt.execute("insert into person values(21,'name21','password21')"); jt.execute("insert into person values(20,'name20','password20')"); ptm.commit(ts); } catch (Exception e) { ptm.rollback(ts); e.printStackTrace(); } } }
編程式事務管理(二)(使用TransactionTemplate封裝事務管理器)express
TransactionTemplateDemo.java編程
package com.ljb.spring.transaction; import javax.sql.DataSource; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallbackWithoutResult; import org.springframework.transaction.support.TransactionTemplate; public class TransactionTemplateDemo { /** * @param args */ public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); // 得到事務管理器 PlatformTransactionManager ptm = (PlatformTransactionManager) context.getBean("transactionManager"); // 封裝事務管理器 TransactionTemplate tt = new TransactionTemplate(ptm); DataSource ds = (DataSource) context.getBean("dataSource"); final JdbcTemplate jt = new JdbcTemplate(ds); //進行事務(使用內部類) tt.execute( new TransactionCallbackWithoutResult() { protected void doInTransactionWithoutResult(TransactionStatus arg0) { jt.execute("insert into person values(22,'name22','password222')"); jt.execute("insert into person values(23,'name23','password23')"); } } ); } }
PersonDao.javaapp
package com.ljb.jdbc.object.dao; import java.util.List; public interface PersonDao { public void insert(int id, String name, String password); public void batchInsert(List persons); }
PersonDaoImpl.javaide
package com.ljb.jdbc.object.dao; import java.util.Iterator; import java.util.List; import javax.sql.DataSource; import org.springframework.jdbc.core.JdbcTemplate; import com.ljb.entity.Person; public class PersonDaoImpl implements PersonDao { private JdbcTemplate jt; public void setDataSource(DataSource dataSource) { jt = new JdbcTemplate(dataSource); } @Override public void insert(int id, String name, String password) { jt.update("insert into person values("+id+",'"+name+"','"+password+"')"); } @Override public void batchInsert(List persons) { for (Iterator it = persons.iterator();it.hasNext();) { Person person = (Person) it.next(); insert(person.getId(),person.getName(),person.getPassword()); } } }
applicationContext.xmlurl
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url"> <value>jdbc:mysql://localhost:3306/shopping</value> </property> <property name="username"> <value>root</value> </property> <property name="password"> <value>root</value> </property> </bean> <!-- 配置事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <bean id="personDao2" class="com.ljb.jdbc.object.dao.PersonDaoImpl"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 建立代理bean --> <bean id="personDaoProxyBean" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="proxyInterfaces"> <list> <!-- 指定代理接口 --> <value>com.ljb.jdbc.object.dao.PersonDao</value> </list> </property> <!-- 指定代理bean --> <property name="target" ref="personDao2"></property> <!-- 注入事務管理 --> <property name="transactionManager" ref="transactionManager"></property> <!-- 事務管理被代理bean的具體方法及方式 --> <property name="transactionAttributes"> <props> <prop key="batch*">PROPAGATION_REQUIRED</prop> </props> </property> </bean>
FirstAopDemo.javaspa
package com.ljb.spring.transaction.aop; import java.util.ArrayList; import java.util.List; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.ljb.entity.Person; import com.ljb.jdbc.object.dao.PersonDao; public class FirstAopDemo { /** * @param args */ public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); PersonDao personDao = (PersonDao) context.getBean("personDaoProxyBean"); Person p1 = new Person(); Person p2 = new Person(); p1.setId(23); p1.setName("name23"); p1.setPassword("password23"); p2.setId(24); p2.setName("name24"); p2.setPassword("password24"); List persons = new ArrayList(); persons.add(p1); persons.add(p2); personDao.batchInsert(persons); } }
schema_applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url"> <value>jdbc:mysql://localhost:3306/shopping</value> </property> <property name="username"> <value>root</value> </property> <property name="password"> <value>root</value> </property> </bean> <!-- 配置事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <bean id="personDao2" class="com.ljb.jdbc.object.dao.PersonDaoImpl"> <property name="dataSource" ref="dataSource"></property> </bean> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="batch*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut expression="execution(* com.ljb.jdbc.object.dao.PersonDao.*(..))" id="personDaoPointcut"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="personDaoPointcut"/> </aop:config> </beans>
ShemaFirstAopDemo.java
package com.ljb.spring.transaction.aop; import java.util.ArrayList; import java.util.List; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.ljb.entity.Person; import com.ljb.jdbc.object.dao.PersonDao; public class SchemaFirstAopDemo { /** * @param args */ public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("schema_applicationContext.xml"); PersonDao personDao = (PersonDao) context.getBean("personDao2"); Person p1 = new Person(); Person p2 = new Person(); p1.setId(26); p1.setName("name26"); p1.setPassword("password26"); p2.setId(25); p2.setName("name25"); p2.setPassword("password25"); List persons = new ArrayList(); persons.add(p1); persons.add(p2); personDao.batchInsert(persons); } }
annotation_applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url"> <value>jdbc:mysql://localhost:3306/shopping</value> </property> <property name="username"> <value>root</value> </property> <property name="password"> <value>root</value> </property> </bean> <!-- 配置事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <bean id="personDao2" class="com.ljb.jdbc.object.dao.PersonDaoImpl"> <property name="dataSource" ref="dataSource"></property> </bean> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>
PersonDaoImpl.java
package com.ljb.jdbc.object.dao; import java.util.Iterator; import java.util.List; import javax.sql.DataSource; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.ljb.entity.Person; @Transactional public class PersonDaoImpl implements PersonDao { private JdbcTemplate jt; public void setDataSource(DataSource dataSource) { jt = new JdbcTemplate(dataSource); } @Override public void insert(int id, String name, String password) { jt.update("insert into person values("+id+",'"+name+"','"+password+"')"); } @Transactional(propagation=Propagation.REQUIRED) @Override public void batchInsert(List persons) { for (Iterator it = persons.iterator();it.hasNext();) { Person person = (Person) it.next(); insert(person.getId(),person.getName(),person.getPassword()); } } }
AnnotationAopDemo.java
package com.ljb.spring.transaction.aop; import java.util.ArrayList; import java.util.List; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.ljb.entity.Person; import com.ljb.jdbc.object.dao.PersonDao; public class AnnotationAopDemo { /** * @param args */ public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("annotation_applicationContext.xml"); PersonDao personDao = (PersonDao) context.getBean("personDao2"); Person p1 = new Person(); Person p2 = new Person(); p1.setId(27); p1.setName("name277"); p1.setPassword("password277"); p2.setId(29); p2.setName("name29"); p2.setPassword("password29"); List persons = new ArrayList(); persons.add(p1); persons.add(p2); personDao.batchInsert(persons); } }