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

本文介绍了一个基于SpringBoot实现的多数据源配置案例,并详细展示了如何配置Druid连接池、MyBatis以及JTA分布式事务来管理多个数据库资源。此外,还提供了项目源码地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

转载于:https://my.oschina.net/liuchangng/blog/1545413

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值