* spring事務管理java
* Spring事務管理高層抽象主要包括3個接口web
1)PlatformTransactionManager 事務管理器 ,用於管理事務spring
2)TransactionDefinition 事務定義信息(隔離、傳播、超時、只讀)---靜態信息sql
3)TransactionStatus 事務具體運行狀態 ----動態信息數據庫
* Spring爲不一樣的持久化框架提供了不一樣的PlatformTransactionManager接口實現express
1)org.springframework.jdbc.datasource.DataSourceTransactionManager 使用Spring JDBC或MyBatis 進行持久化數據時使用apache
2)org.springframework.orm.hibernate3.HibernateTransactionManager 使用Hibernate3.0版本進行持久化數據時使用編程
* 事務隔離級別(四種)後端
DEFAULT 使用後端數據庫默認的隔離級別(spring中的的選擇項)session
READ_UNCOMMITED 容許你讀取還未提交的改變了的數據。可能致使髒、幻、不可重複讀
READ_COMMITTED 容許在併發事務已經提交後讀取。可防止髒讀,但幻讀和 不可重複讀仍可發生
REPEATABLE_READ 對相同字段的屢次讀取是一致的,除非數據被事務自己改變。可防止髒、不可重複讀,但幻讀仍可能發生。
SERIALIZABLE 徹底服從ACID的隔離級別,確保不發生髒、幻、不可重複讀。這在全部的隔離級別中是最慢的,它是典型的經過徹底鎖定在事務中涉及的數據表來完成的。
*事務傳播行爲(七種)
PROPAGATION_REQUIRED 支持當前事務,若是不存在 就新建一個
PROPAGATION_SUPPORTS 支持當前事務,若是不存在,就不使用事務
PROPAGATION_MANDATORY 支持當前事務,若是不存在,拋出異常
PROPAGATION_REQUIRES_NEW 若是有事務存在,掛起當前事務,建立一個新的事務
PROPAGATION_NOT_SUPPORTED 以非事務方式運行,若是有事務存在,掛起當前事務
PROPAGATION_NEVER 以非事務方式運行,若是有事務存在,拋出異常
PROPAGATION_NESTED 若是當前事務存在,則嵌套事務執行
* Spring 支持兩種方式事務管理
1)編程式的事務管理(瞭解)
2)聲明式事務管理
* xml方式
1.導入jar包(beans,core ,context,expression,spring-aop.jar,spring-aspect.jar,weaver.jar,aop聯盟)
2.建立Dao和Service
3.在beans.xml中配置事務管理器
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="datsSource"/>
</bean>
4.配置事務通知
<tx:advice id="myAdvice" transaction-manager="txManager">
<!-- 事務屬性 -->
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="t*" propagation="REQUIRED"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
5.配置aop切面
<aop:config>
<!-- 切點 -->
<aop:pointcut expression="execution(* com.uujava.tx.auto.xml.*Service.*(..))" id="myPC"/>
<!-- 切面 = 通知 + 切點 -->
<aop:advisor advice-ref="myAdvice" pointcut-ref="myPC"/>
</aop:config>
6.從spring工廠中獲取Service的一個代理對象
ApplicationContext ctx = new ClassPathXmlApplicationContext("com/uujava/tx/auto/xml/beans.xml");
AccountService accountService = (AccountService) ctx.getBean("accountService");//獲取的爲代理對象
accountService.transfer("李四", "張三", 100d);
System.out.println(accountService.getClass().getSimpleName());
* annotation方式
1.導入jar包(beans,core ,context,expression,spring-aop.jar,spring-aspect.jar,weaver.jar,aop聯盟)
2.建立Dao和Service
3.在beans.xml中配置事務管理器
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="datsSource"/>
</bean>
4.在beans.xml中配置註解驅動
<tx:annotation-driven transaction-manager="txManager"/>
5.在Service類上加入@Transactional註解
@Transactional
public class AccountService implements IAccountService {
...
}
6.從spring工廠中獲取Service的一個代理對象
ApplicationContext ctx = new ClassPathXmlApplicationContext("com/uujava/tx/auto/annotation/beans.xml");
AccountService accountService = (AccountService) ctx.getBean("accountService");//獲取的爲代理對象
accountService.transfer("李四", "張三", 100d);
System.out.println(accountService.getClass().getSimpleName());
* struts2 + spring3.2
1)建立一個web項目
2)導入jar(struts2,spring)
3)在web.xml中配置struts2的過濾器
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4)在類路徑下提供struts.xml
5)在類路徑下提供beans.xml
6)在web.xml中配置監聽器:ContextLoaderListner
7)建立一個Action類
8)在struts.xml中指定Action由spring建立
<constant name="struts.objectFactory" value="spring"></constant>
9)配置Action ,beans.xml
<bean id="userAction" class="com.uujava.action.UserAction"></bean>
10)struts.xml
<action name="userAction_*" class="userAction" method="{1}">
<result name="success">/index.jsp</result>
</action>
* 加入hibernate
1)導入hibernatejar
2)在類路徑下提供hibernate.cfg.xml
3)建立一個數據庫
create database s2sh default character set utf8;
4)建立實體類和hbm映射文件
5)在beans.xml中配置本地會話工廠bean(LocalSessionFactoryBean),用於整合hibernate和spring
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 經過setter方法注入hibernate核心配置文件 -->
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
</bean>
6)建立Dao,Service
7)配置事務管理器,通知,切面
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 事務通知 -->
<tx:advice id="s2shAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- AOP切面 -->
<aop:config>
<aop:pointcut expression="execution(* com.uujava.service.*.*(..))" id="s2shPC"/>
<aop:advisor advice-ref="s2shAdvice" pointcut-ref="s2shPC"/>
</aop:config>
* 去掉hibernate核心配置文件
<!-- 數據源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${driverClass}"></property>
<property name="jdbcUrl" value="${jdbcUrl}"></property>
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property>
<property name="initialPoolSize" value="${initialPoolSize}"></property>
<property name="maxPoolSize" value="${maxPoolSize}"></property>
<property name="minPoolSize" value="${minPoolSize}"></property>
</bean>
<!-- 配置本地會話工廠bean -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 注入hibernate屬性 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<!-- 註冊hbm映射文件 -->
<property name="mappingDirectoryLocations">
<list>
<value>classpath:com/uujava/domain</value>
</list>
</property>
</bean>
* HibernateTemplte經常使用API
Serializable save(Object entity)
void update(Object entity)
void delete(Object entity)
<T> T get(Class<T> entityClass, Serializable id)
<T> T load(Class<T> entityClass, Serializable id)
List find(String queryString, Object... values)
List findByCriteria(DetachedCriteria criteria)
List findByNamedQuery(String queryName, Object... values)
* 使用註解整合SSH
1)建立web項目
2)導入jar
3)配置web.xml(struts2的過濾器,spring的監聽器,OpenSessionInViewFilter)
4)配置beans.xml(數據源,本地會話工廠bean,事務管理器,組件掃描,支持註解,事務的註解驅動)
5)在Dao,Service,Action類上加入註解