这里选择的是mysql数据库。

4.1引入aop、tx的命名空间


为了事务配置的需要,我们引入aop、tx的命名空间

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

4.2配置数据源


在配置数据源之前,首先要导入连接数据库时所需要的jar包。


<!-- 配置数据源 -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<!-- jdbc连接的4个必须参数 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="test"/> <!-- 连接池启动初始值 -->
<property name="initialSize" value="5"/> <!-- 最大空闲值 -->
<property name="maxIdle" value="20"/> <!-- 最小空闲值 -->
<property name="minIdle" value="5"/> <!-- 最大连接值 -->
<property name="maxActive" value="500"/>
</bean>

4.3配置事务


4.3.1 基于Schema的方式


<!-- 指定事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean> <!-- 设置事务增强 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="add*" rollback-for="Exception"/>
</tx:attributes>
</tx:advice> <!-- 作用Shcema的方式配置事务,这里是把事务设置到了service层-->
<aop:config>
<aop:pointcut id="servicePointcut" expression="execution(* cn.framelife.spring.jdbc.*ServiceImpl.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut"/>
</aop:config>

4.3.2基于注解的方式


基本配置:

<!-- 配置数据源 -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<!-- jdbc连接的4个必须参数 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="test"/>
<!-- 连接池启动初始值 -->
<property name="initialSize" value="5"/>
<!-- 最大空闲值 -->
<property name="maxIdle" value="20"/>
<!-- 最小空闲值 -->
<property name="minIdle" value="5"/>
<!-- 最大连接值 -->
<property name="maxActive" value="500"/>
</bean> <!-- 指定事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean> <!-- 打开tx事务注解管理功能 -->
<tx:annotation-driven transaction-manager="txManager"/>

@Transactional的使用

放在需要事务的类的头上。如:我们想把事务集中在业务层管理,那就在service层的各个类上标注上@Transactional注解。

@Transactional
@Repository
public class UserDaoImpl implements UserDao {
}

4.3.3事务的传播行为


Spring给我们提供了7种类型的事务传播行为:

PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。 
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。 
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。 
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

我们可以通过事务的propagation属性来进行配置。

4.3.4事务的隔离级别


事务的隔离级别是由数据库本身提供的,一般不需要我们去改变什么东西。

  1. 事务并发会产生的问题


  1. 脏读 如:事务A读到事务B未提交的数据

  2. 不可重复读如:多次读取同一个事务得到的结果不同

  3. 幻读如:事务A读到事务B已提交的数据

  1. 隔离级别

隔离级别

解释

允许并发的问题

相应数据库

READUNCOMMITED

可读取未提交的数据

ABC

READCOMMITED

读已提交事务

BC

SQLServer默认

REPEATABLEREAD

可重复读

C

MySQL默认

SERIALIZABLE

序列化

4.4JDBCTemplate的使用

public class UserDaoImpl implements UserDao {
private JdbcTemplate jdbcTemplate; /**
* 通过dataSource的setter方法,在运行时注入一个dataSouce对象,然后根据这个对象创建一个JdbcTemplate对象
* @param dataSource
*/
public void setDataSource(DataSource dataSource){
this.jdbcTemplate = new JdbcTemplate(dataSource);
} /**
* 增加、修改、删除都是使用的JdbcTemplate的update方法。
* update方法中第一个参数是sql语句,未知的值用占位符?代替
* 第二个参数是一个Object数组。数组里面的各项是上面的占位符的值
* 第三个参数是一个int数组。数组的各项是第二个参数中的值在数据库中的类型
*/
public void save(User user) {
jdbcTemplate.update("insert into user(username,password) values(?,?)",
new Object[]{user.getUsername(),user.getPassword()},
new int[]{java.sql.Types.VARCHAR,java.sql.Types.VARCHAR}
);
} public void update(User user) {
jdbcTemplate.update("update user set username=?,password=? where id=?",
new Object[]{user.getUsername(),user.getPassword(),user.getId()},
new int[]{java.sql.Types.VARCHAR,java.sql.Types.VARCHAR,java.sql.Types.INTEGER}
);
} public void delete(Integer id) {
jdbcTemplate.update("delete from user where id = ?",
new Object[]{id},
new int[]{java.sql.Types.INTEGER}
);
} /**
* 根据id获取单个数据是通过queryForObject方法
* 这个方法前面三个参数都与update方法一样
* 第四个参数是一个org.springframework.jdbc.core.RowMapper接口的对象
* 实现RowMapper接口,必须实现里面的mapRow(ResultSet rs, int rowNum)方法
* 这个方法是通过ResultSet把一条记录放到一个实体类对象中,并返回这个实体类对象
*/
public User getUserById(Integer id) {
User user = jdbcTemplate.queryForObject("select * from user where id=?",
new Object[]{id},
new int[]{java.sql.Types.INTEGER}, new RowMapper<User>() {
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
return user;
}
});
return user;
} /**
* 通过一条没有占位符的select语句来查询多条记录,并返回一个List集合
* query方法里面的两个参数
* 第一个是select语句
* 第二个是RowMapper接口的对象
*/
public List<User> getUsersBySql(String sql) { return jdbcTemplate.query(sql, new RowMapper<User>() {
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
return user;
}
});
}
}

4.5完整的配置


4.5.1基于Schema

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <!-- 配置数据源 -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<!-- jdbc连接的4个必须参数 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="test"/>
<!-- 连接池启动初始值 -->
<property name="initialSize" value="5"/>
<!-- 最大空闲值 -->
<property name="maxIdle" value="20"/>
<!-- 最小空闲值 -->
<property name="minIdle" value="5"/>
<!-- 最大连接值 -->
<property name="maxActive" value="500"/>
</bean> <!-- 指定事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean> <!—
设置事务增强
read-only 表示对应的事务应该被最优化为只读事务。
rollback-for="Exception" 是指出现异常的时候回滚事务
-->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="add*" rollback-for="Exception"/>
<tx:method name="update*"/>
</tx:attributes>
</tx:advice> <!-- 作用Shcema的方式配置事务 -->
<aop:config>
<aop:pointcut id="servicePointcut" expression="execution(* cn.framelife.spring.jdbc.*ServiceImpl.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut"/>
</aop:config> <!-- 把相关的Bean交由Spring管理 -->
<bean id="userDao" class="cn.framelife.spring.jdbc.UserDaoImpl">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="userService" class="cn.framelife.spring.jdbc.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
</beans>

4.5.2基于注解

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <context:component-scan base-package="cn.framelife.spring"></context:component-scan>
<!-- 配置数据源 -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<!-- jdbc连接的4个必须参数 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="test"/>
<!-- 连接池启动初始值 -->
<property name="initialSize" value="5"/>
<!-- 最大空闲值 -->
<property name="maxIdle" value="20"/>
<!-- 最小空闲值 -->
<property name="minIdle" value="5"/>
<!-- 最大连接值 -->
<property name="maxActive" value="500"/>
</bean> <!-- 指定事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean> <!-- 打开tx事务注解管理功能 -->
<tx:annotation-driven transaction-manager="txManager"/>
</beans>


第四章 Spring与JDBC的整合的更多相关文章

  1. Unit06: Spring对JDBC的 整合支持 、 Spring+JDBC Template、Spring异常处理

    Unit06: Spring对JDBC的 整合支持 . Spring+JDBC Template .Spring异常处理 1. springmvc提供的异常处理机制 我们可以将异常抛给spring框架 ...

  2. spring对JDBC的整合支持

    参考网址:https://blog.csdn.net/u013821825/article/details/51606171 springMVC,目前用到的jar包 spring IOC 5个包  + ...

  3. 四、spring的JDBC模板和事务管理

    Spring的JDBC模板 Spring是JavaEE开发的一站式框架,对各种持久化技术都提供了简单的模板 ORM持久化技术 模板类 JDBC org.springframework.jdbc.cor ...

  4. Netty学习第四章 spring boot整合netty的使用

    现在大多数项目都是基于spring boot进行开发,所以我们以spring boot作为开发框架来使用netty.使用spring boot的一个好处就是能给将netty的业务拆分出来,并通过spr ...

  5. Spring 开发第一步(四)Spring与JDBC事务

    Spring使用各种不同的TransactionManager来管理各种不同数据源事务底层(比如jdbc数据源.hibernate数据源.JPA数据源等等).在此基础上使用各种对应的Template来 ...

  6. 第四章 Spring.Net 如何管理您的类___统一资源访问接口

    在前面章节有童鞋提到过 关于配置文件 Objects.xml 路径的相关问题,这些东西是 IResource 接口的一些内容,接下来就详细介绍一下 IResource 接口. IResource 接口 ...

  7. 第四章 Spring.Net 如何管理您的类___对象的生命周期链

    各位,实在不好意思,因为有事,博客几天没更新了.前面有童鞋提到,配置 Objects.xml 路径的相关问题,这些东西是 IResource 接口的一些内容.在下一章会详细介绍. 传统的Net应用中, ...

  8. 第四章 Spring.Net 如何管理您的类___对象的手动装配

    前面我们知道了什么是对象,什么是对象工厂,什么是应用程序上下文.这一次我们来看一下对象的装配. Spring.Net 中有多种装配对象的方式,装配这个词可能比较学术化,我们可以理解为对象的创建. Sp ...

  9. 第四章 Spring.Net 如何管理您的类___对象、对象工厂和应用程序上下文

    在前面一章我们介绍了依赖注入,控制反转的概念,以及自己动手搭建了一下Spring.Net的环境.通过这些操作,我们知道了Spring.Net 的核心是使用依赖注入或控制反转这种思想来管理业务对象,降低 ...

随机推荐

  1. hibernate笔记(一)

    一.主配置文件hibernate.cfg.xml 位置:放在src目录下. 主要包含信息: 一.数据库信息    数据库方言(类的全名) 及 数据库链接信息 1.      数据库方言 2.      ...

  2. ASP.NET中操作SQL数据库

    在WebConfig中配置数据库连接字符串,代码如下: <connectionStrings>         <add name="ConnectionString&qu ...

  3. 《C++ Primer Plus》学习笔记1

    C++ Primer Plus>学习笔记1 第二章.開始学习C++ 1.控制符endl 假设显示字符串时,在字符串中包括换行符,而不是在末尾加上endl,这样能够大大降低输入量:假设是要生成一个 ...

  4. Collections.sort方法对list排序的两种方式

    Collections.sort( )分为两部分,一部分为排序规则,一部分为排序算法 . 规则用来判断对象,算法则考虑如何进行排序 对于自定义对象,sort()不知道规则,所以无法比较,这种情况下一定 ...

  5. android自定义控件---添加表情

    android自定义控件---添加表情 一.定义layout文件,图片不提供了 <?xml version="1.0" encoding="utf-8"? ...

  6. TraceView总结

    一.TraceView简单介绍 TraceView是AndroidSDK里面自带的工具,用于对Android的应用程序以及Framework层的代码进行性能分析. TraceView是图形化的工具,终 ...

  7. Java中int类型和tyte[]之间转换及byte[]合并

    JAVA基于位移的 int类型和tyte[]之间转换 [java] view plaincopy /** * 基于位移的int转化成byte[] * @param int number * @retu ...

  8. ASP.NET - Eval数据绑定

    <!--新闻分类--> <div id ="category" class ="Frm"> <h4>新闻分类</h4& ...

  9. js模板引擎--artTemplate

    js模板引擎--artTemplate 以前研究过一段时间的handlebars,但因为其渲染性能略逊于腾讯的artTemplate(在artTemplate的GitHub官网上有推荐的性能测试地址) ...

  10. 用Delphi进行word开发

    使用以CreateOleObjects方式调用Word 实际上还是Ole,但是这种方式能够真正做到完全控制Word文件,能够使用Word的所有属性,包括自己编写的VBA宏代码.------------ ...