Spring学习5 - Spring事务管理、以及JDBC管理

47 阅读1分钟

文章目录

1. Spring事务管理、以及JDBC管理

1.0 Spring的JDBC帮我们做了什么

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sgZ8VHcG-1577063820065)(en-resource://database/14128:1)]

1.1 使用到的Spring类、以及事务属性设置

  配置在<tx:method>节点上
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4wBlzrQr-1577063820082)(en-resource://database/14122:1)]

  配置在@Transactional() 注解上
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7BaKko9P-1577063820086)(en-resource://database/14124:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QHLf95j2-1577063820095)(en-resource://database/14126:1)]

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);
	}
		
}

  运行时,发生异常,不过数据回滚,没有发生变化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pVsAquXZ-1577063820097)(en-resource://database/14118:1)]

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添加两个注解就可以了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kCKSdYt7-1577063820100)(en-resource://database/14120:1)]