一步一步搭建springboot+mybatis+jta框架

0. 項目目錄一覽圖:

這裏寫圖片描述

1. 導入項目需要的jar包,如下:
<dependencies>

        <!--fastjson json庫-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>
        <!-- Apache工具組件 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>${commons-lang3.version}</version>
        </dependency>
        <dependency>
            <groupId>com.xiaoleilu</groupId>
            <artifactId>hutool-all</artifactId>
            <version>${hutool-all.version}</version>
        </dependency>
        <!--lombok jar-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--springmvc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--數據庫操作 start-->
        <!--使用mysql數據庫,導入mysql驅動-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--使用阿里的Druid連接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <!-- mybatis start -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis-spring-boot-starter.version}</version>
        </dependency>
        <!--分佈式事務支持-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jta-atomikos</artifactId>
        </dependency>
        <!--數據庫操作 end-->

        <!--使用actuator監控spring boot各種指標,需要打開指標對應的開關-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

    </dependencies>
2. 配置數據源屬性文件(這裏配置兩個,分別爲car,test)
# car數據源配置
spring.datasource.car.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.car.driverClassName=com.mysql.jdbc.Driver
spring.datasource.car.url=jdbc:mysql://ip:3306/db_electric_car?useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.car.username=root
spring.datasource.car.password=123456
spring.datasource.car.initialSize=5
spring.datasource.car.minIdle=5
spring.datasource.car.maxActive=20
spring.datasource.car.maxWait=60000
spring.datasource.car.timeBetweenEvictionRunsMillis=60000
spring.datasource.car.minEvictableIdleTimeMillis=300000
spring.datasource.car.validationQuery=SELECT 1 FROM DUAL
spring.datasource.car.testWhileIdle=true
spring.datasource.car.testOnBorrow=false
spring.datasource.car.testOnReturn=false
spring.datasource.car.poolPreparedStatements=true
spring.datasource.car.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.car.filters=stat,wall,log4j
spring.datasource.car.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

# test數據源配置
spring.datasource.test.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.test.driverClassName=com.mysql.jdbc.Driver
spring.datasource.test.url=jdbc:mysql://ip:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.test.username=root
spring.datasource.test.password=123456
spring.datasource.test.initialSize=5
spring.datasource.test.minIdle=5
spring.datasource.test.maxActive=20
spring.datasource.test.maxWait=60000
spring.datasource.test.timeBetweenEvictionRunsMillis=60000
spring.datasource.test.minEvictableIdleTimeMillis=300000
spring.datasource.test.validationQuery=SELECT 1 FROM DUAL
spring.datasource.test.testWhileIdle=true
spring.datasource.test.testOnBorrow=false
spring.datasource.test.testOnReturn=false
spring.datasource.test.poolPreparedStatements=true
spring.datasource.test.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.test.filters=stat,wall,log4j
spring.datasource.test.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
3. 將數據源配置映射到對象中
  • car屬性
    @Component //自動注入
    @ConfigurationProperties(prefix = "spring.datasource.car")
    @Data // lombok註解,生成getter/setter等方法
    public class DataSourceCarProperties {
        private String type;
        private String driverClassName;
        private String url;
        private String username;
        private String password;
        private int initialSize;
        private int minIdle;
        private int maxActive;
        private int maxWait;
        private int timeBetweenEvictionRunsMillis;
        private int minEvictableIdleTimeMillis;
        private String validationQuery;
        private boolean testWhileIdle;
        private boolean testOnBorrow;
        private boolean testOnReturn;
        private boolean poolPreparedStatements;
        private int maxPoolPreparedStatementPerConnectionSize;
        private String filters;
        private String connectionProperties;
    }
  • test屬性

        @Component //自動注入
        @ConfigurationProperties(prefix = "spring.datasource.test")
        @Data
        public class DataSourceTestProperties {
            private String type;
            private String driverClassName;
            private String url;
            private String username;
            private String password;
            private int initialSize;
            private int minIdle;
            private int maxActive;
            private int maxWait;
            private int timeBetweenEvictionRunsMillis;
            private int minEvictableIdleTimeMillis;
            private String validationQuery;
            private boolean testWhileIdle;
            private boolean testOnBorrow;
            private boolean testOnReturn;
            private boolean poolPreparedStatements;
            private int maxPoolPreparedStatementPerConnectionSize;
            private String filters;
            private String connectionProperties;
    } 
4. 配置數據源,代碼如下:
  • car配置
    @Configuration
    @MapperScan(basePackages = {"com.lcj.web.mapper.car*"}, sqlSessionTemplateRef = "sqlSessionTemplateCar") // 掃描dao或mapper接口
    public class DataSourceCarConfig {

        @Primary
        @Bean(name = "dataSourceCar")
        public DataSource dataSourceCar(DataSourceCarProperties dataSourceCarProperties){
            DruidXADataSource dataSource = new DruidXADataSource();
            BeanUtils.copyProperties(dataSourceCarProperties,dataSource);
            AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
            xaDataSource.setXaDataSource(dataSource);
            xaDataSource.setUniqueResourceName("dataSourceCar");
            return xaDataSource;
        }


        @Bean(name = "sqlSessionFactoryCar")
        public SqlSessionFactory sqlSessionFactoryCar(@Qualifier("dataSourceCar") DataSource dataSource)
                throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            bean.setTypeAliasesPackage("com.lcj.web.entity.car");
            //bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/car/*Mapper.xml"));
            return bean.getObject();
        }

        @Bean(name = "sqlSessionTemplateCar")
        public SqlSessionTemplate sqlSessionTemplateCar(
                @Qualifier("sqlSessionFactoryCar") SqlSessionFactory sqlSessionFactory) throws Exception {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    }
  • test配置
@Configuration
@MapperScan(basePackages = {"com.lcj.web.mapper.test*"}, sqlSessionTemplateRef = "sqlSessionTemplateTest") // 掃描dao或mapper接口
public class DataSourceTestConfig {


    @Bean(name = "dataSourceTest")
    public DataSource dataSourceTest(DataSourceTestProperties dataSourceTestProperties){
        DruidXADataSource dataSource = new DruidXADataSource();
        BeanUtils.copyProperties(dataSourceTestProperties,dataSource);
        AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
        xaDataSource.setXaDataSource(dataSource);
        xaDataSource.setUniqueResourceName("dataSourceTest");
        return xaDataSource;
    }

    @Bean(name = "sqlSessionFactoryTest")
    public SqlSessionFactory sqlSessionFactoryTest(@Qualifier("dataSourceTest") DataSource dataSource)
            throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setTypeAliasesPackage("com.lcj.web.entity.test");
        //bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/test/*Mapper.xml"));
        return bean.getObject();
    }

    @Bean(name = "sqlSessionTemplateTest")
    public SqlSessionTemplate sqlSessionTemplateTest(
            @Qualifier("sqlSessionFactoryTest") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
5. 配置分佈式事務,代碼如下:
@Configuration
@EnableTransactionManagement
public class XATransactionManagerConfig {

    @Bean(name = "userTransaction")
    public UserTransaction userTransaction() throws Throwable {
        UserTransactionImp userTransactionImp = new UserTransactionImp();
        userTransactionImp.setTransactionTimeout(10000);
        return userTransactionImp;
    }

    @Bean(name = "atomikosTransactionManager", initMethod = "init", destroyMethod = "close")
    public TransactionManager atomikosTransactionManager() throws Throwable {
        UserTransactionManager userTransactionManager = new UserTransactionManager();
        userTransactionManager.setForceShutdown(false);
        return userTransactionManager;
    }

    @Bean(name = "transactionManager")
    @DependsOn({ "userTransaction", "atomikosTransactionManager" })
    public PlatformTransactionManager transactionManager() throws Throwable {
        return new JtaTransactionManager(userTransaction(),atomikosTransactionManager());
    }

}
6. 整個項目使用到的技術如下:
  1. spring boot 1.5.6
  2. mybatis
  3. mysql
  4. druid連接池
  5. jta分佈式事務
  6. lombok
7. 數據庫文件放在entity目錄下,其他問題請聯繫我.
8. 項目源碼地址: https://gitee.com/liuchangng/springboot-mybatis-jta
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章