Spring(事務管理)

一、事務管理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);
 }
}
相關文章
相關標籤/搜索