spring第三天SSH整合筆記

* 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類上加入註解

相關文章
相關標籤/搜索