Spring-3

主要学习内容:

  Spring的事务管理

  三大框架整合

上次内容回顾 Spring-1Spring-2:

Spring的AOP开发:

* AOP:面向切面编程,是对OO思想延伸.

* AOP底层实现原理:动态代理.

* JDK动态代理:针对实现了接口的类生产代理.

* CGLIB代理:针对没有实现接口的类,产生一个子类.

* AOP术语:

* JoinPoint:可以被拦截点.

* Ponitcut:真正被拦截.

* Advice:通知,增强的代码.

* 引介:特殊通知,类级别上添加属性或方法.

* Target:目标对象.

* Proxy:代理对象.

* Weaving:

* Aspect:

* Spring的AOP的开发:

* 配置applicationContext.xml生成代理对象.

* 使用ProxyFactoryBean类生产代理:

* 根据目标对象是否实现了接口,选择使用JDK还是CGLIB.

* 缺点:需要为每个类都去配置一个ProxyFactoryBean.

* 采用Spring自动代理:

* 基于类名称的自动代理:(采用后处理Bean)

* 基于切面信息的自动代理:(采用后处理Bean)

* Spring的AspectJ的切面开发.

* AspectJ:本身第三方切面框架.

* AspectJ基于注解开发:

* 定义切面:

@Aspect

* 定义增强:

@Before:前置通知.

@AfterReturing:后置通知.

@Around:环绕通知.

@AfterThrowing:异常抛出通知.

@After:最终通知.

* 定义切点:

@Pointcut

* AspectJ基于XML开发:

* 引入aop名称空间.

<aop:config>

<aop:pointcut expression=”” id=””/>

<aop:aspect ref=””>

<aop:before...>

</aop:aspect>

</aop:config>

Spring的JDBCTemplate:

* 配置连接池:

* 默认

* DBCP

* C3P0(*****)

* 引入外部属性文件.

* 在DAO中注入JdbcTemplate.

* 在DAO中不直接注入模板.Dao集成JdbcDaoSupport.

* CRUD的操作.


1.1   Spring的事务管理:

1.1.1   事务:

事务:是逻辑上一组操作,要么全都成功,要么全都失败.

事务特性:

ACID:

原子性:事务不可分割

一致性:事务执行的前后,数据完整性保持一致.

隔离性:一个事务执行的时候,不应该受到其他事务的打扰

持久性:一旦结束,数据就永久的保存到数据库.

如果不考虑隔离性:

脏读:一个事务读到另一个事务未提交数据

不可重复读:一个事务读到另一个事务已经提交数据(update)导致一个事务多次查询结果不一致

虚读:一个事务读到另一个事务已经提交数据(insert)导致一个事务多次查询结果不一致

事务的隔离级别:

未提交读:以上情况都有可能发生。

已提交读:避免脏读,但不可重复读,虚读是有可能发生。

可重复读:避免脏读,不可重复读,但是虚读有可能发生。

串行的:避免以上所有情况.

1.1.2   Spring中事务管理:

分层开发:事务处在Service层.

Spring提供事务管理API:

PlatformTransactionManager:平台事务管理器.

commit(TransactionStatus status)

getTransaction(TransactionDefinition definition)

rollback(TransactionStatus status)

TransactionDefinition:事务定义

ISOLation_XXX:事务隔离级别.

PROPAGATION_XXX:事务的传播行为.(不是JDBC中有的,为了解决实际开发问题.)

过期时间:

TransactionStatus:事务状态

是否有保存点

是否一个新的事务

事务是否已经提交

关系:PlatformTransactionManager通过TransactionDefinition设置事务相关信息管理事务,管理事务过程中,产生一些事务状态:状态由TransactionStatus记录.

API详解:

PlatformTransactionManager:接口.

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

org.springframework.jdbc.datasource.DataSourceTransactionManager   :    使用SpringJDBCiBatis 进行持久化数据时使用

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

org.springframework.orm.jpa.JpaTransactionManager  使用JPA进行持久化时使用

org.springframework.jdo.JdoTransactionManager  当持久化机制是Jdo时使用

org.springframework.transaction.jta.JtaTransactionManager  使用一个JTA实现来管理事务,在一个事务跨越多个资源时必须使用

TransactionDefinition:

* ISOLATION_DEFAULT:默认级别. Mysql  repeatable_read        oracle read_commited

ISOLATION_READ_UNCOMMITTED

ISOLATION_READ_COMMITTED

ISOLATION_REPEATABLE_READ

ISOLATION_SERIALIZABLE

* 事务的传播行为:(不是JDBC事务管理,用来解决实际开发的问题.)传播行为:解决业务层之间的调用的事务的关系.

PROPAGATION_REQUIRED     :支持当前事务,如果不存在就新建一个

* A,B   如果A有事务,B使用A的事务,如果A没有事务,B就开启一个新的事务.(A,B是在一个事务中。)

PROPAGATION_SUPPORTS     :支持当前事务,如果不存在,就不使用事务

* A,B   如果A有事务,B使用A的事务,如果A没有事务,B就不使用事务.

PROPAGATION_MANDATORY   :支持当前事务,如果不存在,抛出异常

* A,B   如果A有事务,B使用A的事务,如果A没有事务,抛出异常.

PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务

* A,B   如果A有事务,B将A的事务挂起,重新创建一个新的事务.(A,B不在一个事务中.事务互不影响.)

PROPAGATION_NOT_SUPPORTED   以非事务方式运行,如果有事务存在,挂起当前事务

* A,B   非事务的方式运行,A有事务,就会挂起当前的事务.

PROPAGATION_NEVER   以非事务方式运行,如果有事务存在,抛出异常

PROPAGATION_NESTED  如果当前事务存在,则嵌套事务执行

* 基于SavePoint技术.

* A,B   A有事务,A执行之后,将A事务执行之后的内容保存到SavePoint.B事务有异常的话,用户需要自己设置事务提交还是回滚.

* 常用:(重点)

PROPAGATION_REQUIRED

PROPAGATION_REQUIRES_NEW

PROPAGATION_NESTED


1.1.3   Spring的事务管理:

Spring的事务管理分成两类:

* 编程式事务管理:

* 手动编写代码完成事务管理.

* 声明式事务管理:

* 不需要手动编写代码,配置.


1.1.4   事务操作的环境搭建:

CREATE TABLE `account`(

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(20) NOT NULL,

  `money` double DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDBAUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

INSERT INTO `account`VALUES ('1', 'aaa', '1000');

INSERT INTO `account`VALUES ('2', 'bbb', '1000');

INSERT INTO `account`VALUES ('3', 'ccc', '1000');

创建一个web项目:

* 导入相应jar包

* 引入配置文件:

* applicationContext.xml、log4j.properties、jdbc.properties

创建类:

* AccountService

* AccountDao

在Spring中注册:

<!-- 业务层类 -->

<beanid="accountService" class="cn.itcast.spring3.demo1.AccountServiceImpl">

    <!-- 在业务层注入Dao -->

    <property name="accountDao"ref="accountDao"/>

</bean>

<!-- 持久层类 -->

<beanid="accountDao"class="cn.itcast.spring3.demo1.AccountDaoImpl">

    <!-- 注入连接池的对象,通过连接池对象创建模板.-->

    <propertyname="dataSource" ref="dataSource"/>

</bean>

编写一个测试类:


1.1.5   Spring的事务管理:

手动编码的方式完成事务管理:

需要事务管理器:真正管理事务对象.

* Spring提供了事务管理的模板(工具类.)

 

第一步:注册事务管理器:

<!-- 配置事务管理器 -->

<beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <!-- 需要注入连接池,通过连接池获得连接 -->

    <property name="dataSource"ref="dataSource"/>

</bean>

第二步:注册事务模板类:

<!-- 事务管理的模板 -->

<beanid="transactionTemplate"class="org.springframework.transaction.support.TransactionTemplate">

    <property name="transactionManager" ref="transactionManager"/>

</bean>

第三步:在业务层注入模板类:(模板类管理事务)

<!-- 业务层类 -->

<beanid="accountService"class="cn.itcast.spring3.demo1.AccountServiceImpl">

    <!-- 在业务层注入Dao -->

    <property name="accountDao"ref="accountDao"/>

    <!-- 在业务层注入事务的管理模板 -->

    <property name="transactionTemplate"ref="transactionTemplate"/>

</bean>

第四步:在业务层代码上使用模板:

public void transfer(finalString from, final String to, final Double money) {

    transactionTemplate.execute(newTransactionCallbackWithoutResult() {

        @Override

        protectedvoid doInTransactionWithoutResult(TransactionStatus status) {

            accountDao.out(from,money);

            int d = 1 / 0;

            accountDao.in(to, money);

        }

    });

}

手动编码方式缺点:

* 代码量增加,代码有侵入性.


声明式事务管理:(原始方式)

基于TransactionProxyFactoryBean.

导入:aop相应jar包.

第一步:注册平台事务管理器:

<!-- 事务管理器 -->

<beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <!-- 注入连接池 -->

    <property name="dataSource"ref="dataSource"/>

</bean>

第二步:创建业务层代理对象:

<!-- 配置生成代理对象 -->

<bean id="accountServiceProxy"class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

    <!-- 目标对象-->

    <property name="target"ref="accountService"/>

    <!-- 注入事务管理器-->

    <propertyname="transactionManager" ref="transactionManager"/>

    <!-- 事务的属性设置-->

    <propertyname="transactionAttributes">

        <props>

            <propkey="transfer">PROPAGATION_REQUIRED</prop>

        </props>

    </property>

</bean>

第三步:编写测试类:

***** 千万注意:注入代理对象

@Autowired

@Qualifier("accountServiceProxy")

private AccountService accountService;

prop格式:PROPAGATION,ISOLATION,readOnly,-Exception,+Exception

* 顺序:传播行为、隔离级别、事务是否只读、发生哪些异常可以回滚事务(所有的异常都回滚)、发生了哪些异常不回滚.

 

*****缺点:就是需要为每一个管理事务的类生成代理.需要为每个类都需要进行配置.

声明式事务管理:(自动代理.基于切面 ******)

第一步:导入相应jar.

* aspectj

 

第二步:引入相应约束:

* aoptx约束.

<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:aop="http://www.springframework.org/schema/aop"

xmlns:tx="http://www.springframework.org/schema/tx"

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/aop

http://www.springframework.org/schema/aop/spring-aop.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx.xsd">

 

第三步:注册事务管理器;

<!-- 事务管理器 -->

<beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <property name="dataSource"ref="dataSource"/>

</bean>

第四步:定义增强(事务管理)

<!-- 定义一个增强 -->

<tx:advice id="txAdvice"transaction-manager="transactionManager">

    <!-- 增强(事务)的属性的配置 -->

    <tx:attributes>

        <!--

            isolation:DEFAULT  :事务的隔离级别.

            propagation         :事务的传播行为.

            read-only           :false.不是只读

            timeout             :-1

            no-rollback-for     :发生哪些异常不回滚

            rollback-for        :发生哪些异常回滚事务

         -->

        <tx:methodname="transfer"/>

    </tx:attributes>

</tx:advice>

 

第五步:定义aop的配置(切点和通知的组合)

<!-- aop配置定义切面和切点的信息 -->

<aop:config>

    <!-- 定义切点:哪些类的哪些方法应用增强 -->

    <aop:pointcut expression="execution(*cn.itcast.spring3.demo3.AccountService+.*(..))" id="mypointcut"/>

    <!-- 定义切面:-->

    <aop:advisor advice-ref="txAdvice"pointcut-ref="mypointcut"/>

</aop:config>

第六步:编写测试类:

* 注入Service对象,不需要注入代理对象(生成这个类的时候,已经是代理对象.)

基于注解的事务管理:

第一步:事务管理器:

<!-- 事务管理器 -->

<bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <propertyname="dataSource" ref="dataSource"/>

</bean>

第二步:注解事务:

<!-- 开启注解的事务管理 -->

<tx:annotation-driventransaction-manager="transactionManager"/>

第三步:在Service上使用注解

@Transactional

* 注解中有属性值:

* isolation

* propagation

* readOnly

...

1.2   SSH框架整合:

1.2.1   Struts2+Spring+Hibernate导包

Struts2导入jar包:

* struts2/apps/struts2-blank.war/WEB-INF/lib/*.jar

* 导入与spring整合的jar

* struts2/lib/struts2-spring-plugin-2.3.15.3.jar       --- 整合Spring框架

* struts2/lib/struts2-json-plugin-2.3.15.3.jar         --- 整合AJAX

*struts2/lib/struts2-convention-plugin-2.3.15.3.jar   --- 使用Struts2注解开发.

 

* 配置

web.xml

<filter>

  <filter-name>struts2</filter-name>

 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

</filter>

<filter-mapping>

  <filter-name>struts2</filter-name>

  <url-pattern>/*</url-pattern>

</filter-mapping>

struts.xml

<struts>

    <constantname="struts.devMode" value="true" />

    <packagename="default" namespace="/"extends="struts-default">

   

    </package>

</struts>

 

 

Spring导入jar:

Spring3.2 开发最基本jar

spring-beans-3.2.0.RELEASE.jar

spring-context-3.2.0.RELEASE.jar

spring-core-3.2.0.RELEASE.jar

spring-expression-3.2.0.RELEASE.jar

com.springsource.org.apache.commons.logging-1.1.1.jar

com.springsource.org.apache.log4j-1.2.15.jar

AOP开发

spring-aop-3.2.0.RELEASE.jar

spring-aspects-3.2.0.RELEASE.jar

com.springsource.org.aopalliance-1.0.0.jar

com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

Spring Jdbc开发

spring-jdbc-3.2.0.RELEASE.jar

spring-tx-3.2.0.RELEASE.jar

Spring事务管理

spring-tx-3.2.0.RELEASE.jar

Spring整合其他ORM框架

spring-orm-3.2.0.RELEASE.jar

Spring在web中使用

spring-web-3.2.0.RELEASE.jar

Spring整合Junit测试

spring-test-3.2.0.RELEASE.jar

(Spring没有引入c3p0和数据库驱动)

* 配置:

applicationContext.xml

Log4j.properties

在web.xml中配置监听器;

<!-- 配置Spring的监听器 -->

<listener>

<!-- 监听器默认加载的是WEB-INF/applicationContext.xml-->

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<!-- 指定Spring框架的配置文件所在的位置 -->

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:applicationContext.xml</param-value>

</context-param>

Hibernate的jar包导入:

* 核心包:hibernate3.jar

* lib/required/*.jar

* lib/jpa/*.jar

* 引入hibernate整合日志系统的jar包:

* 数据连接池:

* 数据库驱动:

* 二级缓存:(可选的.)

* backport-util-concurrent.jar

* commons-logging.jar

* ehcache-1.5.0.jar

* Hibernate的配置:

* hibernate.cfg.xml

* 映射:

* 格式:类名.hbm.xml


1.2.2   Struts2和Spring的整合:

1.新建包结构:

* cn.itcast.action

* cn.itcast.service

* cn.itcast.dao

* cn.itcast.vo

2.创建实体类:

* Book

3.新建一个jsp页面:

* addBook.jsp

        <s:form action="book_add"namespace="/" method="post" theme="simple">

图书名称:<s:textfield name="name"/><br/>

图书价格:<s:textfield name="price"/><br/>

<s:submit value="添加图书"/>

</s:form>

4.编写Action:

public class BookAction extends ActionSupport implementsModelDriven<Book>{

// 模型驱动类

private Book book = newBook();

public Book getModel() {

    return book;

}

// 处理请求的方法:

public String add(){

    System.out.println("web层的添加执行了...");

    return NONE;

}

}

5.配置struts.xml

<action name="book_*"class="cn.itcast.action.BookAction" method="{1}">

       

    </action>

1.2.3   Struts2和Spring的整合两种方式:

Struts2自己管理Action:(方式一)

<actionname="book_*" class="cn.itcast.action.BookAction"method="{1}">

* Struts2框架自动创建Action的类.

Action交给Spring管理:(方式二)

可以在<action>标签上通过一个伪类名方式进行配置:

<actionname="book_*" class="bookAction"method="{1}"></action>

在spring的配置文件中:

<!-- 配置Action -->

<bean id="bookAction"class="cn.itcast.action.BookAction"></bean>

(*****)注意:Action交给Spring管理一定要配置scope=”prototype

推荐使用二:

* 在Spring中管理的类,可以对其进行AOP开发.统一的管理.

Web层获得Service:

传统方式:

* 获得WebApplicationContext对象.

* 通过WebAppolicationContext中getBean(“”);

实际开发中:

* 引入了struts2-spring-plugin-2.3.15.3.jar

* 有一个配置文件 :struts-plugin.xml

开启常量 :

<constant name="struts.objectFactory"value="spring" />

引发另一个常量的执行:(Spring的工厂类按照名称自动注入)

struts.objectFactory.spring.autoWire = name

1.2.4   Spring整合Hibernate:

Spring整合Hibernate框架的时候有两种方式:

零障碍整合:(一)

可以在Spring中引入Hibernate的配置文件.

1.通过LocalSessionFactoryBean在spring中直接引用hibernate配置文件

<!-- 零障碍整合 在spring配置文件中引入hibernate的配置文件 -->

<bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

    <propertyname="configLocation"value="classpath:hibernate.cfg.xml"/>

</bean>

2.Spring提供了Hibernate的模板.只需要将HibernateTemplate模板注入给DAO.

* DAO继承HibernateDaoSupport.

<!-- DAO的配置-->

<bean id="bookDao"class="cn.itcast.dao.BookDao">

    <propertyname="sessionFactory" ref="sessionFactory"/>

</bean>

改写DAO:继承HibernateDaoSupport类.

public class BookDao extends HibernateDaoSupport{

public void save(Book book) {

    System.out.println("DAO层的保存图书...");

    this.getHibernateTemplate().save(book);

}

}

3.创建一个映射文件 :

<hibernate-mapping>

<classname="cn.itcast.vo.Book" table="book">

    <id name="id">

        <generatorclass="native"/>

    </id>

    <property name="name"/>

    <property name="price"/>

</class>

</hibernate-mapping>

4.别忘记事务管理:

事务管理器:

<!-- 管理事务 -->

<beanid="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager">

    <property name="sessionFactory" ref="sessionFactory"/>

</bean>

5.注解管理事务:

<!-- 注解开启事务 -->

<tx:annotation-driventransaction-manager="transactionManager"/>

6.在业务层类上添加一个注解:

@Transactional


没有Hibernate配置文件的形式(二)

不需要Hibernate配置文件的方式,将Hibernate配置文件的信息直接配置到Spring中.

Hibernate配置文件中的信息 :

* 连接数据库基本参数:

* Hibernate常用属性:

* 连接池:

* 映射:

把Hibernate配置文件整合Spring中:

连接池:

<!-- 引入外部属性文件. -->

<context:property-placeholderlocation="classpath:jdbc.properties"/>

<!-- 配置c3p0连接池 -->

<bean id="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource">

    <propertyname="driverClass" value="${jdbc.driver}"/>

    <propertyname="jdbcUrl" value="${jdbc.url}"/>

    <propertyname="user" value="${jdbc.user}"/>

    <propertyname="password" value="${jdbc.password}"/>

</bean>


Hibernate常用属性:

<!-- 配置Hibernate的属性 -->

    <property name="hibernateProperties">

        <props>

            <propkey="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>

            <propkey="hibernate.show_sql">true</prop>

            <propkey="hibernate.format_sql">true</prop>

            <propkey="hibernate.hbm2ddl.auto">update</prop>

            <propkey="hibernate.connection.autocommit">false</prop>

        </props>

    </property>

映射

<!-- <propertyname="mappingResources">

        <list>

            <value>cn/itcast/vo/Book.hbm.xml</value>

        </list>

    </property> -->

    <propertyname="mappingDirectoryLocations">

        <list>

            <value>classpath:cn/itcast/vo</value>

        </list>

    </property>


1.2.5   HibernateTemplate的API:

 Serializable save(Object entity)                      :保存数据

 void update(Object entity)                        :修改数据

 void delete(Object entity)                        :删除数据

 <T> T get(Class<T> entityClass,Serializable id)      :根据ID进行检索.立即检索

 <T> T load(Class<T> entityClass,Serializable id)     :根据ID进行检索.延迟检索.

 List find(String queryString, Object...values)       :支持HQL查询.直接返回List集合.

 List findByCriteria(DetachedCriteriacriteria)        :离线条件查询.

 List findByNamedQuery(String queryName,Object... values) :命名查询的方式.

 

1.2.6   OpenSessionInView:


1.3   基于注解的方式整合SSH:

导入以上工程jar包:

* 导入struts2的注解开发:

* struts2-convention-plugin-2.3.15.3.jar

* web.xml:

<!-- 配置Spring的监听器 -->

<listener>

<!-- 监听器默认加载的是WEB-INF/applicationContext.xml-->

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<!-- 指定Spring框架的配置文件所在的位置 -->

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:applicationContext.xml</param-value>

</context-param>

<!-- 配置Struts2的核心过滤器 -->

<filter>

<filter-name>struts2</filter-name>

<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>struts2</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

* 创建包结构:

* 引入spring的配置文件、log4j、jdbc属性文件.

* 创建页面:

* 创建Action:

@Namespace("/")

@ParentPackage("struts-default")

public class BookAction extends ActionSupport implementsModelDriven<Book>{

private Book book = newBook();

public Book getModel() {

    return book;

}

@Action(value="book_add")

public String add(){

    System.out.println("web层添加图书...");

    return NONE;

}

}

*Action---Service----Dao

将各层类使用注解装配Spring中:

@Controller

@Service

@@Repository

完成属性注入:

@Autowired

@Qualifier("bookService")

* 实体类:

@Entity

@Table(name="book")

public class Book {

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

private Integer id;

@Column(name="name")

private String name;

private Double price;

public Integer getId() {

    return id;

}

public void setId(Integer id){

    this.id = id;

}

public String getName() {

    return name;

}

public void setName(Stringname) {

    this.name = name;

}

public Double getPrice() {

    return price;

}

public void setPrice(Doubleprice) {

    this.price = price;

}

@Override

public String toString() {

    return "Book [id=" + id + ", name=" + name +", price=" + price + "]";

}

}

* 事务管理:

* 模板注入:

今天内容总结:

Spring的事务管理:

* 编程式事务:(了解)

* 声明式事务:

* TransactionProxyFactoryBean.

* AOP和事务配置:(*****)

* 基于注解事务管理:(*****)

SSH整合:

* SSH整合(带有hibernate配置文件)

* 导包:

* 配置文件:

* Struts2+Spring

* 两种方式:

* Action的类由Struts框架创建.

* Action的类由Spring框架创建.(scope=”prototype”)

* Spring+Hibernate:

* 在Spring框架中引入Hibernate的配置文件.

* 管理事务:

* DAO中注入sessionFactory.

* SSH整合(不带Hibernate配置文件)

* 导包:

* 配置文件:

* Struts2+Spring

* 两种方式:

* Action的类由Struts框架创建.

* Action的类由Spring框架创建.(scope=”prototype”)

* Spring+Hibernate

* 把Hibernate配置信息配置到Spring中

* 管理事务:

* DAO中注入sessionFactory.

* SSH注解.(**)

* Struts2:

* 在Action的类上

* @Namespace(“/”)

* @ParentPackage("struts-default")

* 在要执行的方法上:

* @Action

* 把Action/Service/Dao交给Spring.

* Action:

@Controller("bookAction")

@Scope("prototype")

* Service

@Service

* Dao

@Repository

* 配置Spring中自动扫描;

<context:component-scan base-package="cn.itcast.action,cn.itcast.service,cn.itcast.dao"/>

* 映射:

@Entity

@Table(name="book")

public class Book {

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

private Integer id;

@Column(name="name")

private String name;

...

}

* 配置SessionFactory:

<!-- 配置Hibernate的其他属性: -->

<beanid="sessionFactory"class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

    <property name="dataSource"ref="dataSource"/>

    <!-- 配置Hibernate的属性 -->

    <property name="hibernateProperties">

        <props>

            <propkey="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>

            <prop key="hibernate.show_sql">true</prop>

            <propkey="hibernate.format_sql">true</prop>

            <propkey="hibernate.hbm2ddl.auto">update</prop>

            <prop key="hibernate.connection.autocommit">false</prop>

        </props>

    </property>

    <!-- 映射扫描-->

    <property name="packagesToScan">

        <list>

            <value>cn.itcast.vo</value>

        </list>

    </property>

</bean>

* 事务管理:

<!-- 事务管理器 -->

<beanid="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

    <property name="sessionFactory"ref="sessionFactory"/>

</bean>

<tx:annotation-driventransaction-manager="transactionManager"/>

* DAO中使用Hibernate模板:

* 手动注入HibernateTemplate:

<beanid="hibernateTemplate"class="org.springframework.orm.hibernate3.HibernateTemplate">

    <property name="sessionFactory"ref="sessionFactory"/>

</bean>

* 在Dao中

@Autowired

@Qualifier("hibernateTemplate")

private HibernateTemplatehibernateTemplate;


更多学习资料:https://blog.csdn.net/ganquanzhong

             在写完Spring+MyBatis+Spring MVC等文章后、我整理了一套完整实战文档,有需要的点击下载

猜你喜欢

转载自blog.csdn.net/ganquanzhong/article/details/80188865