Spring学习笔记(3)之Spring对JDBC的支持

来源:互联网 发布:淘宝追加评价在哪 编辑:程序博客网 时间:2024/06/07 01:33

Spring对JDBC的支持

使用JdbcTemplate跟新数据库

1.        JDBCTemplate的使用

1)        创建连接池的相关配置

a)        导入资源文件:即导入写有连接池配置的相关信息的配置文件

b)        配置C3P0  Bean。

2)        配置Spring的JDBCTemplate:即配置JDBCTemplate的Bean。

3)        在java文件中通过IOC容器获得JdbcTemplate的对象。

4)        通过JdbcTemplate对象执行插入、更新、删除、查询操作

Ø  Update:jdbcTemplate.update();

Ø  批量更新:jdbcTemplate.batchUpdate();

5)        查询:

a)        jdbcTemplate.batchUpdate

b)        需要调用 queryForObject(String sql, RowMapper<Employee> rowMapper,Object... args)

Ø  其中的 RowMapper 指定如何去映射结果集的行,常用的实现类为 BeanPropertyRowMapper

Ø  使用 SQL 中列的别名完成列名和类的属性名的映射. 例如 last_name lastName

Ø  不支持级联属性.JdbcTemplate 到底是一个 JDBC 的小工具, 而不是 ORM 框架

c)        查询实体类的集合:jdbcTemplate.query()。注意调用的不是 queryForList 方法

使用NamedParameterJdbcTemplate

1.        可为SQL中的按名称(以冒号开头)而不是按位置进行指定。【具名参数更易于维护】,也【提升了可读性】。

2.        NamedParameterJdbcTemplate的使用

1)        创建连接池的相关配置

c)        导入资源文件:即导入写有连接池配置的相关信息的配置文件

d)        配置C3P0  Bean。

2)        配置NamedParameterJdbcTemplate的Bean。

Ø  NamedParameterJdbcTemplate没有无参构造器,需要使用构造器注入的方式为dataSource初始化。

3)        在Java文件中通过IOC容器获取实例。

4)        通过namedParameterJdbcTemplate更新数据

Ø  在 SQL 语句中使用具名参数时, 可以在一个Map中提供参数值, 参数名为键

Ø  也可以使用SqlParameterSource 参数

Ø  批量更新时可以提供 Map或 SqlParameterSource 的数组

5)        查询元素:同jdbcTemplate。

 

事务管理

1.        开启事务

1)        配置事务管理器:

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

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

</bean>

2)        启用事务注解

<tx:annotation-driven transaction-manager="transactionManager"/>

3)        在业务中对一个事务的的操作方法上添加注释:@Transactional

2.        事务传播性(通过注解设置)

1)        什么是事务的传播性:(画图+说明)

当事务方法被另一个事务方法调用时, 必须指定事务应该如何传播。例如: 方法可能继续在现有事务中运行, 也可能开启一个新事务, 并在自己的事务中运行。

•         事务传播属性可以在 @Transactional 注解的 propagation 属性中定义

2)        REQUIRED传播行为:(举例+ 画图)


a)        Checkout事务与被调用的purchase事务方法同属于一个事务。

b)        期间只要有一个purchase事务方法出现异常,都直接回滚到整个事务开始,即Tx1。

3)        REQUIRE_NEW 传播行为


a)        它表示该方法必须启动一个新事务, 并在自己的事务内运行。如果被调用的事务在运行, 就应该先挂起本事务。

b)        由于被调用的多个事务都是相互独立,且并不属于本事务。期间有一个事务抛出异常,只回滚到该事务的开始。

3.        设置隔离事务属性

1)        用 @Transactional 注解声明式地管理事务时可以在 @Transactional 的 isolation 属性中设置隔离级别


4.        设置回滚事务属性(不常用)

1)        事务的回滚规则可以通过 @Transactional 注解的 rollbackFor 和 noRollbackFor 属性来定义

Ø  rollbackFor:  遇到时必须进行回滚

Ø  noRollbackFor: 一组异常类,遇到时必须不回滚


5.        设置超时和只读事务属性

1)        超时和只读属性可以在 @Transactional 注解中定义.超时属性以秒为单位来计算.


Spring与Hibernate整合

1.        Spring整合Hibernate整合什么?

1)        由IOC容器来管理Hibernate的SessionFactory。

2)        让Hibernate使用上Spring的声明式事务。

2.        整合步骤

1)        加入hibernate

a)        导入hibernate的jar包。

b)        添加hibernate的配置文件:hibernate.cfg.xml

Ø  在hibernate主配置文件中配置其基本属性:如方言、SQL显示、SQL格式化、生成数据表和二级缓存等。

Ø  数据源(C3P0)移到IOC容器中配置

Ø  映射文件*.hbm.xml的加载在IOC容器配置SessionFactory实例时进行配置。

c)        编写持久化类对应的*.hbm.xml文件。

2)        加入Spring

a)        导入jar包

b)        添加Spring的配置文件

Ø  配置自动扫描包(为采用基于注释方式配置Bean)

Ø  配置资源

导入资源文件(为导入4大参数的配置文件做准备)

配置数据源Bean(配置C3p0的Bean,并为4大参数赋值)

Ø  配置Hibernate的SessionFactory的Bean:这里使用的类是LocalSessionFactoryBean

配置数据源

配置Hibernate主配置文件的位置

配置Hibernate映射文件的位置及名称

Ø  配置Spring的声明式事务

配置事务管理器

配置事务属性,需要事务管理器

指定切点,并将切点与事务相关联。即在切点上添加事务。

3)        Spring中事务的流程

* 1. 在方法开始之前

* ①. 获取 Session

* ②. 把 Session 和当前线程绑定, 这样就可以在 Dao 中使用SessionFactory 的

* getCurrentSession() 方法来获取 Session 了

* ③. 开启事务

* 2. 若方法正常结束, 即没有出现异常, 则

* ①. 提交事务

* ②. 使和当前线程绑定的 Session 解除绑定

* ③. 关闭 Session

*

* 3. 若方法出现异常, 则:

* ①. 回滚事务

* ②. 使和当前线程绑定的 Session 解除绑定

 * ③. 关闭 Session

Spring整合Struct2

1.        Spring 如何在 WEB 应用中使用 ?

1)        需要额外加入的 jar 包:

Ø  spring-web-4.0.0.RELEASE.jar

Ø  spring-webmvc-4.0.0.RELEASE.jar

2)        2). Spring 的配置文件, 没有什么不同

3)        如何创建 IOC 容器 ?

a)        非 WEB 应用在 main 方法中直接创建

b)        应该在 WEB 应用被服务器加载时就创建 IOC 容器:

在 ServletContextListener#contextInitialized(ServletContextEvent sce) 方法中创建 IOC 容器.

c)        在 WEB 应用的其他组件中如何来访问 IOC 容器呢 ?

在 ServletContextListener#contextInitialized(ServletContextEvent sce) 方法中创建 IOC 容器后, 可以把其放在

ServletContext(即 application域)的一个属性中.

 

d)        实际上, Spring 配置文件的名字和位置应该也是可配置的! 将其配置到当前 WEB 应用的初始化参数中较为合适.

4)        在 WEB 环境下使用 Spring

a)        需要额外加入的 jar 包:

Ø  spring-web-4.0.0.RELEASE.jar

Ø  spring-webmvc-4.0.0.RELEASE.jar

b)        Spring 的配置文件, 和非 WEB 环境没有什么不同

c)        需要在 web.xml 文件中加入如下配置:

<!-- 配置 Spring 配置文件的名称和位置 -->

<context-param>

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

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

</context-param>

 

<!-- 启动 IOC 容器的 ServletContextListener -->

<listener>

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

</listener>

 

2.        Spring 如何整合 Struts2?

1)        整合目标 ? 使 IOC 容器来管理 Struts2 的 Action!

2)        如何进行整合 ?

a)        正常加入 Struts2

b)        在 Spring 的 IOC 容器中配置 Struts2 的 Action

注意: 在 IOC 容器中配置 Struts2的 Action 时, 需要配置 scope 属性, 其值必须为 prototype

 

<bean id="personAction"

     class="com.atguigu.spring.struts2.actions.PersonAction"

     scope="prototype">

     <propertyname="personService"ref="personService"></property>   

</bean>

 

c)        配置 Struts2 的配置文件: action 节点的 class 属性需要指向 IOC 容器中该 bean 的 id

<action name="person-save" class="personAction">

         <result>/success.jsp</result>

</action>

d)        加入 struts2-spring-plugin-2.3.15.3.jar

3)        整合原理: 通过添加 struts2-spring-plugin-2.3.15.3.jar 以后, Struts2 会先从 IOC 容器中

获取 Action 的实例.

 

if (appContext.containsBean(beanName)) {

    o =appContext.getBean(beanName);

} else {

    Class beanClazz =getClassInstance(beanName);

    o = buildBean(beanClazz,extraContext);

}

 

0 0