Pom.xml
数据库使用mysql,连接池使用c3p0
<!-- 添加c3p0 dataSource 连接池 --> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency> <!-- mysql的数据库驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version> </dependency> <!-- spring的数据库jdbc连接 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.0.6.RELEASE</version> </dependency>使用连接池 连接 数据库,则许向Spring容器中注入DataSource
@Bean public DataSource dataSource() throws PropertyVetoException { //c3p0提供的数据库连接池的实现类 ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setUser("root"); dataSource.setPassword("root"); dataSource.setDriverClass("com.mysql.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test"); return dataSource; }使用spring提供的JdbcTemplate来操作数据库,则许向Spring容器中注入JdbcTemplate
@Bean public JdbcTemplate jdbcTemplate() throws PropertyVetoException { return new JdbcTemplate(dataSource()); }启用事务管理器,只有表明了此注解,事务才可以生效
@Configuration @ComponentScan(value = {"com.lb.spring.day6.part19"}) @EnableTransactionManagement public class MyConfigration19 { }当在代码中只使用了注解@EnableTransactionManagement 和 @Transactional时,会报错缺少PlatformTransactionManager
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.transaction.PlatformTransactionManager' available at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:347) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:334) at org.springframework.transaction.interceptor.TransactionAspectSupport.determineTransactionManager(TransactionAspectSupport.java:394) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:284) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688) at com.lb.spring.day6.part19.service.PersonService$$EnhancerBySpringCGLIB$$dc956731.insert(<generated>) at day6.Part19Test.test(Part19Test.java:13)则必须需要配置事务管理器
//注册事务管理器 @Bean public PlatformTransactionManager platformTransactionManager() throws PropertyVetoException{ return new DataSourceTransactionManager(dataSource()); }通过配置以下三项,则事务即可生效
@EnableTransactionManagement @TransactionalPlatformTransactionManagerDemo:
执行前:
@Configuration @ComponentScan(value = {"com.lb.spring.day6.part19"}) @EnableTransactionManagement public class MyConfigration19 { @Bean public DataSource dataSource() throws PropertyVetoException { //c3p0提供的数据库连接池的实现类 ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setUser("root"); dataSource.setPassword("root"); dataSource.setDriverClass("com.mysql.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test"); return dataSource; } @Bean public JdbcTemplate jdbcTemplate() throws PropertyVetoException { return new JdbcTemplate(dataSource()); } @Bean public PlatformTransactionManager transactionManager() throws PropertyVetoException { return new DataSourceTransactionManager(dataSource()); } } @Repository public class PersonDao { @Autowired private JdbcTemplate jdbcTemplate; public void insert(){ String sql = "insert into person_test(name,birthday) values(?,?)"; jdbcTemplate.update(sql,"lb",new Date()); } } @Service public class PersonService { @Autowired private PersonDao personDao; @Transactional public void insert(){ personDao.insert(); System.out.println("插入完成.................."); int a = 1/0; } } public class Part19Test { @Test public void test() throws Exception { AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(MyConfigration19.class); PersonService personService = app.getBean(PersonService.class); personService.insert(); app.close(); } }结果:因为事务中报错,则rollback未插入成功
插入完成.................. java.lang.ArithmeticException: / by zero