第四章 Spring与JDBC的整合

这里选择的是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>
时间: 2024-11-10 01:03:13

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

【PMP】Head First PMP 学习笔记 第四章 项目整合管理

第四章 项目整合管理 项目经理每天的工作 力保项目顺利进行 紧密监督以确保计划进行 计划本身不完善需要予以修正 即使是更大的项目的子项目,也要有收尾的过程 6个整合管理过程 整合管理划分为6个过程,项目经理必须掌握的核心职责. 1.制订项目章程 授权你展开工作的文档,通常由赞助人(为项目提供资金的人)交给你. 2.制订项目管理计划 项目管理计划涵盖了所有知识领域,很大一部分就是告诉你在出现问题时如何处理变更. 3.指导和管理项目执行 确保所有人都在做他们本该做的事,项目创建的产品和项目确实满足干

详解spring与jdbc整合操作_java

先上一段简单示例 public class MyTemplate { private DataSource dataSource; public DataSource getDataSource() { return dataSource; } public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public void insert(String sql) throws SQLExc

spring jdbc redis整合

问题描述 项目原来是spring+struts+jdbc因为最近用到了redis看到网上有整合springredis的文章可是弄了半天都没弄好~总是报错~有没有人搞过啊发个demo瞧瞧924320105@qq.com

《网络零售整合营销》——第四章搜索营销

第四章 搜索营销 第一节 网络零售搜索营销理论 一.搜索引擎营销概述 (一)搜索引擎 1.搜索引擎定义 搜索引擎是指根据一定的策略.运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的系统.搜索引擎包括全文索引.目录索引.元搜索引擎.垂直搜索引擎.集合式搜索引擎.门户搜索引擎与免费链接列表等.百度和谷歌等是搜索引擎的代表. 2.搜索引擎工作原理 (1)网页抓取 每个独立的搜索引擎都有自己的网页抓取程序(spider).Spider

Spring实战6-利用Spring和JDBC访问数据库

主要内容 定义Spring的数据访问支持 配置数据库资源 使用Spring提供的JDBC模板 写在前面:经过上一篇文章的学习,我们掌握了如何写web应用的控制器层,不过由于只定义了SpitterRepository和SpittleRepository接口,在本地启动该web服务的时候会遇到控制器无法注入对应的bean的错误,因此我决定跳过6~9章,先搞定数据库访问者一章. 在企业级应用开发中不可避免得会涉及到数据持久化层,在数据持久化层的开发过程中,可能遇到很多陷阱.你需要初始化数据库访问框架.

Spring+SpringMVC+Mybatis配置整合

前言 关于SSM框架整合的问题,网络上有很多资源,但是最近想自己配置的时候却发现总是找不到一个完整的配置教程或完整的代码.有一些比较旧的博客里面讲了一些,但是spring的版本还都是3点几.最近自己从网上各个地方找了一些教程,然后试着自己配置了一下,遇到了很多问题,包括报各种各样的异常.现在终于搞好了,记录一下以备不时之需. 正文 话不多说,直接上干货. 在创建好maven的webapp之后,在pom.xml中加入一些配置.完整的文件如下. <project xmlns="http://m

SSH整合学习笔记之spring与hibernate简单整合.doc

SSH整合学习笔记 大致的学习了一下struts1.x struts2.x  spring2.5 hibernate3.6,觉得东西很多,好些东西都记不住,最后发现想记住的方法就是多练习.自己多写一下简单的工程也会把这些知识巩固,但是公司现在不用这个,所以只能记下笔记,不忙的时候再拿来看看,坚持的练习一下.我也是初学,所以只是记下一些基础的东西,如果写错了什么,请朋友多多指出. 个人对SSH的理解也不算深入,只是大概的学完一圈觉得spring很强大,有的人觉得spring很难学,但是我觉得str

《Spring实战(第4版)》——第1章 Spring之旅 1.1简化Java开发

第1部分 Spring的核心 Spring可以做很多事情,它为企业级开发提供给了丰富的功能,但是这些功能的底层都依赖于它的两个核心特性,也就是依赖注入(dependency injection,DI)和面向切面编程(aspect-oriented programming,AOP). 作为本书的开始,在第1章"Spring之旅"中,我将快速介绍一下Spring框架,包括Spring DI和AOP的概况,以及它们是如何帮助读者解耦应用组件的. 在第2章"装配Bean"中

《网络零售学》——第四章网络零售的基本规律与原理

第四章 网络零售的基本规律和原理 第一节 网络零售的经济学特征及基本理论 一.关于经济学基本原理 (一)经济学(economics) 经济学的定义:研究在资源稀缺和理性人假设下资源的合理配置:或者说经济学研究的是人在约束条件下的选择行为.经济学认为相对于人们的欲望,经济资源总是短缺的.经济学就是研究如何合理地配置和充分利用稀缺的经济资源来满足人们的多种需求的科学. 经济学的英语Economics是由希腊文οκο?[oikos]而来,意思是家庭.家族.财产权(family,household,es