Spring学习笔记(17)----使用Spring注解方式管理事务

使用Spring+JDBC集成步骤如下:

 *配置数据源,例如:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
		    <property name="url" value="jdbc:mysql://localhost:3306/test"/>
		    <property name="username" value="root"/>
		    <property name="password" value="123456"/>
			<!-- 连接池启动时的初始值 -->
			<property name="initialSize" value="1"/>
			<!-- 连接池的最大值 -->
			<property name="maxActive" value="100"/>
			<!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
			<property name="maxIdle" value="2"/>
			<!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
			<property name="minIdle" value="1"/>
	 	</bean>

 *配置事务,配置事务时,需要在xml配置文件中引入用于声明事务的tx命名空间,事务的配置有两种方式:注解方式和基于XML配置的方式

 

下面演示下使用Spring注解方式管理事务

首先在配置文件中配置Spring提供的事务管理器

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  	   		<!-- 指定数据源 -->
  	   		<property name="dataSource" ref="dataSource"/>
    	</bean>

 由于会使用注解方式,因此我们要打开注解处理器,对注解进行解析

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

 

这样我们的配置文件配置完成,下面我们在Mysql中建立一张表,

create table users
(                   
 id int(11) not null auto_increment,  
 username varchar(20) not null,       
 primary key (id)                   
) 

 

根据数据库,我们创建javabean

package com.szy.spring.bean;
/**
 * @author  coolszy
 * @time    Dec 6, 2009 2:13:33 PM
 */
public class User
{
	private int id;
	private String username;
	public int getId()
	{
		return id;
	}
	public void setId(int id)
	{
		this.id = id;
	}
	public String getUsername()
	{
		return username;
	}
	public void setUsername(String username)
	{
		this.username = username;
	}
}	

 

然后创建DAO接口,在DAO中提供几个方法:

package com.szy.spring.dao;

import java.util.List;

import com.szy.spring.bean.User;

public interface UserDAO
{
	public void save(User user);
	public void update(User user);
	Public User  getUser(int id);
	public void delete(int id);
	public List<User> getAllUsers();
}	

 

实现这个接口

 

package com.szy.spring.dao.impl;

import java.util.List;

import com.szy.spring.bean.User;
import com.szy.spring.service.UserService;

/**
 * @author  coolszy
 * @time    Dec 6, 2009 2:19:22 PM
 */
public class UserDAOImpl implements UserDAO
{

	public void delete(int id)
	{

	}

	public List<User> getAllUsers()
	{
		return null;
	}

	public User getUser(int id)
	{

	}

	public void save(User user)
	{

	}

	public void update(User user)
	{

	}

}	

 

下面把这个类交给Spring管理

<bean id="userDAO" class="com.szy.spring.dao.impl.UserDAOImpl"/>	

 由于要通过数据源对表进行操作,因此在DAO中添加数据源。

private DataSource dataSource;

	public void setDataSource(DataSource dataSource)
	{
		this.dataSource = dataSource;
	}	

 

然后在配置文件中进行配置

<bean id="userDAO" class="com.szy.spring.service.impl.UserDAOImpl">
			<property name="dataSource" ref="dataSource"/>
		</bean>	

 

这样我们就把数据源注入到类中。

在UserDAOImpl类中我们提供了dataSource,这样我们就可以对数据库进行操作,但是不推荐直接使用dataSource,建议使用JdbcTemplate

private JdbcTemplate jdbcTemplate;
	public void setDataSource(DataSource dataSource)
	{
		//this.dataSource = dataSource;
		this.jdbcTemplate=new JdbcTemplate(dataSource);
	}	

 下面我们使用jdbcTemplate对数据库进行增删改查,详细代码见附件。

package com.szy.spring.dao.impl;

import java.util.List;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;

import com.szy.spring.bean.User;
import com.szy.spring.dao.UserDAO;

/**
 * @author  coolszy
 * @time    Dec 6, 2009 2:19:22 PM
 */
public class UserDAOImpl implements UserDAO
{
	//private DataSource dataSource;
	private JdbcTemplate jdbcTemplate;
	public void setDataSource(DataSource dataSource)
	{
		//this.dataSource = dataSource;
		this.jdbcTemplate=new JdbcTemplate(dataSource);
	}

	public void delete(int id)
	{
		jdbcTemplate.update("delete from users where id=?", new Object[]{id},
				new int[]{java.sql.Types.INTEGER});
	}

	public List<User> getAllUsers()
	{
		return (List<User>)jdbcTemplate.query("select * from users", new UserRowMapper());
	}

	public User getUser(int id)
	{
		return (User)jdbcTemplate.queryForObject("select * from users where id=?", new Object[]{id}, 
				new int[]{java.sql.Types.INTEGER}, new UserRowMapper());

	}

	public void save(User user)
	{ 
		jdbcTemplate.update("insert into users(username) values(?)", new Object[]{user.getUsername()},
				new int[]{java.sql.Types.VARCHAR});

	}

	public void update(User user)
	{
		jdbcTemplate.update("update users set username=? where id=?", new Object[]{user.getUsername(),user.getId()},
				new int[]{java.sql.Types.VARCHAR, java.sql.Types.INTEGER});

	}

}	

 编写测试代码,代码运行正常。

在我们实现的每个方法中如delete()方法,如果delete方法是这样

public void delete(int id)
	{
		jdbcTemplate.update("delete from users where id=?", new Object[]{id},
				new int[]{java.sql.Types.INTEGER});
jdbcTemplate.update("delete from users where id=?", new Object[]{id},
				new int[]{java.sql.Types.INTEGER});

	}
	

 这样每条语句都会在各自的事务中执行,并不能保证在同一使用中执行,为了保证在同一事务中执行,我们应使用Spring容器提供的声明事务,我们在UserDAOImpl 类上加入@Transactional,表示该类受Spring事务管理。如果该类中每个方法不需要事务管理,如getUser方法,则在该方法前加入

@Transactional(propagation=Propagation.NOT_SUPPORTED)

 

 

PS:在上面的配置文件中我们在配置文件中指明了驱动类等信息,如果我们想写在配置文件中要怎么配置能,首先我们编写配置文件,

driverClassName=com.mysql.jdbc.Driver
url=jdbc\:mysql\://localhost\:3306/test
username=root
password=123456
initialSize=1
maxActive=100
maxIdle=2
minIdle=1	

 然后Spring的配置文件需进行如下配置:

<context:property-placeholder location="classpath:jdbc.properties"/>
		<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		    <property name="driverClassName" value="${driverClassName}"/>
		    <property name="url" value="${url}"/>
		    <property name="username" value="${username}"/>
		    <property name="password" value="${password}"/>
			<property name="initialSize" value="${initialSize}"/>
			<property name="maxActive" value="${maxActive}"/>
			<property name="maxIdle" value="${maxIdle}"/>
			<property name="minIdle" value="${minIdle}"/>
	 	</bean>	

  这样就可以从属性文件中读取到配置信息。

 

你可能感兴趣的:(DAO,spring,mysql,bean,配置管理)