Spring boot 了解(五)(配置多数据源)

版权声明:转载的话 请标明出处 https://blog.csdn.net/qq_28198181/article/details/85245789

一个项目里面访问多个数据库的操作,记录如下:

(学习地址:https://www.majiaxueyuan.com/front/couinfo/36

目录

1.application.properties文件配置

2.创建Configure

3.创建mapper

4.运行访问


1.application.properties文件配置

因为是访问多个数据库 所以需要多个数据库信息,在application.properties中去配置两个数据库访问的路径

我的如下:

spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/learnboot1?characterEncoding=utf-8
spring.datasource.primary.username=root
spring.datasource.primary.password=123456
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/learnboot?characterEncoding=utf-8
spring.datasource.secondary.username=root
spring.datasource.secondary.password=123456
spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver

这样的话会产生applicaion.properties配置文件就可以了

2.创建Configure

这个是去配置每个数据库的配置类

扫描二维码关注公众号,回复: 4650454 查看本文章

需要这四个方法:

 public DataSource dataSource() {}
 public SqlSessionFactory SqlSessionFactory(){}
 public DataSourceTransactionManager dataSourceTransactionManager(){}
 public SqlSessionTemplate sqlSessionTemplate(){}


/*
这四个方法的作用如下:

创建数据源Datasource指定使用的哪个数据源配置,并将其注入到SqlSessionFactory 会话工厂;
创建事务TransactionManager,需把数据源注入;
把SqlSessionFactory 注入,创建sqlSessionTemplate模板,使用模板操作mapper接口;
把模板放到mapper 路径下,并 @MapperScan注解 声明mapper接口位置;
*/

第一个DataSource()方法是用于去获取一个数据源,

第二个SqlSessionFactory()是将datasource放入到会话工厂

第三个是创建一个事务的管理,也是将datasource注入进去

第四个是个模版,去操作Mapper接口

我的configure类的编写具体如下:

1,创建类,并且需要将@configure注解和mapper扫描路径写进去

@Configuration  //注解这个是一个Configure

//MapperScan mapper的扫描路径的配置
//basePackages mapper的扫描路径 
//sqlSessionTemplateRef 需要套用的模版
@MapperScan(basePackages = "com.zqj.mutildatasource.mapper", sqlSessionTemplateRef = "primarySqlSessionTemplate")  

public class PriamryDataSourceConfigure {

1.dataSource(){}

2.SqlSessoinFactory(){}

3.DataSourceTransactionManager(){}

4.SqlSessionTemplate(){}

}

接下来是去配置剩下的东西

2,创建dataSource方法,配置需要链接哪个数据库(我这里展示的是主库的配置类代码,还有一个库的配置代码和主库基本一致,除了没有@Primary注解 和 配置的名字不一致,方法都一样)

.....
public class PriamryDataSourceConfigure {
 //主库

    //datasource(){}

    @Bean(name = "primaryDataSource")    //配置属性为primaryDataSource
   
    //这个是application.properties中配置的数据库属性的前缀,区分使用哪个数据源库
    @ConfigurationProperties(prefix = "spring.datasource.primary")   
    @Primary   //这个是设置为主库,必须有一个库是主库
    public DataSource primaryDataSource() {
        System.out.println("-------------------- primaryDataSource init ---------------------");
        return DataSourceBuilder.create().build();  //返回生成好的数据库源
    }

........

}

3,配置SqlSessionFactory的会话工厂

public class PriamryDataSourceConfigure{


//sqlSessoinFactory(){}

@Bean(name = "primarySqlSessionFactory") //设置属性,
    @Primary  //主库
    public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception { //@Qualifier根据名字注入属性,放置刚刚创建的datasource 

        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);//放置刚刚创建的datasource
        return bean.getObject(); 返回得到的SqlSessionFactory对象
    }

}

4,配置事务的管理的一个方法


public class PriamryDataSourceConfigure {


   //trascationManage(){}

 @Bean(name = "primaryTrascationManager")  //配置属性
    @Primary  //主库用的
    public DataSourceTransactionManager primarydataSourceTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {  //注入datasource
        return new DataSourceTransactionManager(dataSource); 
    }

}

5,创建模版,用于操作mapper

 
//tempate(){}

  @Bean(name = "primarySqlSessionTemplate")
    @Primary
    public SqlSessionTemplate primarysqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {

        SqlSessionTemplate sqlSessionTemplate =  new SqlSessionTemplate(sqlSessionFactory);

        return sqlSessionTemplate;
    }

这个配置主库的连接的配置类就写好了,去扫描com.zqj.mutildatasource.mapper这个路径下的mapper接口。让mapper里的sql语句去访问

spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/learnboot1

这个learnboot1数据库里的表

主类配置的完整信息。

@Configuration
@MapperScan(basePackages = "com.zqj.mutildatasource.mapper", sqlSessionTemplateRef = "primarySqlSessionTemplate")
public class PriamryDataSourceConfigure {

    //主库

    @Bean(name = "primaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    @Primary
    public DataSource primaryDataSource() {
        System.out.println("-------------------- primaryDataSource init ---------------------");
        return DataSourceBuilder.create().build();
    }


    @Bean(name = "primarySqlSessionFactory")
    @Primary
    public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }

    @Bean(name = "primaryTrascationManager")
    @Primary
    public DataSourceTransactionManager primarydataSourceTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
        return new DataSourceTransactionManager(dataSource);
    }


    @Bean(name = "primarySqlSessionTemplate")
    @Primary
    public SqlSessionTemplate primarysqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {

        SqlSessionTemplate sqlSessionTemplate =  new SqlSessionTemplate(sqlSessionFactory);

        return sqlSessionTemplate;
    }

还有一个非主库的数据库,也要写一个一样的配置类,不过需要修改的是扫描的mapper包路径和连接的数据库地址。

完整类如下:

@Configuration
@MapperScan(basePackages = "com.zqj.mutildatasource.mapper1", sqlSessionTemplateRef = "secondarySqlSessionTemplate")

public class SecondaryDataSourceConfigure {

    //非主库

    @Bean("secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        System.out.println("-------------------- secondaryDataSource init ---------------------");
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondarySqlSessionFactory")
    public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return  bean.getObject();
       
    }


    @Bean(name = "secondaryTrascationManager")
    public DataSourceTransactionManager secondarydataSourceTransactionManager(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {
        return new DataSourceTransactionManager(dataSource);
    }


    @Bean(name = "secondarySqlSessionTemplate")
    public SqlSessionTemplate secondarysqlSessionTemplate(@Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {

        SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);

        return sqlSessionTemplate;
    }


}

注意没有@Primary

3.创建mapper

这里因为我写了两个配置类,按理说就有两个mapper包

如下:

第一个mapper包是去访问主库的连接

第二个mapper包是去访问非主库的数据库的连接

然后创建mapper

(随便写一个访问数据库的方法)

比如我的:mapper包下Usermapper

@Mapper
@Component
public interface UserMapper {

    @Select("select * from users where id = #{id}")
    User findUserById(@Param("id") Integer id);

}

mapper对应的连接的数据库的表数据有:

mapper1包下的OrderMapper接口的方法:

@Mapper
public interface Ordermapper {

    @Select("select * from orders where id = #{id}")
    Order getOrderById(@Param("id") Integer id);

}

对应的数据库里的orders表数据有:

 

4.运行访问

创建一个Controller

去放加载两个mapper然后返回一个json串到页面

@RestController
public class UserController {


    @Autowired
    UserMapper userMapper;
    
    @Autowired
    Ordermapper ordermapper;

    @RequestMapping("/user1")  //访问user表的 主库
    public Object getUser1() {
        return userMapper.findUserById(1);
    }

    @RequestMapping("order2")  //访问order表的 非主库
    public Object getOrder() {
        return ordermapper.getOrderById(1);
    }

}

运行,访问

(可以看看大佬写的关于那几个属性的讲解:http://www.pianshen.com/article/3415102997/)

以上。

猜你喜欢

转载自blog.csdn.net/qq_28198181/article/details/85245789