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

相关文章
相关标签/搜索