Spring对事务的封装

发表时间:2017-07-18 18:25:09 浏览量( 55 ) 留言数( 0 )


学习目标:

1、了解Java的历史

2、为什么要学习Java语言

3、端正学习态度


学习过程:

可能我们大部分情况下都不一定会使用AOP技术,因为想日志这些一般也不会使用AOP方式,毕竟日志要求都是比较细粒度的,而使用AOP事实上很难实现,但是像数据库事务管理,却非常使用使用事务,因为所有的数据库操作最好都能提供事务管理,这节课我们就讲讲AOP最重要的一个应用,管理事务。

这节课我们需要建立两张表,同时往这两张表里面插入数据,并且有一个可能插入失败,大家应该知道如果没有事务管理,那么有可能一张表插入失败,而另一张表插入成功,如果使用了事务管理,这个操作必须作为一个整体,要么都成功,要么都失败。

先建立上面两张表。

DROP TABLE IF EXISTS `department`;
CREATE TABLE `department` (
  `dep_id` int(11) NOT NULL AUTO_INCREMENT,
  `dep_name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`dep_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;



DROP TABLE IF EXISTS `post`;
CREATE TABLE `post` (
  `post_id` int(11) NOT NULL AUTO_INCREMENT,
  `post_name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`post_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

分别实现dao的方法

DepartmentDaoImpl实现:

public class DepartmentDaoImpl implements DepartmentDao {
	private JdbcTemplate jdbcTemplate;
	public void add(Department department) {
		jdbcTemplate.update("insert into department(dep_name)  values(?)",
				new Object[] { department.getDepName() });
	}
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
}

PostDaoImpl实现:

public class PostDaoImpl implements PostDao{
	private JdbcTemplate jdbcTemplate;
	public void add(Post post) {
		jdbcTemplate.update("insert into post(post_name)  values(?)",
				new Object[] { post.getPostName() });
		
	}
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

}


一般事务都是建立在业务逻辑层,所以这里我们还需要一层就是biz层,事务就是针对这一层的了。代码如下:

public class HumanBizImpl implements HumanBiz {
	
	private PostDao postDao;
	private DepartmentDao departmentDao;
        //一次添加两条数据
	public void addPostAndDepartment(Post post, Department department) {				
		postDao.add(post);
		departmentDao.add(department);
	}

	public void setPostDao(PostDao postDao) {
		this.postDao = postDao;
	}

	public void setDepartmentDao(DepartmentDao departmentDao) {
		this.departmentDao = departmentDao;
	}
	
	

}

现在没有事务管理,你可以尝试一下失败

public class RunTx {
	
	public static void main(String[] args) {
		ApplicationContext context=new FileSystemXmlApplicationContext("src/applicationContext.xml");
		
		Post post=new Post();
		Department department=new Department();
		
		post.setPostName("项目总经理");
		department.setDepName("软件开发部是对方是否斯蒂芬斯蒂芬斯蒂芬斯蒂芬斯蒂芬斯蒂芬斯蒂芬斯蒂芬第三方");
		
		HumanBiz humanBiz=(HumanBiz)context.getBean("humanBiz");
		
		humanBiz.addPostAndDepartment(post, department);
		
	}

}

不需要修改任何java源代码了,我们配置事务,只需要修改spring的配置文件就可以了。代码如下:

	<!-- 建立一个连接组件 -->
	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
		<property name="url" value="jdbc:mysql://localhost:3306/spring"></property>
		<property name="username" value="root"></property>
		<property name="password" value="123456"></property>
	</bean>

	<!-- 对数据源进行事务管理 -->
	<bean id="txManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>

	<!-- -->
	<!-- 什么情况下需要用到这个事务 -->
	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<!-- all methods starting with 'get' are read-only -->
			<tx:method name="get*" read-only="true" />
			<tx:method name="query*" read-only="true" />
			<!-- other methods use the default transaction settings (see below) -->
			<tx:method name="add*" propagation="REQUIRED" />
			<tx:method name="update*" propagation="REQUIRED" />
			<tx:method name="del*" propagation="REQUIRED" />
		</tx:attributes>
	</tx:advice>

	<!-- 定义切入点 建议针对业务逻辑 -->
	<aop:config>
		<aop:pointcut id="bizOperation" expression="execution(* com.biz.*.*(..))" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="bizOperation" />
	</aop:config>


	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>

	<!-- 切面 -->
	<bean name="aspectAdvice" class="com.advice.AspectAdvice"></bean>

	<!-- 核心业务逻辑 -->
	<bean name="loginBiz" class="com.biz.impl.LoginBizImpl"></bean>

	<bean name="humanBiz" class="com.biz.impl.HumanBizImpl">
		<property name="postDao" ref="postDao"></property>
		<property name="departmentDao" ref="departmentDao"></property>
	</bean>

	<bean name="departmentDao" class="com.dao.impl.DepartmentDaoImpl">
		<property name="jdbcTemplate" ref="jdbcTemplate"></property>
	</bean>

	<bean name="postDao" class="com.dao.impl.PostDaoImpl">
		<property name="jdbcTemplate" ref="jdbcTemplate"></property>
	</bean>

现在所有的biz层的方法的所有的dao层都会使用事务,而对程序员而言不需要专门编写显示的代码就可以使用事务了,现在你可以再测试上面的代码,就会发现都会添加失败,也就是


二、使用全注解的方式实现AOP

	<!-- 使用全注释事务 -->
	<tx:annotation-driven transaction-manager="transactionManager" />