欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解SpringBoot和Mybatis配置多数据源

程序员文章站 2024-02-19 13:37:16
目前业界操作数据库的框架一般是 mybatis,但在很多业务场景下,我们需要在一个工程里配置多个数据源来实现业务逻辑。在springboot中也可以实现多数据源并配合myb...

目前业界操作数据库的框架一般是 mybatis,但在很多业务场景下,我们需要在一个工程里配置多个数据源来实现业务逻辑。在springboot中也可以实现多数据源并配合mybatis框架编写xml文件来执行sql。在springboot中,配置多数据源的方式十分便捷,

下面开始上代码:

在pom.xml文件中需要添加一些依赖

<!-- spring boot mybatis 依赖 -->
<dependency>
 <groupid>org.mybatis.spring.boot</groupid>
 <artifactid>mybatis-spring-boot-starter</artifactid>
 <version>1.2.0</version>
</dependency>

<!-- mysql 连接驱动依赖 -->
<dependency>
 <groupid>mysql</groupid>
 <artifactid>mysql-connector-java</artifactid>
 <version>5.1.39</version>
</dependency>

<!-- druid 数据连接池依赖 -->
<dependency>
 <groupid>com.alibaba</groupid>
 <artifactid>druid</artifactid>
 <version>1.0.18</version>
</dependency>

application.properties 配置两个数据源配置

# master 数据源配置
master.datasource.url=jdbc:mysql://localhost:3306/springbootdb?useunicode=true&characterencoding=utf8
master.datasource.username=root
master.datasource.password=xieshuai6666
master.datasource.driverclassname=com.mysql.jdbc.driver

# second 数据源配置
second.datasource.url=jdbc:mysql://localhost:3306/springbootdb_second?useunicode=true&characterencoding=utf8
second.datasource.username=root
second.datasource.password=xieshuai6666
second.datasource.driverclassname=com.mysql.jdbc.driver

数据源配置

多数据源配置的时候注意,必须要有一个主数据源,即 masterdatasourceconfig 配置

  1. @primary 标志这个 bean 如果在多个同类 bean 候选时,该 bean 优先被考虑。「多数据源配置的时候注意,必须要有一个主数据源,用 @primary 标志该 bean
  2. @mapperscan 扫描 mapper 接口并容器管理,包路径精确到 master,为了和下面 cluster 数据源做到精确区分
  3. @value 获取全局配置文件 application.properties 的 kv 配置,并自动装配sqlsessionfactoryref 表示定义了 key ,表示一个唯一 sqlsessionfactory 实例

masterdatasourceconfig的代码:

@configuration
// 扫描 mapper 接口并容器管理
@mapperscan(basepackages = masterdatasourceconfig.package, sqlsessionfactoryref = "mastersqlsessionfactory")
public class masterdatasourceconfig {

  // 精确到 master 目录,以便跟其他数据源隔离
  static final string package = "org.spring.springboot.dao.master";
  static final string mapper_location = "classpath:mapper/master/*.xml";

  @value("${master.datasource.url}")
  private string url;

  @value("${master.datasource.username}")
  private string user;

  @value("${master.datasource.password}")
  private string password;

  @value("${master.datasource.driverclassname}")
  private string driverclass;

  @bean(name = "masterdatasource")
  @primary
  public datasource masterdatasource() {
    druiddatasource datasource = new druiddatasource();
    datasource.setdriverclassname(driverclass);
    datasource.seturl(url);
    datasource.setusername(user);
    datasource.setpassword(password);
    return datasource;
  }

  @bean(name = "mastertransactionmanager")
  @primary
  public datasourcetransactionmanager mastertransactionmanager() {
    return new datasourcetransactionmanager(masterdatasource());
  }

  @bean(name = "mastersqlsessionfactory")
  @primary
  public sqlsessionfactory mastersqlsessionfactory(@qualifier("masterdatasource") datasource masterdatasource)
      throws exception {
    final sqlsessionfactorybean sessionfactory = new sqlsessionfactorybean();
    sessionfactory.setdatasource(masterdatasource);
    sessionfactory.setmapperlocations(new pathmatchingresourcepatternresolver()
        .getresources(masterdatasourceconfig.mapper_location));
    return sessionfactory.getobject();
  }
}

第二个数据源seconddatasourceconfig的配置如下:

@configuration
// 扫描 mapper 接口并容器管理
@mapperscan(basepackages = clusterdatasourceconfig.package, sqlsessionfactoryref = "clustersqlsessionfactory")
public class clusterdatasourceconfig {

  // 精确到 cluster 目录,以便跟其他数据源隔离
  static final string package = "org.spring.springboot.dao.cluster";
  static final string mapper_location = "classpath:mapper/cluster/*.xml";

  @value("${cluster.datasource.url}")
  private string url;

  @value("${cluster.datasource.username}")
  private string user;

  @value("${cluster.datasource.password}")
  private string password;

  @value("${cluster.datasource.driverclassname}")
  private string driverclass;

  @bean(name = "clusterdatasource")
  public datasource clusterdatasource() {
    druiddatasource datasource = new druiddatasource();
    datasource.setdriverclassname(driverclass);
    datasource.seturl(url);
    datasource.setusername(user);
    datasource.setpassword(password);
    return datasource;
  }

  @bean(name = "clustertransactionmanager")
  public datasourcetransactionmanager clustertransactionmanager() {
    return new datasourcetransactionmanager(clusterdatasource());
  }

  @bean(name = "clustersqlsessionfactory")
  public sqlsessionfactory clustersqlsessionfactory(@qualifier("clusterdatasource") datasource clusterdatasource)
      throws exception {
    final sqlsessionfactorybean sessionfactory = new sqlsessionfactorybean();
    sessionfactory.setdatasource(clusterdatasource);
    sessionfactory.setmapperlocations(new pathmatchingresourcepatternresolver()
        .getresources(clusterdatasourceconfig.mapper_location));
    return sessionfactory.getobject();
  }
}

到此,不同的数据源配置就已经完成,剩下的只需要将将mybatis的xml文件和dao层的接口写好,并在service层注入,直接使用就行。

service层的代码:

@service
public class userandcityserviceimpl implements userandcityservice{

  @autowired
  private userdao userdao;
  @autowired
  private citydao citydao;

  @override
  public uservo getuser(string username) {
    uservo uservo = userdao.selectbyusername(username);
    cityvo cityvo = citydao.selectbycityname("北京市");
    uservo.setdescription(cityvo.getcityname());
    return uservo;
  }
}

mybatis的xml文件userdao.xml和citydao.xml的内容,就不一一展示了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。