spring第三天SSH整合笔记

早过忘川 提交于 2019-11-29 14:15:53

* spring事务管理

* Spring事务管理高层抽象主要包括3个接口

1)PlatformTransactionManager 事务管理器 ,用于管理事务

2)TransactionDefinition 事务定义信息(隔离、传播、超时、只读)---静态信息

3)TransactionStatus 事务具体运行状态 ----动态信息


* Spring为不同的持久化框架提供了不同的PlatformTransactionManager接口实现

1)org.springframework.jdbc.datasource.DataSourceTransactionManager 使用Spring JDBC或MyBatis 进行持久化数据时使用

2)org.springframework.orm.hibernate3.HibernateTransactionManager 使用Hibernate3.0版本进行持久化数据时使用


* 事务隔离级别(四种)

DEFAULT 使用后端数据库默认的隔离级别(spring中的的选择项)

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类上加入注解


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!