zoukankan      html  css  js  c++  java
  • Spring注解

    环境搭建

    1. 导入maven依赖
    <!--spring提供的数据库操作工具-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
    <!--c3p0 数据库连接池-->
    <dependency>
        <groupId>com.mchange</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.5.5</version>
    </dependency>
    <!--mysql连接器-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.48</version>
    </dependency>
    
    1. 配置数据库相关信息
    @Configuration
    @ComponentScan("com.spring.tx")
    public class TxConfig {
        /**
         * 配置数据源
         */
        @Bean
        public DataSource dataSource() throws PropertyVetoException {
            ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
            comboPooledDataSource.setUser("root");
            comboPooledDataSource.setPassword("root");
            comboPooledDataSource.setDriverClass("com.mysql.jdbc.Driver");
            comboPooledDataSource.setJdbcUrl("jdbc:mysql:///test");
            return comboPooledDataSource;
        }
    
        @Bean
        public JdbcTemplate jdbcTemplate() throws PropertyVetoException {
            //Spring对配置类做了特殊处理,多次调用给容器中加组件的方法,其实是从容器中找组件,并不会重新添加
            return new JdbcTemplate(dataSource());
        }
    }
    
    1. 添加数据访问层、业务层
    @Repository
    public class UserDao {
        @Autowired
        private JdbcTemplate jdbcTemplate;
    
        public void saveUser(String name, Integer age) {
            String sql = "insert into user(name, age) values(?, ?)";
            jdbcTemplate.update(sql, name, age);
        }
    }
    
    @Service
    public class UserService {
        @Autowired
        private UserDao userDao;
    
        public void saveUser(){
            String name = "jack11";
            Integer age = 19;
            userDao.saveUser(name, age);
        }
    }
    
    1. 添加测试类
    public class TxTest {
        @Test
        public void test(){
            ApplicationContext context = new AnnotationConfigApplicationContext(TxConfig.class);
            UserService userService = (UserService) context.getBean("userService");
            userService.saveUser();
        }
    }
    

    事务问题

    此时基本环境已经搭建好了,点击运行,数据可以成功插入但是还没有配置事务,没有事务回滚会造成某些情况下数据出错。在Spring注解中,可以在需要添加事务的方法或类上加@Transactional,并且开启事务管理功能,即@EnableTransactionManagement,代码如下:

    1. 修改UserService 的 saveUser 方法
    @Transactional
    public void saveUser(){
        String name = "jack11";
        Integer age = 19;
        userDao.saveUser(name, age);
        //模拟异常
        int i = 1 / 0;
    }
    
    1. 在配置类加上@EnableTransactionManagement
    @Configuration
    @ComponentScan("com.spring.tx")
    @EnableTransactionManagement
    public class TxConfig {
    	//省略数据源、jdbcTemplate的配置
    }
    

    再次运行测试方法,会发现报错了,但不是我们模拟的异常报错,控制台提示找不到bean

    org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.transaction.PlatformTransactionManager' available
    

    我们还需要注册一个事务管理器来管理事务,PlatformTransactionManager有很多实现类,在Spring 中 JdbcTemplate、Mybatis应该使用 DataSourceTransactionManager

    在配置类中再注册一个组件,运行,事务生效

    /**
     * 注册事务管理器
     */
    @Bean
    public PlatformTransactionManager platformTransactionManager() throws PropertyVetoException {
        return new DataSourceTransactionManager(dataSource());
    }
    
  • 相关阅读:
    JAVA多线程实现的三种方式
    Java String charAt()方法
    三大数据库分页方法
    SSH框架 spring 配置中的: scope="prototype"
    SSH中的Invalid action class configuration that references an unknown class named.......
    String类中toCharArray()方法的用法
    SQL Server中DateTime与DateTime2的区别
    Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例
    Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例
    哈希表及处理冲突的方法
  • 原文地址:https://www.cnblogs.com/songjilong/p/12541697.html
Copyright © 2011-2022 走看看