1注解方式
模拟lucy向marry转钱的过程
1在配置文件中创建事务管理器
<!--先引入名称变量context再写下面的代码-->
<!--组件扫描进行对象创建和属性注入-->
<context:component-scan base-package="com.spring"></context:component-scan>
<--数据库连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destory-method="close">
<property name="url" value="jdbc:mysql:///user_db"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
</bean>
<!--正常连接数据库的代码是
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/scdb?characterEncoding=utf8";
String name="root";
String pwd="123456";
Connection con=DriverManager.getConnection(url,name,pwd);
String sql="delete from stin where sno="+sno;
PreparedStatement ps=(PreparedStatement) con.prepareStatement(sql);
ps.executeUpdate();
con.close();
JdbcTemplate是spring对JDBC的封装,目的是使JDBC更加易于使用。它帮助我们避免一些常见的错误,比如忘了关闭连接。使用JdbcTemplate需要DruidDataSource连接池,还需要导入一些jar包
-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--创建事务管理器-->
<bean id="transaction" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--先引入名称空间tx再写下面的代码-->
<!--开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager"><tx:annotation-driven>
2在service类上面或者方法上面添加事务注解
@Component//创建该类的对象
public class UserService{
@AutoWired//根据属性类型进行注入
private UserDao userDao;
@Transactional//可以添加到方法上也可以添加到类上
//如果添加到类上,该类的所有方法都加上了事务
public void accountMoney(){
userDao.reduceMoney();
userDao.addMoney();
}
}
@Component
public class UserDao{
@AutoWired
private JdbcTemplate jdbcTemplate;
public void addMoney(){
String sql="update account set money=money+? where username=?";
jdbcTemplate.update(sql,100,"marry");
}
public void reduceMoney(){
String sql="update account set money=money-? where username=?";
jdbcTemplate.update(sql,100,"lucy");
}
}
2xml方式
<!--组件扫描-->
<context:component-scan base-package="com.spring"></context:component-scan>
<--数据库连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destory-method="close">
<property name="url" value="jdbc:mysql:///user_db"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--创建事务管理器-->
<bean id="transaction" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置通知(加强)-->
<tx:advice id="txadvice"><!--事务通知-->
<tx:attributes><!--事务属性-->
<!--在符合name规则的方法上面配置事务通知.propagation是事务的传播属性-->
<tx:method name="accountMoney" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<--配置切入点和切面-->
<aop:config>
<!--配置切入点(要对哪些方法进性加强)-->
<aop:pointcut id="pt" expression="execution(* com.spring.UserService.*(..))"/>
<!--配置切面-->
<aop:advisor advice-ref="txadvice" pointcut-ref="pt"/>
</aop:config>
3完全注解方式
配置类
@Configuration//代表该类是一个配置类
@ComponentScan(basePackages="com.spring")//开启组件扫描,将符合条件的组件加入到IOC容器中
@EnableTransactionManagement//开启事务
//创建一个配置类
public class Txconfig{
//创建数据库连接池
@Bean
public DruidDataSource getDruidDataSource(){
DruidDataSource dataSource=new DruidDataSource();
dataSource.setDriverClassName("");
dataSource.setUrl("");
dataSource.setUserame("");
dataSource.setPassword("");
return dataSource;
}
//
@Bean
public JdbcTemplate setJdbcTemplate(DataSource da){
JdbcTemplate jd=new JdbcTemplate();
jd.setDataSource(da);
return jd;
}
//创建事务管理器
@Bean
public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource){
DataSourceTransactionManager da=new DataSourceTransactionManager();
da.setDataSource(dataSource);
return da;
}
}
测试类
public class Test{
@Test
public void test(){
ApplicationContext con=new AnnotationConfigApplicationContext(Txconfig.class);
UserService user=con.getBean("userService",UserService.class);
user.accountMoney();
}
}