首页 > 其他分享 >Mybatis-Plus接入多个数据源

Mybatis-Plus接入多个数据源

时间:2024-02-28 16:25:10浏览次数:28  
标签:String 数据源 Plus datasource spring Mybatis new public dataSource

导入依赖

<!-- mybatis-plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.2.0</version>
</dependency>

编辑properties

#db1
spring.datasource.db1.url=xxx
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.db1.username=xxx
spring.datasource.db1.password=xxx

#db2
spring.datasource.db2.url=xxx
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.db2.username=xxx
spring.datasource.db2.password=xxx

编写db1config、db2congfig。两个数据库需要分为不同的文件

@Configuration
@MapperScan(basePackages = Db1DataConfig.PACKAGE, sqlSessionFactoryRef = "db1SqlSessionFactory")
public class Db1DataConfig {

    static final String PACKAGE = "com.xxx.xxx.db.dao.db1";
    static final String MAPPER = "classpath:/mapper/db1/*.xml";

    @Value("${spring.datasource.db1.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;
    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;

    @Bean(name = "db1DataSource")
    @Primary
    public DataSource dbDataSource() {
        return DataSourceBuilder.create()
                .driverClassName(driverClassName)
                .username(username)
                .password(password)
                .url(url)
                .build();
    }

    @Bean("db1SqlSessionFactory")
    @Primary
    public SqlSessionFactory dbSqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();
        // 添加数据源
        sessionFactoryBean.setDataSource(dataSource);
        // 添加分页配置
        MybatisConfiguration configuration = new MybatisConfiguration();
        configuration.addInterceptor(new PaginationInterceptor());
        sessionFactoryBean.setConfiguration(configuration);
        // 添加mapper目录
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER));
        return sessionFactoryBean.getObject();
    }

    @Bean(name = "db1TransactionManager")
    @Primary
    public DataSourceTransactionManager dbTransactionManager(@Qualifier("db1DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

目录结构

遇到的问题

@Primary主键注解只能存在一个,当有多个配置文件时需要注意
运行报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): xxx。问题原因:SalSessionFactory不要使用原生的,请使用MybatisSalSessionFactory

MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();

需要添加分页插件,否则分页会失效

MybatisConfiguration configuration = new MybatisConfiguration();
        configuration.addInterceptor(new PaginationInterceptor());
        sessionFactoryBean.setConfiguration(configuration);

运行报错:No qualifying bean of type 'org.springframework.transaction.TransactionManager。问题原因:需增加指定事务的配置

/**
 * 事务枚举方便引用
 *
 * @author wangmin
 */
public class TransactionConstant {

    /**
     * db1事务
     */
    public static final String DB1_TRAN_MANAGER = "db1TranManager";

    /**
     * db2事务
     */
    public static final String DB2_TRAN_MANAGER = "db2TranManager";

    /**
     * 链式事务
     */
    public static final String CHAINED_TRAN_MANAGER = "chainedTranManager";

    public TransactionConstant() {

    }
}
@Configuration
public class TransactionManagerConfig {

    /**
     * db1事务
     *
     * @param dataSource 数据源
     * @return PlatformTransactionManager
     */
    @Primary
    @Bean(TransactionConstant.DB1_TRAN_MANAGER)
    public PlatformTransactionManager db1TranManage(@Qualifier("db1DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    /**
     * db2事务
     *
     * @param dataSource 数据源
     * @return PlatformTransactionManager
     */
    @Bean(TransactionConstant.DB2_TRAN_MANAGER)
    public PlatformTransactionManager db2TranManage(@Qualifier("db2DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    /**
     * 链式事务
     *
     * @param db1DataSource 数据源
     * @param db2DataSource 数据源
     * @return PlatformTransactionManager
     */
    @Bean(TransactionConstant.CHAINED_TRAN_MANAGER)
    public PlatformTransactionManager chainedTranManage(@Qualifier("db1DataSource") DataSource db1DataSource,
                                                        @Qualifier("db2DataSource") DataSource db2DataSource) {
        DataSourceTransactionManager dataSource1 = new DataSourceTransactionManager(db1DataSource);
        DataSourceTransactionManager dataSource2 = new DataSourceTransactionManager(db2DataSource);
        return new ChainedTransactionManager(dataSource1, dataSource2);
    }
}

在使用处增加@Transactional(transactionManager = TransactionConstant.DB1_TRAN_MANAGER, rollbackFor = Exception.class)来指定使用哪个事务

@Slf4j
@Service
@Transactional(transactionManager = TransactionConstant.DB1_TRAN_MANAGER, rollbackFor = Exception.class)
public class ExecuteServiceImpl implements IExecuteService {

    @Resource
    private ImageDisposeService imageDisposeService;
    @Resource
    private H5DataMapper h5DataMapper;

    @Value("${oss.base.folder}")
    private String ossBaseFolder;
    @Value("${oss.target.folder}")
    private String ossTargetFolder;
}

原文章地址:https://blog.csdn.net/weixin_44888446/article/details/129735504

标签:String,数据源,Plus,datasource,spring,Mybatis,new,public,dataSource
From: https://www.cnblogs.com/1399z3blog/p/18040874

相关文章

  • Mybatis 批量更新 PostgreSQL 数据库,返回更新行数
    1.拼接成1条sql语句,可返回修改行数。PostgreSQL的批量更新原生sql:updatepersonsetname=tmp.name,age=tmp.age,addr=tmp.addr,num=tmp.num,update_time=tmp.update_timefrom(values(1,'关羽',43,'成都',1,'2021-03-2617:32:2......
  • Vue3 配合 Element-Plus 和 iframe-resizer 完美实现抽屉 Drawer 和 iframe
    环境准备pnpminstallvuelodashelement-plusiframe-resizerpnpminstall@types/iframe-resizer-Diframe新建文件src/utils/directives/iframeResize.ts​import{Directive,DirectiveBinding,nextTick}from"vue"importiframeResizefrom"iframe-r......
  • Mybatis系列之(七)参数深入
    参数深入1.ParameterType(输入类型)1.1通过ParameterType传递Pojo对象Mybatis使用ognl表达式解析对象字段的值ognl表达式objectgraphicnavigationlanguage对象图导航语言通过对象的取值方法(属性的get方法)来获取数据,在写法上把get给省略了......
  • Mybatis系列之(六)MyBatis的CRUD操作
    MyBatis的CRUD操作CRUD操作指的是增加(Create)、检索(Retrieve)、更新(Update)和删除(Delete)操作1.编程步骤在dao接口中写方法映射配置文件中写对应的配置如果是Insert操作,占位符使用#{},括号中的内容要与实体类属性的get/set方法名保持一致(如果是通过右键生成的方法,......
  • Mybatis系列之(五)Mybatis在使用基于代理Dao的方式实现增删改查时都干了啥事儿
    Mybatis在使用基于代理Dao的方式实现增删改查时都干了啥事儿绝对路径:可能出现机器中没有D盘的情况,需要修改代码相对路径:部署项目后src就不存在了,需要修改代码基于以上两点,读取配置文件仅通过图中的两种方式进行读取构建者模式:专业的事儿由专业的人来做工厂模式:需要新的类的对......
  • Mybatis系列之(三)注解开发步骤
    注解开发步骤1.项目结构新建项目,创建与XML开发完全相同的项目结构删除resources/com文件夹2.全局配置文件修改SqlMapConfig.xml文件的mapper配置部分<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件--><mappers><!--resource......
  • Mybatis系列之(二)Mybatis 入门
    Mybatis入门1.准备数据创建数据库eesy_mybatis,创建表user,插入数据2.pom文件打包方式<packaging>jar</packaging>导入坐标mybatis坐标mybatis官网文档-入门-安装<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> &......
  • Mybatis系列之(一)Mybatis 概述
    Mybatis概述1.三层架构解决持久层问题项目=框架(半成品)+业务需求表现层:展示数据业务层:业务需求持久层:数据库交互2.持久层技术解决方案2.1JDBC技术(规范)2.2Spring的JdbcTemplate(工具类)Spring中对JDBC的简单封装2.3Apache的DBUtils(工具类)对JDBC的简单封装3.......
  • idea使用MybatisX插件根据表自动生成代码
    1.情景展示在实际开发过程中,根据数据库的表生成对应的增删改查代码,最为常见。除了使用公司封装的代码自动生成外,有没有通用的呢?2.具体分析在idea当中,我们可以使用MybatisX插件生成:表对应的实体类、dao层所使用的的mapper.java文件、mybatis对应的xml文件、service层所需的......
  • spring boot 中使用MybatisPlus的自动填充createTime和updateTime
    首先需要在实体类的字段上加上注解,并且将类型更改为LocalDateTime@TableField(fill=FieldFill.INSERT)@JsonInclude(value=JsonInclude.Include.NON_NULL)@JsonFormat(pattern="yyyy-MM-ddHH:mm:ss")privateLocalDateTimecreateTime;@TableFie......