`
p_3er
  • 浏览: 55742 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

第四章 Spring与JDBC的整合

 
阅读更多

这里选择的是mysql数据库。


4.1引入aoptx的命名空间


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


<?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>




分享到:
评论

相关推荐

    第十一章 Spring4 JDBC

    【标题】"第十一章 Spring4 JDBC" 在Spring框架中,JDBC(Java Database Connectivity)模块是用于数据库操作的重要组成部分。Spring4对JDBC的支持旨在简化数据库访问,提供了一种更高级别的抽象,以减少手动处理...

    spring03(使用spring整合jdbc)

    其中一个重要的集成领域是Spring与JDBC(Java Database Connectivity)的整合。本教程将深入探讨如何利用Spring框架来简化和优化数据库操作,提高代码的可维护性和可测试性。 首先,我们了解Spring整合JDBC的基本...

    Spring、SpringMVC入门及整合JDBC、Mybatis

    Spring可以独立使用,也可以与Struts、Mybatis等其他框架整合使用,为企业级应用开发提供了一种低耦合度的解决方案。Spring框架主要包括以下几个方面的内容: 1. 依赖注入(IOC):依赖注入是Spring框架的核心功能...

    Spring攻略PDF版

     第4章 高级Spring IoC容器   第5章 动态代理和经典的Spring AOP   第6章 Spring 2.x AOP和AspectJ支持  第二部分 基础主题  第7章 Spring对JDBC的支持   第8章 Spring中的事务管理   第9章...

    spring3.2与Ibatis整合

    - 配置数据源(DataSource),这是连接数据库的关键,可以使用Spring提供的JDBC数据源或第三方数据源。 - 创建`MyBatisConfig.xml`配置文件,定义SQL映射文件的位置,以及数据源等其他设置。 - 在Spring配置文件...

    Spring攻略中文版PDF

     第4章 高级Spring IoC容器   第5章 动态代理和经典的Spring AOP   第6章 Spring 2.x AOP和AspectJ支持  第二部分 基础主题  第7章 Spring对JDBC的支持   第8章 Spring中的事务管理   第9章...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    第四章 Tomcat使用指南 4.1 Tomcat简介 4.1.1 Tomcat的目录结构 4.1.2 Tomcat的配置参数 4.2 建立Tomcat的开发环境 4.2.1 下载Tomcat 4.2.2 设定TOMCAT_HOME 4.3 验证Tomcat是否安装成功 4.4 创建和发布Web应用 ...

    Spring攻略英文版(附带源码)

     第4章 高级Spring IoC容器   第5章 动态代理和经典的Spring AOP   第6章 Spring 2.x AOP和AspectJ支持  第二部分 基础主题  第7章 Spring对JDBC的支持   第8章 Spring中的事务管理   第9章 ...

    spring2.0技术手册 (扫描版)

    第4章SpringAOP 第5章JDBC、事务支持 第6章Hibernate与Spring 第7章SpringWebMVC框架 第8章View层方案、Web框架整合 第9章API封装 第10章项目:Spring在线书签 Spring Framework 是一个开源的Java/Java EE全...

    第25,26讲 --搭建和配置Spring与Hibernate整合的环境

    通过以上步骤,我们就成功地搭建了一个Spring与Hibernate整合的开发环境。在实际开发中,我们还需要考虑性能优化、异常处理、事务策略等因素,以确保应用的稳定性和效率。此外,随着技术的发展,Spring Boot和Spring...

    《精通Spring2.X企业应用开发详解》随书源码1-15章

    使用JPA访问数据库 第12章 整合其他ORM框架 第4篇 业务层应用 第13章 任务调度和异步执行器 第14章 JavaMail发送邮件 第15章 在Spring中使用JMS 第16章 在Spring中开发Web Service 第17章 使用...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    第四章 Tomcat使用指南 4.1 Tomcat简介 4.1.1 Tomcat的目录结构 4.1.2 Tomcat的配置参数 4.2 建立Tomcat的开发环境 4.2.1 下载Tomcat 4.2.2 设定TOMCAT_HOME 4.3 验证Tomcat是否安装成功 4.4 创建和发布Web应用 ...

    Java Web程序设计教程4

    第4章 sql与jdbc 64 第5章 struts 2框架基础 80 第6章 struts 2高级应用 110 第7章 struts 2中应用模板语言 145 第8章 hibernate框架基础 173 第9章 hibernate查询 188 第10章 hibernate性能优化 208 ...

    Java Web程序设计教程2

    第4章 sql与jdbc 64 第5章 struts 2框架基础 80 第6章 struts 2高级应用 110 第7章 struts 2中应用模板语言 145 第8章 hibernate框架基础 173 第9章 hibernate查询 188 第10章 hibernate性能优化 208 ...

    Java Web程序设计教程1

    第4章 sql与jdbc 64 第5章 struts 2框架基础 80 第6章 struts 2高级应用 110 第7章 struts 2中应用模板语言 145 第8章 hibernate框架基础 173 第9章 hibernate查询 188 第10章 hibernate性能优化 208 ...

    Java Web程序设计教程3

    第4章 sql与jdbc 64 第5章 struts 2框架基础 80 第6章 struts 2高级应用 110 第7章 struts 2中应用模板语言 145 第8章 hibernate框架基础 173 第9章 hibernate查询 188 第10章 hibernate性能优化 208 ...

    精通JSF-基于EJB Hibernate Spring整合开发与项目实践-第14章代码

    在"精通JSF-基于EJB Hibernate Spring整合开发与项目实践-第14章代码"中,你将看到如何将这些技术结合在一起,以构建一个完整的应用。可能的实践内容包括: 1. **JSF与Spring的集成**:学习如何在JSF页面中使用...

    Java Web程序设计教程5

    第4章 sql与jdbc 64 第5章 struts 2框架基础 80 第6章 struts 2高级应用 110 第7章 struts 2中应用模板语言 145 第8章 hibernate框架基础 173 第9章 hibernate查询 188 第10章 hibernate性能优化 208 ...

Global site tag (gtag.js) - Google Analytics