文章目录
1. Spring事务管理、以及JDBC管理
1.0 Spring的JDBC帮我们做了什么
1.1 使用到的Spring类、以及事务属性设置
配置在<tx:method>节点上
配置在@Transactional() 注解上
1.2 XML配置事务
<context:component-scan base-package="top.linruchang"></context:component-scan>
<!-- 读取配置文件 -->
<context:property-placeholder location="classpath:mySQL.properties" system-properties-mode="NEVER"/>
<!-- 将配置文件的数据读取DataSource对象中 -->
<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${driverClassName}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${username}"></property>
<property name="password" value="${password}"></property>
</bean>
<!-- 事务管理对象 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" ></property>
</bean>
<!-- 事务处理 ~ 具体对什么方法进行增强-->
<tx:advice id="managerAdvice" transaction-manager="transactionManager" >
<tx:attributes>
<tx:method name="find*" read-only="true" />
<tx:method name="get*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<!-- 绑定切面、切入点 -->
<aop:config>
<aop:pointcut expression="execution(public * top.linruchang.service.*.*(..))" id="pointcut1"/>
<aop:advisor advice-ref="managerAdvice" pointcut-ref="pointcut1"/>
</aop:config>
EmpDao
@Component
public class EmpDao4 extends JdbcDaoSupport {
JdbcTemplate jdbcTemplate;
@Autowired
public void setMyDataSource(DataSource dataSource) {
System.out.println("dataSource" + dataSource);
setDataSource(dataSource);
jdbcTemplate = getJdbcTemplate();
}
// 将数据库的数据转为 Bean对象
public Emp2 getEmp(int empno) {
String SQL = "select * from emp where empno = ?";
Emp2 emp = jdbcTemplate.queryForObject(SQL, new RowMapper<Emp2>() {
@Override
public Emp2 mapRow(ResultSet arg0, int arg1) throws SQLException {
Emp2 emp = new Emp2();
emp.setEmpno(arg0.getInt("empno"));
emp.setEname(arg0.getString("ename"));
emp.setSalay(arg0.getInt("salary"));
return emp;
}
}, empno);
return emp;
}
// 执行DML语句
public Integer updateMoney(int empno, int money) {
String SQL = "update emp set salary=salary+? where empno = ?";
int result = jdbcTemplate.update(SQL, money, empno);
return result;
}
}
EmpService
@Component
public class EmpService4 {
@Autowired
EmpDao4 empDao;
public void transfer(int empno1, int empno2, int money) {
updateMoney(empno1, -money);
int a = 1/0;
updateMoney(empno2, money);
}
}
测试代码
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value="classpath:applicationContext.xml")
public class XMLTest {
@Autowired
EmpService4 empService4;
@Test
public void tes4() {
empService4.transfer(1, 2, 200);
}
}
运行时,发生异常,不过数据回滚,没有发生变化
1.3 注解配置事务
XML必要的配置
<context:component-scan base-package="top.linruchang"></context:component-scan>
<!-- 读取配置文件 -->
<context:property-placeholder location="classpath:mySQL.properties" system-properties-mode="NEVER"/>
<!-- 将配置文件的数据读取DataSource对象中 -->
<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${driverClassName}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${username}"></property>
<property name="password" value="${password}"></property>
</bean>
<!-- 事务管理对象 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" ></property>
</bean>
<!-- 事务注解需要哪一个事务管理对象进行处理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
在上面XML的代码基础上,在EmpService添加两个注解就可以了