千家信息网

springboot 中怎么利用mybatis 配置多数据源

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,今天就跟大家聊聊有关springboot 中怎么利用mybatis 配置多数据源,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、项目启动成功
千家信息网最后更新 2024年09月22日springboot 中怎么利用mybatis 配置多数据源

今天就跟大家聊聊有关springboot 中怎么利用mybatis 配置多数据源,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

一、项目启动成功后创建bean的方式

pom.xml

   com.alibaba   druid-spring-boot-starter   1.1.10  com.ojdbc  ojdbc  10.2.0.1  system  ${project.basedir}/src/main/lib/ojdbc14-10.2.0.1.0.jar   mysql  mysql-connector-java  5.1.38

application.properties

#oracle数据库spring.datasource.master.url=jdbc:oracle:thin:@localhost:1521:testspring.datasource.master.username=oraclespring.datasource.master.password=123456spring.datasource.master.driverClassName=oracle.jdbc.OracleDriverspring.datasource.master.initialSize=5spring.datasource.master.maxActive=15spring.datasource.master.minIdle=5spring.datasource.master.poolPreparedStatements=truespring.datasource.master.validationQuery=SELECT 1 FROM DUAL#配置执行多条sql比如:批量处理#对应的错误:sql injection violation, multi-statement not allowspring.datasource.master.wall.multiStatementAllow=true#配置执行特殊sql比如sql server的创建临时表(declare)语句#对应的错误:sql injection violation, class com.alibaba.druid.sql.ast.statement.SQLDeclareStatement not allowspring.datasource.master.wall.noneBaseStatementAllow=true#mysql数据库spring.datasource.slave.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8spring.datasource.slave.username=mysqlspring.datasource.slave.password=123456spring.datasource.slave.driverClassName=com.mysql.cj.jdbc.Driverspring.datasource.slave.initialSize=5spring.datasource.slave.maxActive=15spring.datasource.slave.minIdle=5spring.datasource.slave.poolPreparedStatements=truespring.datasource.slave.validationQuery=SELECT 1#配置执行多条sql比如:批量处理#对应的错误:sql injection violation, multi-statement not allowspring.datasource.master.wall.multiStatementAllow=true#配置执行特殊sql比如sql server的创建临时表(declare)语句#对应的错误:sql injection violation, class com.alibaba.druid.sql.ast.statement.SQLDeclareStatement not allowspring.datasource.master.wall.noneBaseStatementAllow=true

MasterDataSourceConfig.java

注:Primary注解代表该数据源为主数据源

package com.core.dataSource;import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;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.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import org.springframework.jdbc.datasource.DataSourceTransactionManager;import javax.sql.DataSource;/** * oracle数据配置 */@Configuration//配置mapper文件目录,进行扫描@MapperScan(basePackages = "com.wawj.core.mapper.master", sqlSessionTemplateRef = "masterSqlSessionTemplate")public class MasterDataSourceConfig {    /**     * 创建数据源     * @return     */    @Bean    @Primary    @ConfigurationProperties(prefix = "spring.datasource.master")    public DataSource masterDataSource() {        return DruidDataSourceBuilder.create().build();    }    /**     * 创建工厂     * @param dataSource     * @return     * @throws Exception     */    @Bean    @Primary    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();        bean.setDataSource(dataSource);        //指定mapper.xml的目录        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/master/**/*.xml"));        //指定实体类目录        bean.setTypeAliasesPackage("com.wawj.core.entity");        return bean.getObject();    }    /**     * 创建事务     * @param dataSource     * @return     */    @Bean    @Primary    public DataSourceTransactionManager masterTransactionManager(@Qualifier("masterDataSource") DataSource dataSource) {        return new DataSourceTransactionManager(dataSource);    }    /**     * 创建模板     * @param sqlSessionFactory     * @return     */    @Bean    @Primary    public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {        return new SqlSessionTemplate(sqlSessionFactory);    }}

SlaveDataSourceConfig.java

package com.core.dataSource;import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;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.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import org.springframework.jdbc.datasource.DataSourceTransactionManager;import javax.sql.DataSource;/** * mysql数据配置 */@Configuration//配置mapper文件目录,进行扫描@MapperScan(basePackages = "com.wawj.core.mapper.slave", sqlSessionTemplateRef = "slaveSqlSessionTemplate")public class SlaveDataSourceConfig {    /**     * 创建数据源     * @return     */    @Bean    @ConfigurationProperties(prefix = "spring.datasource.slave")    public DataSource slaveDataSource() {        return DruidDataSourceBuilder.create().build();    }    /**     * 创建工厂     * @param dataSource     * @return     * @throws Exception     */    @Bean    public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();        bean.setDataSource(dataSource);        //指定mapper.xml的目录        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/slave/**/*.xml"));        //指定实体类目录        bean.setTypeAliasesPackage("com.wawj.core.entity");        return bean.getObject();    }    /**     * 创建事务     * @param dataSource     * @return     */    @Bean    public DataSourceTransactionManager slaveTransactionManager(@Qualifier("slaveDataSource") DataSource dataSource) {        return new DataSourceTransactionManager(dataSource);    }    /**     * 创建模板     * @param sqlSessionFactory     * @return     */    @Bean    public SqlSessionTemplate slaveSqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {        return new SqlSessionTemplate(sqlSessionFactory);    }}

这种方式初始化的是时候在druid控制台(http://localhost:8080/druid/login.html)中的数据源标签是没有,要请求过后才会显示当前连接的数据源

二、使用dynamic-datasource 动态配置(项目启动的时候创建)

pom.xml

   com.alibaba   druid-spring-boot-starter   1.1.10   com.baomidou   dynamic-datasource-spring-boot-starter   2.5.6   com.ojdbc   ojdbc   10.2.0.1   system   ${project.basedir}/src/main/lib/ojdbc14-10.2.0.1.0.jar   mysql   mysql-connector-java   5.1.38

application.properties

#全局默认值,可以全局更改spring.datasource.dynamic.druid.initial-size=5spring.datasource.dynamic.druid.max-active=5spring.datasource.dynamic.druid.min-idle=5spring.datasource.dynamic.druid.pool-prepared-statements=true#配置执行多条sql比如:批量处理#对应的错误:sql injection violation, multi-statement not allowspring.datasource.dynamic.druid.wall.multi-statement-allow=true#配置执行特殊sql比如sql server的创建临时表(declare)语句#对应的错误:sql injection violation, class com.alibaba.druid.sql.ast.statement.SQLDeclareStatement not allowspring.datasource.dynamic.druid.wall.none-base-statement-allow=true#oracle数据库spring.datasource.dynamic.datasource.master.driver-class-name=oracle.jdbc.OracleDriverspring.datasource.dynamic.datasource.master.druid.validation-query=SELECT 1 FROM DUALspring.datasource.dynamic.datasource.master.url=jdbc:oracle:thin:@localhost:1521:testspring.datasource.dynamic.datasource.master.username=oraclespring.datasource.dynamic.datasource.master.password=123456#mysql数据库spring.datasource.dynamic.datasource.slave.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.dynamic.datasource.slave.druid.validation-query=SELECT 1spring.datasource.dynamic.datasource.slave.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8spring.datasource.dynamic.datasource.slave.username=mysqlspring.datasource.dynamic.datasource.slave.password=123456#指定master为主数据源spring.datasource.dynamic.primary=master#排除原生Druid的快速配置类(DruidDataSourceAutoConfigure会注入一个DataSourceWrapper,其会在原生的spring.datasource下找url,username,password等。而我们动态数据源的配置路径是变化的。)spring.autoconfigure.exclude=com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure#设置dynamic登录名spring.datasource.druid.stat-view-servlet.login-username=admin#设置dynamic密码spring.datasource.druid.stat-view-servlet.login-password=admin#mybatis mapper locationmybatis-plus.mapper-locations=classpath:mapper/**/*.xmlmybatis-plus.type-aliases-package=com.wawj.core.entity

这种方式使用注解(@DS("数据源名称"))切换数据源

@DS 可以注解在方法上和类上,同时存在方法注解优先于类上注解。

注解在service实现或mapper接口方法上,但强烈不建议同时在service和mapper注解。 (可能会有问题)

注解结果
没有@DS默认数据源
@DS("dsName")dsName可以为组名也可以为具体某个库的名称

补充:排除原生的DruidDataSourceAutoConfigure也可以在springboot启动类排除(某些springBoot的版本上面可能无法排除就在application.properties中配置排除)

@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)public class Application {  public static void main(String[] args) {    SpringApplication.run(Application.class, args);  }}或#application.propertiesspring.autoconfigure.exclude=com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure

看完上述内容,你们对springboot 中怎么利用mybatis 配置多数据源有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

0