Controller控制层代码
package springTransaction.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import springTransaction.service.UserService;
@Controller
@Transactional //指定这个类可以受Spring事务管理了
public class UserController {
@Autowired //类型
private UserService userService;
public void test() {
String saveSql = "insert into user_info values(?,?,?,?,?)";
String deleteSql = "delete from user_info";
Object[] param = {"3","王五","789","m",30};
//不能加try catch,加了之后异常被try{}捕捉到,那么事务管理器就无法再捕捉异常,所以就无法做出反应,事务不回滚
//删除表中所有的数据
userService.delete(deleteSql, null);
//插入两条主键重复的数据
userService.save(saveSql, param);
userService.save(saveSql, param);
}
}
在controller层中,添加了@Transactional //指定这个类可以受Spring事务管理了。如果违反事务的四大特性,将会发生回滚事件,保证事务的原子性。
dao层的代码实例
package springTransaction.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@Repository("userDao")
public class UserDao {
@Autowired //默认按照类型进行自动装配
private JdbcTemplate jdbcTemplate;
// @Override
public int save(String sql, Object[] param) {
return jdbcTemplate.update(sql, param);
}
// @Override
public int delete(String sql, Object[] param) {
return jdbcTemplate.update(sql, param);
}
}
@Repository(“userDao”)此注解用在和数据库的处理上。
service层的代码示例
package springTransaction.service;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import springTransaction.dao.UserDao;
@Service(value="userService")//受spring Ioc容器管理
public class UserService {
@Resource //名称
private UserDao userDao;
public int save(String sql, Object[] param) {
return userDao.save(sql, param);
}
public int delete(String sql, Object[] param) {
return userDao.delete(sql, param);
}
}
最主要的是XML文件中的配置
下面的这个扫描哪个包下面的注解。<context:component-scan base-package>
<!-- 注解支持 -->
<context:component-scan base-package="springTransaction"></context:component-scan>
为了不把Spring中的数据源不要写死。
<!-- 引入属性文件 -->
<context:property-placeholder location="springTransaction/dbInfo.properties"/>
~~~~
~~~xml
<!-- 数据源配置信息 c3p0 需要mysql-connector-java 5.1.8和c3p0 0.9.1.2这两个jar-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${driverClass}"/>
<property name="jdbcUrl" value="${jdbcUrl}"/>
<property name="user" value="${user}"/>
<property name="password" value="${password}"/>
<!-- <property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/>
<property name="user" value="root"/>
<property name="password" value="root"/> -->
</bean>
为数据源添加事务管理
<!-- 为数据源添加事务管理器 -->
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
添加事务注解支持
<!-- 加载事务注解支持 -->
<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>