【Spring】在Spring框架下使用注解配置JDBC事务

算是对Spring的一个阶段性总结吧,注解、依赖注入、JDBC、事务等重点基本都涉及到了,值得记录一下。


首先是最重要的xml配置文件。虽然使用了注解方式,不过还是需要在XML中设置一些东西。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	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:annotation-config/> -->
	<!-- 下面component-scan 包含了上述annotation-config的功能,故可以不加 -->
	
	<!-- 启用Spring自动扫描 -->
	<context:component-scan base-package="niit.spring"/>
	
	<!-- 获取配置文件 -->
	<context:property-placeholder location="classpath:jdbc.properties" />

	<!-- 1.配置JDBC数据源,数据从上配置文件获取 -->
	<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}" />
	</bean>
	
	<!-- 2.配置JDBC模板 -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<!-- 注入数据源 -->
		<property name="dataSource" ref="dataSource" />
	</bean>
	
	<!-- 3.配置JDBC事务管理器 -->
	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<!-- 注入数据源 -->
		<property name="dataSource" ref="dataSource"/>
	</bean>
	
	<!-- 4.采用@Transaction注解方式使用事务 -->
	<tx:annotation-driven transaction-manager="txManager"/>
</beans>





其中JDBC连接信息使用了properties格式的配置文件,与xml一起放置在src目录下。


然后就是Dao层实现类:

package niit.spring.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import niit.spring.dao.EmployeeDao;
import niit.spring.model.EmployeePO;

//Repository用于标注Dao层组件
@Repository("employeeDao")
public class EmployeeDaoImpl implements EmployeeDao{
	
	@Resource
	private JdbcTemplate jdbcTemplate;//声明JDBC模板
	
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate){
		this.jdbcTemplate = jdbcTemplate;
	}
	
	@Override
	public void insert(EmployeePO po) {
		// TODO Auto-generated method stub
		jdbcTemplate.update(
				"insert into emp values(?,?,?)",	//SQL语句
				new Object[]{po.getEid(), po.getEname(), po.getEsal()},	//查询参数数组
				new int[]{java.sql.Types.INTEGER, java.sql.Types.VARCHAR, java.sql.Types.DOUBLE});	//查询参数SQL数据类型数组
	}

	@Override
	public List<EmployeePO> queryAll() {
		// 值得一提的是,JDBCTemplate提供的query()方法返回一个对象数组,而queryForObject()则会返回单个对象,
		// 无论使用哪一种,EmployeeRowMapper对象都同样new一次即可,JDBCTemplate会自动按照需要进行单次或多次调用mapRow().
		return jdbcTemplate.query("select * from emp", new EmployeeRowMapper()); 
	}
	
	//内部类,实现了RowMapper接口以方便进行重用
	private class EmployeeRowMapper implements RowMapper<EmployeePO>{

		@Override
		public EmployeePO mapRow(ResultSet arg0, int arg1) throws SQLException {
			// TODO Auto-generated method stub
			EmployeePO po = new EmployeePO();
			po.setEid(arg0.getInt("eid"));
			po.setEname(arg0.getString("ename"));
			po.setEsal(arg0.getDouble("esal"));
			return po;
		}
		
	}

}

Service层实现类。事务便是在本层使用

package niit.spring.service.impl;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import niit.spring.dao.EmployeeDao;
import niit.spring.model.EmployeePO;
import niit.spring.service.EmployeeService;

@Service("employeeService")
@Transactional(readOnly=true)//注解方式设置事务、在类的级别上设置只读事务
public class EmployeeServiceImpl implements EmployeeService{

	@Resource
	private EmployeeDao employeeDao;
	
	public void setEmployeeDao(EmployeeDao employeeDao){
		this.employeeDao = employeeDao;
	}
	
	@Override//声明事务方法,事务方法注解优先级高于类注解,设置属性会覆盖类注解。propagation设置该方法需要在事务条件下运行;isolation设置事务隔离级别为默认
	@Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.DEFAULT)
	public void add(EmployeePO po) {
		
		employeeDao.insert(po);
		//int i = 1/0;	//事务测试
	}

	@Override//NOT_SUPPORTED声明该方法不需要事务,若该方法在一个事务中被调用,则事务会被暂时挂起直至该方法运行结束
	@Transactional(propagation=Propagation.NOT_SUPPORTED)
	public List<EmployeePO> getAll() {

		return employeeDao.queryAll();
	}

}

测试类就不贴了。初始化Spring容器调用Serviece对象即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值