1. 程式人生 > >Spring 10:spring與Mybatis和jdbc結合

Spring 10:spring與Mybatis和jdbc結合

需要jar包

※ Spring與jdbc結合


    jdbc程式設計不變,主要是Connection物件的維護,即配置並使用資料來源
    1)<!-- 基於jdk的規範資料來源 -->
    

    <bean name="dataSource1"
        class="oracle.jdbc.pool.OracleConnectionPoolDataSource">
        <property name="networkProtocol">
            <value>tcp</value>
        </property>
        <property name="databaseName">
            <value>XE</value>
        </property>
        <property name="driverType">
            <value>thin</value>
        </property>
        <property name="portNumber">
            <value>1521</value>
        </property>
        <property name="user">
            <value>briup</value>
        </property>
        <property name="serverName">
            <value>127.0.0.1</value>
        </property>
        <property name="password">
            <value>briup</value>
        </property>
    </bean>


    
    注意:別忘了讀取配置檔案
  

    <!-- 讀取這個資原始檔 讀完之後下面就可以用${key}來去檔案中的value值了 -->
    <!-- 這種方式是我們第一節學習的那種配置方式方式的簡寫 -->
    <context:property-placeholder location="classpath:oracle.perperties"/>

    2)<!-- dbcp資料來源 -->
    

    <bean id="dataSource2"
        class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName">
            <value>${driver}</value>
        </property>
        <property name="url">
            <value>${url}</value>
        </property>
        <property name="username">
            <value>${user}</value>
        </property>
        <property name="password">
            <value>${password}</value>
        </property>
        <!-- 最大連線數 -->
        <property name="maxActive">
            <value>80</value>
        </property>
        <!-- 最大空閒連線數 -->
        <property name="maxIdle">
            <value>20</value>
        </property>
        <!-- 最大等待時間:當沒有可用連線時,連線池等待連線被歸還的最大時間 單位:毫秒 -->
        <!-- 超過時間則丟擲異常,如果設定為-1表示無限等待 -->
        <property name="maxWait">
            <value>3000</value>
        </property>
    </bean>

    3)<!-- spring提供的一種資料來源 -->
      

     <bean id="dataSource3"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName">
            <value>${driver}</value>
        </property>
        <property name="url">
            <value>${url}</value>
        </property>
        <property name="username">
            <value>${user}</value>
        </property>
        <property name="password">
            <value>${password}</value>
        </property>
      </bean>

    
    4)c3p0資料來源
    

    <!-- c3p0資料來源 -->
    <bean id="dataSource4" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close">
        <property name="driverClass">
            <value>${driver}</value>
        </property>
        <property name="jdbcUrl">
            <value>${url}</value>
        </property>
        <property name="user">
            <value>${user}</value>
        </property>
        <property name="password">
            <value>${password}</value>
        </property>

        <!--連線池中保留的最小連線數。 -->
        <property name="minPoolSize">
            <value>5</value>
        </property>

        <!--連線池中保留的最大連線數。Default: 15 -->
        <property name="maxPoolSize">
            <value>30</value>
        </property>

        <!--初始化時獲取的連線數,取值應在minPoolSize與maxPoolSize之間。Default: 3 -->
        <property name="initialPoolSize">
            <value>10</value>
        </property>

        <!--最大空閒時間,60秒內未使用則連線被丟棄。若為0則永不丟棄。Default: 0 -->
        <property name="maxIdleTime">
            <value>60</value>
        </property>

        <!--當連線池中的連線耗盡的時候c3p0一次同時獲取的連線數。Default: 3 -->
        <property name="acquireIncrement">
            <value>5</value>
        </property>

        <!--每60秒檢查所有連線池中的空閒連線。Default: 0 -->
        <property name="idleConnectionTestPeriod">
            <value>60</value>
        </property>

        <!--定義在從資料庫獲取新連線失敗後重復嘗試的次數。Default: 30 -->
        <property name="acquireRetryAttempts">
            <value>30</value>
        </property>
    </bean>
1.實體類hus物件(資料庫建表)

package com.briup.db;
public class Hus {
	private long id;
	private String name;
	private int age;
	public long getId() {
		return id;
	}
	public Hus(long id, String name, int age) {
		this.id = id;
		this.name = name;
		this.age = age;
	}
	public Hus() {
	}
	public void setId(long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

2.dao層介面

package com.briup.db;

public interface HusDao {
	void updateHus(Hus hus);
}


3.jdbc需要提供實現類

package com.briup.db.jdbc;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;


import com.briup.db.Hus;
import com.briup.db.HusDao;

public class HusDaoImpl implements HusDao{
	private DataSource datasource;
	@Override
	public void updateHus(Hus hus) {
		// TODO Auto-generated method stub
		Connection conn=null;
		try {
			//從資料來源中獲取連線物件
			conn=datasource.getConnection();
			System.out.println("conn:"+conn);
			/*
			 * 指向sql操作
			 */
			conn.commit();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(conn!=null)
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		}
	}
	public DataSource getDatasource() {
		return datasource;
	}
	public void setDatasource(DataSource datasource) {
		this.datasource = datasource;
	}

}


4.配置檔案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:context="http://www.springframework.org/schema/context"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context.xsd
          ">
          
    <!-- 讀取配置檔案,後面取值${key}
    properties檔案不能出現user的key -->
    <context:property-placeholder location="classpath:com/briup/db/db.properties"/>
	<!-- <bean class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
		<property name="loaction" value="com/briup/db/db.properties"></property>
	</bean> -->
<!-- 	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="loaction" value="com/briup/db/db.properties"></property>
	</bean> -->
	<!-- jdk提供的資料來源方式 -->
<!-- 		<bean name="dataSource1"
		class="oracle.jdbc.pool.OracleConnectionPoolDataSource">
		<property name="networkProtocol">
			<value>tcp</value>
		</property>
		<property name="databaseName">
			<value>XE</value> 
		</property>
		<property name="driverType">
			<value>thin</value>
		</property>
		<property name="portNumber">
			<value>1521</value>
		</property>
		<property name="user">
			<value>jd1812</value>
		</property>
		<property name="serverName">
			<value>192.168.43.216</value>
		</property>
		<property name="password">
			<value>briup</value>
		</property>
	</bean> -->
	 
	 <!-- DBCP提供的資料來源方式-->
	 <!-- <bean id="dataSource2"
		class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName">
			<value>${driver}</value>
		</property>
		<property name="url">
			<value>${url}</value>
		</property>
		<property name="username">
			<value>${username}</value>
		</property>
		<property name="password">
			<value>${passwd}</value>
		</property>
		<property name="maxActive">
			<value>80</value>
		</property>
		<property name="maxIdle">
			<value>20</value>
		</property>
		<property name="maxWait">
			<value>3000</value>
		</property>
	</bean>  -->
	 <!-- spring提供的一種資料來源 -->
     <bean id="dataSource3"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName">
			<value>${driver}</value>
		</property>
		<property name="url">
			<value>${url}</value>
		</property>
		<property name="username">
			<value>${username}</value>
		</property>
		<property name="password">
			<value>${passwd}</value>
		</property>
      </bean>
      <!-- c3p0資料來源 -->
	<bean id="dataSource4" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close">
		<property name="driverClass">
			<value>${driver}</value>
		</property>
		<property name="jdbcUrl">
			<value>${url}</value>
		</property>
		<property name="user">
			<value>${username}</value>
		</property>
		<property name="password">
			<value>${passwd}</value>
		</property>

		<property name="minPoolSize">
			<value>5</value>
		</property>

		<property name="maxPoolSize">
			<value>30</value>
		</property>

		<property name="initialPoolSize">
			<value>10</value>
		</property>

		<property name="maxIdleTime">
			<value>60</value>
		</property>

		<property name="acquireIncrement">
			<value>5</value>
		</property>

		<property name="idleConnectionTestPeriod">
			<value>60</value>
		</property>
		<property name="acquireRetryAttempts">
			<value>30</value>
		</property>
	</bean> 
	
	
	<bean name="dao" class="com.briup.db.jdbc.HusDaoImpl">
		<property name="datasource" ref="dataSource4"></property>
	</bean>
</beans>




5.db.properties檔案

driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@192.168.43.216:1521:XE
username=jd1812
passwd=briup


※ Spring與mybatis結合


    注意匯入相關jar包:mybatis-spring-1.2.2.jar
    使用Spring整合mybatis時,可以使用mybatis-config.xml檔案,也可以不使用
   
    

<!-- 配置sqlSessionFactory 不使用mybatis-config.xml-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="typeAliasesPackage" value="com.briup.db"></property>
        <property name="configurationProperties">
            <props>
                <prop key="cacheEnabled">true</prop>
            </props>
        </property>
        <!-- 自動掃描mapping.xml檔案 -->
        <property name="mapperLocations" value="classpath:com/briup/db/mybatis/AccountMapper.xml" />
    </bean>    
        
    或者:

    <!-- 配置sqlSessionFactory 使用mybatis-config.xml-->
    <!-- 直接讀取mybatis-config.xml檔案,裡面和之前配置的一樣 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation"  value="classpath:mybatis-config.xml"/>
    </bean>

    
    最後還需要掃描mybatis中對映介面,以便spring為其生產對應的實現類
    <!-- 自動掃描對映介面所在的包 -->
    <!-- 將來可以通過介面的名字首字母小寫作為beanName,從spring容器中拿出自動生成的該介面的實現類 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.briup.db" />
    </bean>
1.實體類,介面同上

2.mybatis不用構建介面實現類
構建配置檔案

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.briup.db.HusDao">
	<update id="updateHus" parameterType="com.briup.db.Hus">
		update hus set name=#{name},age=#{age}
		where id=#{id}
	</update>
</mapper>

3.構建mybatis配置檔案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:context="http://www.springframework.org/schema/context"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context.xsd
          ">
    <!-- 讀取配置檔案,後面取值${key} -->
    <context:property-placeholder location="classpath:com/briup/db/db.properties"/>
	<!-- 獲取資料來源 -->
	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName">
			<value>${driver}</value>
		</property>
		<property name="url">
			<value>${url}</value>
		</property>
		<property name="username">
			<value>${username}</value>
		</property>
		<property name="password">
			<value>${passwd}</value>
		</property>
      </bean>
   <!-- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation"  value="classpath:mybatis-config.xml"/>
    </bean> -->
      <!-- 構建sqlSessionFactory物件 -->
      <!-- 配置sqlSessionFactory -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="typeAliasesPackage" value="com.briup.db"></property>
		<property name="configurationProperties">
			<props>
				<prop key="cacheEnabled">true</prop>
			</props>
		</property>
		<!-- 自動掃描mapping.xml檔案 -->
		<property name="mapperLocations"
			value="classpath:com/briup/db/mybatis/HusDao.xml" />
	</bean>
	<!-- 自動掃描對映介面所在的包 -->
	<!-- 將來可以通過介面的名字首字母小寫作
	為beanName,從spring容器中拿出自動生成的
	該介面的實現類 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.briup.db" />
	</bean>
</beans>


4.測試類:


package com.briup.db.mybatis;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.briup.db.Hus;
import com.briup.db.HusDao;

public class mybatisTest {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext cp=
				new ClassPathXmlApplicationContext(
						"com/briup/db/mybatis/mybatis.xml");
		HusDao dao=(HusDao) cp.getBean("husDao");
		dao.updateHus(new Hus(1, "jake", 100));
	}
}

※ Spring事務管理機制

    1)程式設計式事務管理(不常用)
        所謂程式設計式事務指的是通過編碼方式實現事務。

    2)宣告式事務管理(常用)
    在Spring配置檔案中宣告式的處理事務來代替程式碼式的處理事務.
    在spring中,宣告式事務主要是通過【事務屬性】來定義的,事務屬性描述
    了事務策略如何應用到方法上面
    
    事務屬性主要包含了以下5個方面:(文件的最後有統一的介紹)
        傳播行為 (propagation)
        隔離級別 (isolation)
        回滾規則 (rollback-for no-rollback-for)
        事務超時 (timeout)
        是否只讀 (read-only)


    宣告式事務管理的配置方式通常以下幾種:
        注意:配置事務的方式都需要用到事務管理器(切面)和事務攔截器(advice),其實就是使用aop程式設計,把事務程式碼動態織入到需要使用的方法上
        
        spring中實現aop的配置方式很多,在這裡配置事務的時候推薦使用:
            1.tx字首的事務標籤和aop字首的標籤結合,將切面(事務管理器)織入到切入點上
            2.註解進行事務配置
    
    
    瞭解事務屬性包含的五個方面分別是什麼:

    1)事務傳播行為
    規定了如果有新的事務應該被啟動還是被掛起,或者方法是否需要在事務中執行。

    TransactionDefinition.PROPAGATION_REQUIRED:如果當前存在事務,則加入該事務;如果當前沒有事務,則建立一個新的事務。
    TransactionDefinition.PROPAGATION_REQUIRES_NEW:建立一個新的事務,如果當前存在事務,則把當前事務掛起。
    TransactionDefinition.PROPAGATION_SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續執行。
    TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務方式執行,如果當前存在事務,則把當前事務掛起。
    TransactionDefinition.PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則丟擲異常。
    TransactionDefinition.PROPAGATION_MANDATORY:如果當前存在事務,則加入該事務;如果當前沒有事務,則丟擲異常。
    TransactionDefinition.PROPAGATION_NESTED:如果當前存在事務,則建立一個事務作為當前事務的巢狀事務來執行;如果當前沒有事務,則該取值等價於TransactionDefinition.PROPAGATION_REQUIRED。

    2)事務隔離級別
    事務以及事務所引發的問題

     1.髒讀  主要針對update操作。 一個事務A讀到另一個事務B中
     修改過但是還沒有提交的資料

     2.不可重複讀  主要針對update操作。 一個事務A在第一次讀資料和
     第二次讀資料之間,
     有另一個事務B把這個資料更改並提交了,
     所有就出現了事務A裡面讀一個數據倆次,
     但是讀到的結果是不同的。

     3.幻讀  主要針對的是insert/delete操作。
     事務A第一次用where條件篩選出了10條資料,
     事務A第二次用通樣的where條件篩選出的卻是11條資料,
     因為事務B在事務A的第一次和第二次查詢直接進行了插入操作,
     並且插入的這個資料滿足事務A的where篩選條件.

    定義了一個事務可能受其他併發事務影響的程度。
    隔離級別是指若干個併發的事務之間的隔離程度。

    TransactionDefinition 介面中定義了五個表示隔離級別的常量:

    TransactionDefinition.ISOLATION_DEFAULT:這是預設值,表示使用底層資料庫的預設隔離級別。對大部分資料庫而言,
    通常這值就是TransactionDefinition.ISOLATION_READ_COMMITTED。

    TransactionDefinition.ISOLATION_READ_UNCOMMITTED:該隔離級別表示一個事務可以讀取另一個事務修改但還沒有提交的資料。
    該級別不能防止髒讀和不可重複讀,因此很少使用該隔離級別。不提交也能讀
    TransactionDefinition.ISOLATION_READ_COMMITTED:該隔離級別表示一個事務只能讀取另一個事務已經提交的資料。
    該級別可以防止髒讀,這也是大多數情況下的推薦值。 提交之後才能讀 解決了髒讀
    TransactionDefinition.ISOLATION_REPEATABLE_READ:該隔離級別表示一個事務在整個過程中可以多次重複執行某個查詢,
    並且每次返回的記錄都相同。即使在多次查詢之間有新增的資料滿足該查詢,這些新增的記錄也會被忽略。該級別可以防止髒讀和不可重複讀。
     解決了髒讀和不可重複讀
    TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,
    也就是說,該級別可以防止髒讀、不可重複讀以及幻讀。但是這將嚴重影響程式的效能。通常情況下也不會用到該級別。
    三個問題都解決了

    注意:不同的資料庫所能支援的事務隔離級別以及預設的事務隔離級別有可能是不同的

    3)事務的只讀屬性
    定義了一個事務中是否是隻讀操作,如果設定只讀那麼資料庫內部就可以對該操作進行合適的優化措施,
    只有傳播行為是PROPAGATION_REQUIRED PROPAGATION_REQUIRES_NEW PROPAGATION_NESTED的時候只讀設定才有意義
    ,因為只讀優化是在事務開始的時候由資料庫實施的,而在這三個傳播行為下才有可能啟動一個新事務

    4)事務超時
    為了使應用程式可以很好的執行,事務不能執行太長的時間,所以這個屬性就控制著這個時間.只有傳播行
    為是PROPAGATION_REQUIRED PROPAGATION_REQUIRES_NEW PROPAGATION_NESTED的時候超時設定才有意義,
    因為超時時鐘會在事務開始的時候啟動,而在這三個傳播行為下才有可能啟動一個新事務.注意事務超時後會自動回滾.(單位是 秒)

    5)事務的回滾規則
    定義了哪些異常會導致事務回滾而哪些不會。預設情況下,事務在遇到執行時異常的時候才會回滾,而遇到檢查時異常時不會回滾
    -Exception表示有Exception丟擲時,事務回滾. -代表回滾+就代表提交

事務處理方式一:AOP標籤庫

1.定義介面(介面-dao層-service層)(以jdbc連線為模板)

package com.briup.tran;

import com.briup.db.Hus;

public interface HusDao1 {
	void saveHus(Hus hus);
}


2.1.dao層實現類

package com.briup.tran.dao.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.springframework.jdbc.CannotGetJdbcConnectionException;
import org.springframework.jdbc.datasource.DataSourceUtils;

import com.briup.db.Hus;
import com.briup.tran.HusDao1;

public class jdbcHusDaoImpl implements HusDao1{
	private DataSource datasource;
	@Override
	public void saveHus(Hus hus) {
			/*把dataSource注入dao層來直接使用,則需要注意下面幾個點
			一定不要這樣拿conn 因為我們要保證service開始事務
			和提交事務用的conn和dao層用到的conn是同一個物件
			Connection conn = datasource.getConnection();
			一定要這樣去拿conn,因為DataSourceUtils是spring提供的工具類
			Connection conn = DataSourceUtils.getConnection(datasource);
		*/
		Connection conn =null;
		PreparedStatement ps=null;
		try {
			conn= DataSourceUtils.getConnection(datasource);
			String sql="insert into hus values(?,?,?)";
			ps=conn.prepareStatement(sql);
			ps.setLong(1, hus.getId());
			ps.setString(2, hus.getName());
			ps.setInt(3, hus.getAge());
			ps.execute();
		} catch (CannotGetJdbcConnectionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public DataSource getDatasource() {
		return datasource;
	}
	public void setDatasource(DataSource datasource) {
		this.datasource = datasource;
	}

}



2.2.配置檔案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:context="http://www.springframework.org/schema/context"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context.xsd
          ">
        <context:property-placeholder location="classpath:com/briup/db/db.properties"/>
        <!-- 資料來源的配置 -->
        <bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName">
			<value>${driver}</value>
		</property>
		<property name="url">
			<value>${url}</value>
		</property>
		<property name="username">
			<value>${username}</value>
		</property>
		<property name="password">
			<value>${passwd}</value>
		</property>
      </bean>
      <bean name="dao" class="com.briup.tran.dao.jdbc.jdbcHusDaoImpl">
      	<property name="datasource" ref="dataSource"></property>
      </bean>
 </beans>

3.1.service層方法介面

package com.briup.tran.service;

import com.briup.db.Hus;

public interface HusService {
	void saveHus(Hus hus) ;
}

3.2.實現類

package com.briup.tran.service;

import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.briup.db.Hus;
import com.briup.tran.HusDao1;
//@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Throwable.class)
public class HusServiceImpl 
		implements HusService{
	private HusDao1 dao;
	
	@Override
	public void saveHus(Hus hus) {
		// TODO Auto-generated method stub
		dao.saveHus(hus);
	}
	public HusDao1 getDao() {
		return dao;
	}
	public void setDao(HusDao1 dao) {
		this.dao = dao;
	}

}


3.3配置service層物件與事務管理器

<?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:context="http://www.springframework.org/schema/context"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:aop="http://www.springframework.org/schema/aop"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context.xsd
          http://www.springframework.org/schema/tx
          http://www.springframework.org/schema/tx/spring-tx.xsd
          http://www.springframework.org/schema/aop
          http://www.springframework.org/schema/aop/spring-aop.xsd
          ">
          <!-- 配置service層物件 目標物件-->
          <bean name="service" 
          class="com.briup.tran.service.HusServiceImpl">
          <!-- 注入dao層物件 -->
          	<property name="dao" ref="dao"></property>
          </bean>
          
          <!-- 配置jdbc的事務管理器 (切面類)-->
		<bean name="transactionManager"
		 class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
			<!-- 注入資料來源 -->
			<property name="dataSource" ref="dataSource"></property>
		</bean>
		<!-- 配置事務攔截器(通知advice,負責把切面程式碼織入到切入點執行之前、之後、拋異常) -->
		<tx:advice id="transactionInterceptor" transaction-manager="transactionManager">
			<!-- 配置事務的屬性 -->
			<tx:attributes>
			<!-- *代表切入點中的所有的方法 -->
				<tx:method name="*" propagation="REQUIRED" rollback-for="Throwable"/>
				<!-- <tx:method name="save*" propagation="REQUIRED" rollback-for="Throwable"/> -->
				<!-- <tx:method name="select*" propagation="REQUIRED" read-only="true"/> -->
			</tx:attributes>
		</tx:advice>
		
		<!-- 配置aop -->
	<aop:config>
		<!-- 配置切入點 -->
		<aop:pointcut expression="execution(* com.briup.tran.service.*.*(..))" id="myPointCut"/>
		<!-- 配置事務攔截器在哪一個切入點上起作用 -->
		<aop:advisor advice-ref="transactionInterceptor" pointcut-ref="myPointCut"/>
	</aop:config>
</beans>          


3.3.包含註釋版(anno)

<?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:context="http://www.springframework.org/schema/context"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:aop="http://www.springframework.org/schema/aop"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context.xsd
          http://www.springframework.org/schema/tx
          http://www.springframework.org/schema/tx/spring-tx.xsd
          http://www.springframework.org/schema/aop
          http://www.springframework.org/schema/aop/spring-aop.xsd
          ">
          <!-- 配置service層物件 目標物件-->
          <bean name="service" 
          class="com.briup.tran.service.HusServiceImpl">
          <!-- 注入dao層物件 -->
          	<property name="dao" ref="dao"></property>
          </bean>
          
          <!-- 配置jdbc的事務管理器 (切面類)-->
		<bean name="transactionManager"
		 class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
			<!-- 注入資料來源 -->
			<property name="dataSource" ref="dataSource"></property>
		</bean>
			<!-- 通知spring我們在目標物件中做了事務的註解,並指明使用哪一個事務管理器 -->
			<!-- 加入上這個標籤後 去目標物件去加入相應的註解就可以了 -->
		<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>          


4.測試類

package com.briup.tran.Test.jdbc;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.briup.db.Hus;
import com.briup.tran.service.HusService;

public class jdbcTest {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext cp=
				new ClassPathXmlApplicationContext(
						"com/briup/tran/dao/jdbc/jdbc.xml",
						"com/briup/tran/service/jdbc/jdbc_service.xml");
		HusService service=(HusService) cp.getBean("service");
		service.saveHus(new Hus(3, "wangwu", 44));
	}
}

4.包含註釋版(anno)

package com.briup.tran.Test.jdbc;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.briup.db.Hus;
import com.briup.tran.service.HusService;

public class jdbcTest_anno {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext cp=
				new ClassPathXmlApplicationContext(
						"com/briup/tran/dao/jdbc/jdbc.xml",
						"com/briup/tran/service/jdbc/jdbc_service_anno.xml");
		HusService service=(HusService) cp.getBean("service");
		service.saveHus(new Hus(4, "wangwu", 44));
	}
}
Mybaties事務處理:

1.介面

package com.briup.tran;

import com.briup.db.Hus;

public interface HusDao1 {
	void saveHus(Hus hus);
}

2.1.dao層 husDao.xml
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.briup.tran.HusDao1">
	<insert id="saveHus" parameterType="com.briup.db.Hus">
		insert into hus values(#{id},#{name},#{age})
	</insert>
</mapper>

2.2.配置mybatis

<?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:context="http://www.springframework.org/schema/context"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context.xsd
          ">
    <!-- 讀取配置檔案,後面取值${key} -->
    <context:property-placeholder location="classpath:com/briup/db/db.properties"/>
	<!-- 獲取資料來源 -->
	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName">
			<value>${driver}</value>
		</property>
		<property name="url">
			<value>${url}</value>
		</property>
		<property name="username">
			<value>${username}</value>
		</property>
		<property name="password">
			<value>${passwd}</value>
		</property>
      </bean>
      <!-- 構建sqlSessionFactory物件 -->
      <!-- 配置sqlSessionFactory -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="typeAliasesPackage" value="com.briup.db.Hus"></property>
		<property name="configurationProperties">
			<props>
				<prop key="cacheEnabled">true</prop>
			</props>
		</property>
		<!-- 自動掃描mapping.xml檔案 -->
		<property name="mapperLocations"
			value="classpath:com/briup/tran/dao/mybatis/HusDao.xml" />
	</bean>
	<!-- 自動掃描對映介面所在的包 -->
	<!-- 將來可以通過介面的名字首字母小寫作
	為beanName,從spring容器中拿出自動生成的
	該介面的實現類 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.briup.tran" />
	</bean>
</beans>

3.1.
package com.briup.tran.service;

import com.briup.db.Hus;

public interface HusService {
	void saveHus(Hus hus) ;
}


package com.briup.tran.service;

import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.briup.db.Hus;
import com.briup.tran.HusDao1;
//@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Throwable.class)
public class HusServiceImpl 
		implements HusService{
	private HusDao1 dao;
	
	@Override
	public void saveHus(Hus hus) {
		// TODO Auto-generated method stub
		dao.saveHus(hus);
	}
	public HusDao1 getDao() {
		return dao;
	}
	public void setDao(HusDao1 dao) {
		this.dao = dao;
	}

}

不加註釋

<?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:context="http://www.springframework.org/schema/context"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:aop="http://www.springframework.org/schema/aop"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context.xsd
          http://www.springframework.org/schema/tx
          http://www.springframework.org/schema/tx/spring-tx.xsd
          http://www.springframework.org/schema/aop
          http://www.springframework.org/schema/aop/spring-aop.xsd
          ">
          <!-- 配置service層物件 目標物件-->
          <bean name="service" 
          class="com.briup.tran.service.HusServiceImpl">
          <!-- 注入dao層物件 -->
          	<property name="dao" ref="husDao1"></property>
          </bean>
          
          <!-- 配置jdbc的事務管理器 (切面類)-->
		<bean name="transactionManager"
		 class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
			<!-- 注入資料來源 -->
			<property name="dataSource" ref="dataSource"></property>
		</bean>
		<!-- 配置事務攔截器(通知advice,負責把切面程式碼織入到切入點執行之前、之後、拋異常) -->
		<tx:advice id="transactionInterceptor" transaction-manager="transactionManager">
			<!-- 配置事務的屬性 -->
			<tx:attributes>
			<!-- *代表切入點中的所有的方法 -->
				<tx:method name="*" propagation="REQUIRED" rollback-for="Throwable"/>
				<!-- <tx:method name="save*" propagation="REQUIRED" rollback-for="Throwable"/> -->
				<!-- <tx:method name="select*" propagation="REQUIRED" read-only="true"/> -->
			</tx:attributes>
		</tx:advice>
		
		<!-- 配置aop -->
	<aop:config>
		<!-- 配置切入點 -->
		<aop:pointcut expression="execution(* com.briup.tran.service.*.*(..))" id="myPointCut"/>
		<!-- 配置事務攔截器在哪一個切入點上起作用 -->
		<aop:advisor advice-ref="transactionInterceptor" pointcut-ref="myPointCut"/>
	</aop:config>
</beans>          


註釋版

<?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:context="http://www.springframework.org/schema/context"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:aop="http://www.springframework.org/schema/aop"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context.xsd
          http://www.springframework.org/schema/tx
          http://www.springframework.org/schema/tx/spring-tx.xsd
          http://www.springframework.org/schema/aop
          http://www.springframework.org/schema/aop/spring-aop.xsd
          ">
          <!-- 配置service層物件 目標物件-->
          <bean name="service" 
          class="com.briup.tran.service.HusServiceImpl">
          <!-- 注入dao層物件 -->
          	<property name="dao" ref="husDao1"></property>
          </bean>
          
          <!-- 配置jdbc的事務管理器 (切面類)-->
		<bean name="transactionManager"
		 class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
			<!-- 注入資料來源 -->
			<property name="dataSource" ref="dataSource"></property>
		</bean>
		<!-- 通知spring我們在目標物件中做了事務的註解,並指明使用哪一個事務管理器 -->
			<!-- 加入上這個標籤後 去目標物件去加入相應的註解就可以了 -->
		<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>          

4.測試類

package com.briup.tran.Test.mybatis;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.briup.db.Hus;
import com.briup.tran.service.HusService;

public class mybatisTest {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext cp=
				new ClassPathXmlApplicationContext(
						"com/briup/tran/dao/mybatis/mybatis.xml",
						"com/briup/tran/service/mybatis/mybatis_service.xml");
		HusService service=(HusService) cp.getBean("service");
		service.saveHus(new Hus(5, "wangwu", 44));
	}
}


註釋版

package com.briup.tran.Test.mybatis;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.briup.db.Hus;
import com.briup.tran.service.HusService;

public class mybatisTest_anno {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext cp=
				new ClassPathXmlApplicationContext(
						"com/briup/tran/dao/mybatis/mybatis.xml",
						"com/briup/tran/service/mybatis/mybatis_service_anno.xml");
		HusService service=(HusService) cp.getBean("service");
		service.saveHus(new Hus(6, "wangwu", 44));
	}
}