spring boot集成 mysql、sqlserver、oracle多数据源

应用场景:业务系统开发中,经常会遇到链接多数据源等情况

本文实现:实现链接mysql,oracle,sqlserver,可同时对3中数据源操作

项目目录如下

config目录下,在项目启动时加载不同的数据库sqlSessionFactory

controller目录下,正常的调用接口

dao目录下,分别为对具体的数据库访问方法,为了区分不同数据库,这里分了mysql、sqlserver、oracle目录,分别对mysql、sql server、oracle数据库操作

service目录下,正常的业务处理

resource下mybatis目录分别对3中数据库具体操作

config下mysql配置类

package com.liufan.mutildatasource.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

//表示这个类为一个配置类
@Configuration
// 配置mybatis的接口类放的地方
@MapperScan(basePackages = "com.liufan.mutildatasource.dao.mysql", sqlSessionFactoryRef = "mysqlSqlSessionFactory")
public class MysqlConfig {
    // 将这个对象放入Spring容器中
    @Bean(name = "mysqlDataSource")
    // 读取application.yml 中的配置参数映射成为一个对象
    // prefix表示参数的前缀
    @ConfigurationProperties(prefix = "spring.datasource.mysql")
    public DataSource getDateSource1() {
        return DataSourceBuilder.create().build();
    }
    @Bean(name = "mysqlSqlSessionFactory")
    // @Qualifier表示查找Spring容器中名字为mysqlDataSource的对象
    public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource datasource)
            throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(datasource);
        bean.setMapperLocations(
                // 设置mybatis的xml所在位置
                new PathMatchingResourcePatternResolver().getResources("classpath*:mybatis/mysql/*.xml"));
        return bean.getObject();
    }
    @Bean("mysqlSqlSessionTemplate")
    // 表示这个数据源是默认数据源
    @Primary
    public SqlSessionTemplate mysqlsqlsessiontemplate(
            @Qualifier("mysqlSqlSessionFactory") SqlSessionFactory sessionfactory) {
        return new SqlSessionTemplate(sessionfactory);
    }
}

sql server配置类

package com.liufan.mutildatasource.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

//表示这个类为一个配置类
@Configuration
// 配置mybatis的接口类放的地方
@MapperScan(basePackages = "com.liufan.mutildatasource.dao.sqlserver", sqlSessionFactoryRef = "sqlserverSqlSessionFactory")
public class SqlServerConfig {
    // 将这个对象放入Spring容器中
    @Bean(name = "sqlserverDataSource")
    // 表示这个数据源是默认数据源
    @Primary
    // 读取application.yml 中的配置参数映射成为一个对象
    // prefix表示参数的前缀
    @ConfigurationProperties(prefix = "spring.datasource.sqlserver")
    public DataSource getDateSource1() {
        return DataSourceBuilder.create().build();
    }
    @Bean(name = "sqlserverSqlSessionFactory")
    // 表示这个数据源是默认数据源
    @Primary
    // @Qualifier表示查找Spring容器中名字为sqlserverDataSource的对象
    public SqlSessionFactory sqlserverSqlSessionFactory(@Qualifier("sqlserverDataSource") DataSource datasource)
            throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(datasource);
        bean.setMapperLocations(
                // 设置mybatis的xml所在位置
                new PathMatchingResourcePatternResolver().getResources("classpath*:mybatis/sqlserver/*.xml"));
        return bean.getObject();
    }
    @Bean("sqlserverSqlSessionTemplate")
    public SqlSessionTemplate sqlserversqlsessiontemplate(
            @Qualifier("sqlserverSqlSessionFactory") SqlSessionFactory sessionfactory) {
        return new SqlSessionTemplate(sessionfactory);
    }
}

oracle配置类

package com.liufan.mutildatasource.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

//表示这个类为一个配置类
@Configuration
// 配置mybatis的接口类放的地方
@MapperScan(basePackages = "com.liufan.mutildatasource.dao.oracle", sqlSessionFactoryRef = "oracleSqlSessionFactory")
public class OracleConfig {
    // 将这个对象放入Spring容器中
    @Bean(name = "oracleDataSource")
    // 读取application.yml 中的配置参数映射成为一个对象
    // prefix表示参数的前缀
    @ConfigurationProperties(prefix = "spring.datasource.oracle")
    public DataSource getDateSource1() {
        return DataSourceBuilder.create().build();
    }
    @Bean(name = "oracleSqlSessionFactory")
    // @Qualifier表示查找Spring容器中名字为oracleDataSource的对象
    public SqlSessionFactory oracleSqlSessionFactory(@Qualifier("oracleDataSource") DataSource datasource)
            throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(datasource);
        bean.setMapperLocations(
                // 设置mybatis的xml所在位置
                new PathMatchingResourcePatternResolver().getResources("classpath*:mybatis/oracle/*.xml"));
        return bean.getObject();
    }
    @Bean("oracleSqlSessionTemplate")
    public SqlSessionTemplate oraclesqlsessiontemplate(
            @Qualifier("oracleSqlSessionFactory") SqlSessionFactory sessionfactory) {
        return new SqlSessionTemplate(sessionfactory);
    }
}

application.yml内容配置多种数据源,datasource下sqlserver、mysql、oracle分别代表定义数据库别名,可自定义名称,但是必须和上面配置类寻找路径相同

server:
  port: 8080

### 数据配置
spring:
  datasource:
    sqlserver:
      jdbc-url: jdbc:sqlserver://192.168.0.208:1433;database=aaaa;
      username: aaa
      password: aaa
      driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    oracle:
      jdbc-url: jdbc:oracle:thin:@192.168.0.209:1521/orcl
      username: aaa
      password: aaa
      driver-class-name: oracle.jdbc.driver.OracleDriver
    mysql:
      jdbc-url: jdbc:mysql://192.168.0.125:3306/tspsdb?useUnicode=true&characterEncoding=utf8
      username: aaa
      password: aaa
      driver-class-name: com.mysql.jdbc.Driver

pom.xml文件如下,oracle和sqlserver采用本地引入方式

<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.oracle.ojdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.66</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>sqljdbc4</artifactId>
            <version>4.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/sqljdbc4-4.0.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.2</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/ojdbc-6.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>cn.easyproject</groupId>
            <artifactId>orai18n</artifactId>
            <version>12.1.0.2.0</version>
        </dependency>


    </dependencies>


    <!-- 阿里云仓库 -->
    <repositories><!-- 代码库 -->
        <repository>
            <id>maven-ali</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public//</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>always</updatePolicy>
                <checksumPolicy>fail</checksumPolicy>
            </snapshots>
        </repository>
    </repositories>

注意点:xml文件命名空间对应到具体dao下具体类

启动项目,通过controller中方法访问,输出如下图内容,controller和service就不贴代码了,

代码地址:https://github.com/liufan1993/multipleDataSources

 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在使用 Linkis 数据中间件连接多个数据源时,需要进行分库分表操作。下面是一个使用 Spring Boot 框架编写的查询数据的示例: 1. 首先,需要在 pom.xml 文件中添加 Linkis 数据中间件的依赖: ```xml <dependency> <groupId>com.webank.wedatasphere.linkis</groupId> <artifactId>wedatasphere-linkis-datasource</artifactId> <version>0.9.0-release</version> </dependency> ``` 2. 然后,在 application.properties 文件中配置数据源信息: ```properties # MySQL 数据源配置 spring.datasource.url=jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # Oracle 数据源配置 oracle.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl oracle.datasource.username=root oracle.datasource.password=root oracle.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver ``` 3. 接下来,创建一个 DAO 层的接口,用于定义查询方法: ```java public interface UserDao { @Select("SELECT * FROM user WHERE id = #{id}") User findById(@Param("id") Long id); } ``` 4. 然后,创建 DAO 的实现类,并在其中注入 Linkis 的数据源: ```java @Repository public class UserDaoImpl implements UserDao { @Autowired private DataSource dataSource; @Override public User findById(Long id) { try (Connection connection = dataSource.getConnection()) { // 根据 ID 查询用户信息 PreparedStatement statement = connection.prepareStatement("SELECT * FROM user WHERE id = ?"); statement.setLong(1, id); ResultSet resultSet = statement.executeQuery(); if (resultSet.next()) { User user = new User(); user.setId(resultSet.getLong("id")); user.setName(resultSet.getString("name")); return user; } } catch (Exception e) { e.printStackTrace(); } return null; } } ``` 5. 最后,在 Controller 层中调用 DAO 的方法: ```java @RestController public class UserController { @Autowired private UserDao userDao; @GetMapping("/users/{id}") public User getUser(@PathVariable Long id) { return userDao.findById(id); } } ``` 通过以上步骤,我们就可以使用 Linkis 数据中间件连接多个数据源,并实现分库分表操作。具体来说,可以通过在 SQL 语句中使用不同的表前缀来指定不同的数据库和表,从而实现分库分表。例如,使用 `db1.user` 来查询 MySQL 数据库中的用户表,使用 `db2.user` 来查询 Oracle 数据库中的用户表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值