第四章 Spring与JDBC的整合
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事务的隔离级别
事务的隔离级别是由数据库本身提供的,一般不需要我们去改变什么东西。
事务并发会产生的问题
脏读 如:事务A读到事务B未提交的数据
不可重复读如:多次读取同一个事务得到的结果不同
幻读如:事务A读到事务B已提交的数据
隔离级别
隔离级别 |
解释 |
允许并发的问题 |
相应数据库 |
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的整合的更多相关文章
- Unit06: Spring对JDBC的 整合支持 、 Spring+JDBC Template、Spring异常处理
Unit06: Spring对JDBC的 整合支持 . Spring+JDBC Template .Spring异常处理 1. springmvc提供的异常处理机制 我们可以将异常抛给spring框架 ...
- spring对JDBC的整合支持
参考网址:https://blog.csdn.net/u013821825/article/details/51606171 springMVC,目前用到的jar包 spring IOC 5个包 + ...
- 四、spring的JDBC模板和事务管理
Spring的JDBC模板 Spring是JavaEE开发的一站式框架,对各种持久化技术都提供了简单的模板 ORM持久化技术 模板类 JDBC org.springframework.jdbc.cor ...
- Netty学习第四章 spring boot整合netty的使用
现在大多数项目都是基于spring boot进行开发,所以我们以spring boot作为开发框架来使用netty.使用spring boot的一个好处就是能给将netty的业务拆分出来,并通过spr ...
- Spring 开发第一步(四)Spring与JDBC事务
Spring使用各种不同的TransactionManager来管理各种不同数据源事务底层(比如jdbc数据源.hibernate数据源.JPA数据源等等).在此基础上使用各种对应的Template来 ...
- 第四章 Spring.Net 如何管理您的类___统一资源访问接口
在前面章节有童鞋提到过 关于配置文件 Objects.xml 路径的相关问题,这些东西是 IResource 接口的一些内容,接下来就详细介绍一下 IResource 接口. IResource 接口 ...
- 第四章 Spring.Net 如何管理您的类___对象的生命周期链
各位,实在不好意思,因为有事,博客几天没更新了.前面有童鞋提到,配置 Objects.xml 路径的相关问题,这些东西是 IResource 接口的一些内容.在下一章会详细介绍. 传统的Net应用中, ...
- 第四章 Spring.Net 如何管理您的类___对象的手动装配
前面我们知道了什么是对象,什么是对象工厂,什么是应用程序上下文.这一次我们来看一下对象的装配. Spring.Net 中有多种装配对象的方式,装配这个词可能比较学术化,我们可以理解为对象的创建. Sp ...
- 第四章 Spring.Net 如何管理您的类___对象、对象工厂和应用程序上下文
在前面一章我们介绍了依赖注入,控制反转的概念,以及自己动手搭建了一下Spring.Net的环境.通过这些操作,我们知道了Spring.Net 的核心是使用依赖注入或控制反转这种思想来管理业务对象,降低 ...
随机推荐
- 总结:js中4类修改样式的方法
前言 最近在写一个扩展右键菜单的插件,既然是插件,想着一步到位,把相关的style样式设置都丢进js文件中,直接加载一个js文件便可以使用该插件,所以今天就研究了下js批量的插入样式的方法,即addS ...
- asp.net 通过 Handler 导出数据至excel (让用户下载)
效果图: 代码: Export2Excel.ashx <%@ WebHandler Language="C#" CodeBehind="Export2Excel.a ...
- MySQL如何查询LINESTRING数据
我有一个提交的命名crm_geo_org,具有以下结构 ipoid INTEGER 11 NOT NULL PRIMARY KEY beginip INTEGER 14 NOT NULL UNSIGN ...
- Android Socket 开发技术
根据之前的经验,应用软件的网络通信无非就是Socket和HTTP,其中Socket又可以用TCP和UDP,HTTP的话就衍生出很多方式,基础的HTTP GET和POST请求,然后就是WebServic ...
- I/O操作技术
对I/O操作有三种可能的技术:可编程I/O.中断驱动I/O.直接内存存取(DMA) 可编程I/O 当处理器正在运行程序并遇到一个与I/O相关的指令时,它通过给对应的I/O模块发命令来运行这个指令 ...
- 通过ip拨号器来了解广播接收者
1.继承广播接收者类 package com.example.ipdail; import android.content.BroadcastReceiver; import android.cont ...
- 【linux kernel】 中断处理-中断上半部
欢迎转载,转载时需保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:htt ...
- HDU 4041 Eliminate Witches! (模拟题 ACM ICPC 2011亚洲北京赛区网络赛)
HDU 4041 Eliminate Witches! (模拟题 ACM ICPC 2011 亚洲北京赛区网络赛题目) Eliminate Witches! Time Limit: 2000/1000 ...
- perl学习(9) 实例:取出操作时间最长的100个记录
需求描述: 日志记录了一次操作的时间,即server端接收包到发送结果到client端的时间,取出操作时间最长的100个记录. 日志信息片段: [2013-09-13 15:23:50,445.500 ...
- NoSQL架构实践
经常有朋友遇到困惑,看到NoSQL的介绍,觉得很好,但是却不知道如何正式用到自己的项目中.很大的原因就是思维固定在MySQL中了,他们问得最多的问题就是用了NoSQL,我如何做关系查询.那么接下来,我 ...