Springboot + Mybatis,数据库多数据源配置项目Demo【源码下载】

640?wx_fmt=jpeg

由于要做复杂的数据迁移,直接  Mysql  数据库中用  sql  做迁移,难度太大,  SQL  操作起来很复杂,而且也不现实。

为了可以让同学们可以直接使用,在  Springboot  结合  Mybatis  同时加入了我以往的  Freemarker  ,作为View层渲染。

一、Springboot + Mybatis 多数据源配置



1.Springboot.yml配置文件

server:
 port9281


#spring:
#  profiles:
#    active: dev

#数据库1
datasource1:
 urljdbc:mysql://localhost:3306/ios666_history?useSSL=false&useUnicode=true
 username: root
 password:
 driver-class-name: com.mysql.jdbc.Driver

#数据库2
datasource2:
 urljdbc:mysql://localhost:3306/av8d?useSSL=false&useUnicode=true
 username: root
 password:
 driver-class-name: com.mysql.jdbc.Driver

2.SpringbootApplication 禁止加载自身对DataSource的扫描

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class DatasourceApplication {

 public static void main(String[] args) {

   SpringApplication.run(DatasourceApplication.class, args);

 }

}

3.DataSourceConfig 对 Springboot.yml 读取

@Configuration
public class DataSourceConfig {

   @Bean(name = "dbOneDataSource")
   @Primary
   @ConfigurationProperties(prefix = "datasource1"// application.yml 中对应属性的前缀
   public DataSource dbOneDataSource() {
       return DataSourceBuilder.create().build();
   }


   @Bean(name = "dbTwoDataSource")
   @ConfigurationProperties(prefix = "datasource2"// application.yml 中对应属性的前缀
   public DataSource dbTwoDataSource() {
       return DataSourceBuilder.create().build();
   }

}


这里创建了2个Bean,由dbOneDataSource 和 dbTwoDataSource 读取并创建数据源。

二、数据源的创建 

如果有多个就直接创建多个,下面说说 SqlSessionFactory && SqlSessionTemplate 创建 。为了方便管理,我用内部类去解决。

@Slf4j
public class MybatisConfig {

   /**
    * 第一个数据库 SqlSessionFactory && SqlSessionTemplate 创建
    */


   @Configuration
   @MapperScan(basePackages = {"com.sojson.datasource.one.mapper"},
           sqlSessionFactoryRef = "sqlSessionFactoryOne",
           sqlSessionTemplateRef = "sqlSessionTemplateOne")
   public static  class DBOne{
       @Resource
       DataSource dbOneDataSource;



       @Bean
       public SqlSessionFactory sqlSessionFactoryOne() throws Exception {
           log.info("sqlSessionFactoryOne 创建成功。");
           SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();

           factoryBean.setDataSource(dbOneDataSource);

           factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/one/*.xml"));
           return factoryBean.getObject();
       }


       @Bean
       public SqlSessionTemplate sqlSessionTemplateOne() throws Exception {
           SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactoryOne()); // 使用上面配置的Factory
           return template;

       }

   }


   /**
    * 第二个数据库 SqlSessionFactory && SqlSessionTemplate 创建
    */


   @Configuration
   @MapperScan(basePackages = {"com.sojson.datasource.two.mapper"},
           sqlSessionFactoryRef = "sqlSessionFactoryTwo",
           sqlSessionTemplateRef ="sqlSessionTemplateTwo" )
   public static class DBTwo{

       @Resource
       DataSource dbTwoDataSource;



       @Bean
       public SqlSessionFactory sqlSessionFactoryTwo() throws Exception {

           log.info("sqlSessionFactoryTwo 创建成功。");
           SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
           factoryBean.setDataSource(dbTwoDataSource);


           factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/two/*.xml"));

           return factoryBean.getObject();

       }


       @Bean
       public SqlSessionTemplate sqlSessionTemplateTwo() throws Exception {
           SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactoryTwo()); // 使用上面配置的Factory
           return template;
       }

   }

}


这里要详细说明的一下,因为创建了2套的SqlSessionFactory && SqlSessionTemplate,那怎么来区分或者说怎么分配数据源呢?

通过注释 :basePackages = {"com.sojson.datasource.one.mapper"}来定义第一个数据源 SqlSessionFactory 的mapper目录。

通过注释 :basePackages = {"com.sojson.datasource.two.mapper"}来定义第二个数据源 SqlSessionFactory 的mapper目录。

三、多数据源测试

@RequestMapping("api")
@RestController
public class IndexController {

   @Autowired
   OneStockMapper oneStockMapper;
   @Autowired
   TwoStockMapper twoStockMapper;

   @RequestMapping("")

   public Map<String,Object> index(){

       Map<String,Object> result = new HashMap<>();
       //第一个数据源
       Stock entity = oneStockMapper.selectByPrimaryKey(1);

       //第二个数据查询
       Stock twoEntity = twoStockMapper.selectByPrimaryKey(1);
       result.put("entity",entity);
       result.put("twoEntity",twoEntity);
       return result;

   }

}

代码已经开源提交到gitee上,地址为:https://gitee.com/jsonla/sojson.datasource.git


扩展阅读

MyBatis拦截器原理探究

Spring+MyBatis多数据源配置实现(实操型)

Spring Boot 自动配置的 “魔法” 是如何实现的?


来源:https://www.sojson.com/blog/301.html

文章来源网络,版权归作者本人所有,如侵犯到原作者权益,请与我们联系删除

640?wx_fmt=jpeg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先,为了使用多数据和分布式事务,我们需要添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.6</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jta-atomikos</artifactId> </dependency> ``` 接下来,我们需要在application.properties文件中配置数据和事务管理器: ```properties # 配置数据 spring.datasource.url=jdbc:mysql://localhost:3306/main_db?characterEncoding=utf8&useSSL=false spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver # 配置数据 spring.datasource.slave.url=jdbc:mysql://localhost:3306/slave_db?characterEncoding=utf8&useSSL=false spring.datasource.slave.username=root spring.datasource.slave.password=root spring.datasource.slave.driver-class-name=com.mysql.jdbc.Driver # 配置Mybatis mybatis.mapper-locations=classpath:mapper/*.xml mybatis.type-aliases-package=com.example.entity # 配置Druid数据 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.druid.initial-size=1 spring.datasource.druid.max-active=10 spring.datasource.druid.min-idle=1 spring.datasource.druid.max-wait=60000 spring.datasource.druid.time-between-eviction-runs-millis=60000 spring.datasource.druid.min-evictable-idle-time-millis=300000 spring.datasource.druid.test-while-idle=true spring.datasource.druid.test-on-borrow=false spring.datasource.druid.test-on-return=false spring.datasource.druid.filters=stat,wall,log4j spring.datasource.druid.connection-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 配置事务管理器 spring.transaction.default-timeout=600 spring.transaction.rollback-on-commit-failure=true spring.transaction.allow-bean-definition-overriding=true spring.transaction.jta.registry-name=atomikos spring.jta.enabled=true spring.jta.atomikos.connectionfactory.min-pool-size=5 spring.jta.atomikos.connectionfactory.max-pool-size=10 spring.jta.atomikos.connectionfactory.borrow-connection-timeout=30 spring.jta.atomikos.connectionfactory.max-idle-time=60 spring.jta.atomikos.connectionfactory.concurrency-level=100 ``` 然后,我们需要创建两个数据配置类,分别为主数据和从数据: ```java @Configuration @MapperScan(basePackages = "com.example.mapper.main", sqlSessionTemplateRef = "mainSqlSessionTemplate") public class MainDataSourceConfig { @Bean(name = "mainDataSource") @ConfigurationProperties(prefix = "spring.datasource") public DataSource mainDataSource() { return DruidDataSourceBuilder.create().build(); } @Bean(name = "mainSqlSessionFactory") public SqlSessionFactory mainSqlSessionFactory(@Qualifier("mainDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/main/*.xml")); return bean.getObject(); } @Bean(name = "mainTransactionManager") public DataSourceTransactionManager mainTransactionManager(@Qualifier("mainDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "mainSqlSessionTemplate") public SqlSessionTemplate mainSqlSessionTemplate(@Qualifier("mainSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } } ``` ```java @Configuration @MapperScan(basePackages = "com.example.mapper.slave", sqlSessionTemplateRef = "slaveSqlSessionTemplate") public class SlaveDataSourceConfig { @Bean(name = "slaveDataSource") @ConfigurationProperties(prefix = "spring.datasource.slave") public DataSource slaveDataSource() { return DruidDataSourceBuilder.create().build(); } @Bean(name = "slaveSqlSessionFactory") public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/slave/*.xml")); return bean.getObject(); } @Bean(name = "slaveTransactionManager") public DataSourceTransactionManager slaveTransactionManager(@Qualifier("slaveDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "slaveSqlSessionTemplate") public SqlSessionTemplate slaveSqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } } ``` 最后,我们需要在事务管理器上添加注解@EnableTransactionManagement,并在需要使用事务的方法上添加注解@Transactional: ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Transactional(rollbackFor = Exception.class, transactionManager = "mainTransactionManager") @Override public void save(User user) { userMapper.insert(user); } @Transactional(rollbackFor = Exception.class, transactionManager = "slaveTransactionManager") @Override public User findById(int id) { return userMapper.selectByPrimaryKey(id); } } ``` 以上就是使用SpringBoot+Mybatis+druid多数据和分布式事务的基本步骤。 ### 回答2: Spring Boot是一个用于构建独立的、生产级的应用程序的框架。它简化了应用程序的开发过程,并通过自动配置来减少了繁琐的配置MyBatis是一个ORM(对象关系映射)框架,它提供了将数据库操作映射到Java对象的功能。Druid是一种高性能的数据库连接池。 要在Spring Boot中使用MyBatis和Druid进行多数据配置和分布式事务管理,可以按照以下步骤进行操作: 1. 添加依赖:在项目的pom.xml文件中,添加Spring Boot、MyBatis和Druid的依赖。 2. 配置数据:在application.properties文件中,配置并命名多个数据,设置数据库连接等信息。 3. 创建数据配置类:创建一个配置类,使用@Configuration注解将其标记为配置类,并使用@ConfigurationProperties注解将数据属性注入。 4. 创建数据:根据配置类中的属性,创建多个数据,并将其加入到数据路由器中。 5. 配置MyBatis:创建一个配置类,使用@MapperScan注解设置MyBatis的mapper接口路径,并将数据注入到SqlSessionFactory中。 6. 配置分布式事务:使用@EnableTransactionManagement注解启用事务管理,并配置事务管理器。 7. 编写数据库操作代码:在mapper接口中定义数据库操作方法,并在Service层中调用这些方法进行数据库操作。 通过以上步骤,你就可以在Spring Boot项目中完成MyBatis和Druid的多数据配置和分布式事务管理。不过需要注意的是,使用多数据和分布式事务会增加项目的复杂性和性能开销,所以在使用之前需要仔细考虑是否真正需要这些功能。 ### 回答3: Spring Boot是一种快速构建Java应用程序的框架,MyBatis是一种流行的Java持久化框架,Druid是一种高性能的数据库连接池。本文将介绍如何在Spring Boot中使用MyBatis和Druid来实现多数据和分布式事务。 要使用多个数据,我们首先需要配置多个数据。在Spring Boot中,我们可以通过在application.properties或者application.yml文件中配置多个数据的连接信息。我们需要为每个数据指定不同的URL、用户名和密码。然后,我们可以使用@Primary和@Qualifier来指定主数据和其他数据。 在配置数据后,我们需要配置MyBatis来使用这些数据。我们可以通过创建多个SqlSessionFactory来实现多数据,然后在每个SqlSessionFactory中设置相应的数据。我们还可以使用@MapperScan注解来自动扫描和注册Mapper接口。 在使用MyBatis和多个数据时,我们可能会遇到事务管理的问题。为了解决这个问题,我们可以使用Spring Boot提供的@Transactional注解来标记需要进行事务管理的方法,然后Spring Boot会自动为我们处理事务。对于需要跨多个数据进行事务管理的情况,我们可以使用JTA(Java Transaction API)实现分布式事务。在Spring Boot中,我们可以使用Atomikos或Bitronix等JTA提供商来实现分布式事务。 总结起来,使用Spring Boot、MyBatis和Druid,我们可以很容易地实现多数据和分布式事务。通过正确配置数据和使用相关注解,我们可以在几分钟内完成这些任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值