关于MybatisPlus配置双数据库驱动连接数据库问题

MybatisPlus是Mybatis的扩展库,它提供了更多的便捷操作和增强功能,是目前比较流行的Java持久层框架之一。在使用MybatisPlus框架时,我们可能需要连接多个不同的数据库,这时就会遇到双数据库驱动连接数据库的问题。下面是一份详细的攻略:

1.添加双数据库的配置文件

首先,我们需要添加MybatisPlus的配置文件,具体名字根据项目需要来定,这里以“mybatisplus.properties”为例。在文件中添加如下配置:

#master数据源配置
master.url=jdbc:mysql://localhost:3306/db_master?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
master.driver=com.mysql.cj.jdbc.Driver
master.username=root
master.password=root

#slave数据源配置
slave.url=jdbc:mysql://localhost:3306/db_slave?useSSL=false&useUnicode=true&CharacterEncoding=utf8&serverTimezone=Asia/Shanghai
slave.driver=com.mysql.cj.jdbc.Driver
slave.username=root
slave.password=root

其中,master和slave表示两个不同的数据库连接,可以根据实际需要自行修改。url、driver、username、password等字段需要根据具体的数据库配置来设置。

2.配置数据源和事务管理器

接着,在Spring Boot配置文件application.yml中添加以下配置:

# 数据源配置
spring:
  datasource:
    master:
      url: ${master.url}
      driver-class-name: ${master.driver}
      username: ${master.username}
      password: ${master.password}
    slave:
      url: ${slave.url}
      driver-class-name: ${slave.driver}
      username: ${slave.username}
      password: ${slave.password}
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      pool-name: datasource
      minimum-idle: 5
      maximum-pool-size: 30
      auto-commit: true
      idle-timeout: 180000
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20
      connection-timeout: 30000
      validation-query: SELECT 1 FROM DUAL
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      filter:
        - com.alibaba.druid.filter.logging.Log4j2Filter
        - com.alibaba.druid.filter.stat.StatFilter

# MyBatisPlus配置
mybatis-plus:
  mapper-locations: classpath:/mapper/**Mapper.xml
  global-config:
    db-config:
      id-type: auto
      field-strategy: not_empty
      logic-delete-value: 1
      logic-not-delete-value: 0
    banner: false
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false
  type-aliases-package: com.example.entity

# 事务管理器
transaction:
  enabled: true
  manager-type: jdbc
  jdbc:
    data-source: master

这里采用的是Hikari连接池,并且同时配置了master和slave两个数据源。注意到注入到事务管理器的是“master”数据源,这里可以根据实际需要来选择是否需要指定具体的数据源。

3.创建mybatis-plus的配置类

最后,我们需要创建一个MybatisPlus的配置类来整合以上配置,具体代码如下:

@Configuration
public class MybatisPlusConfig {

    @Autowired
    private Environment env;

    @Bean(name="dataSource")
    public DataSource dataSource() {
        HikariDataSource ds = new HikariDataSource();
        ds.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
        ds.setJdbcUrl(env.getProperty("spring.datasource.url"));
        ds.setUsername(env.getProperty("spring.datasource.username"));
        ds.setPassword(env.getProperty("spring.datasource.password"));
        return ds;
    }

    @Bean
    @Primary
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource());

        // 分页插件
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        sqlSessionFactoryBean.setPlugins(new Interceptor[]{paginationInterceptor});

        // mybatis注解驼峰转换
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration .setMapUnderscoreToCamelCase(true);
        sqlSessionFactoryBean.setConfiguration(configuration);

        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    public DataSourceTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    @Bean
    public GlobalConfig globalConfig() {
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setDbConfig(new GlobalConfig.DbConfig().setIdType(IdType.AUTO));
        return globalConfig;
    }
}

在这个配置类中,我们注入了上一步定义的数据源和事务管理器,并且配置了MybatisPlus所需的相关内容,包括分页插件和驼峰转换。

注意到这里我们使用了@Primary注解,在多个相同类型的Bean时将其作为首选Bean,这个注解可以在遇到多个数据源时指定主数据源。

示例

下面两个示例分别描述了如何在普通查询和分页查询时使用不同的数据源。

示例1:普通查询

在 DAO 层,使用 @Mapper 注解标识这是一个 Mapper,再使用 @MapperScan 扫描包路径,将Mapper加入spring IOC容器,如下所示:

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM user")
    @Results({
            @Result(property = "userId", column = "user_id"),
            @Result(property = "userName", column = "user_name")
    })
    List<User> getUsers();
}

@MapperScan(basePackages = "com.example.dao", sqlSessionTemplateRef = "sqlSessionTemplate")
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

在 Service 层,可以指定不同的数据源,这里使用 master 数据源进行查询,代码如下:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public List<User> getUsers() {
        return userMapper.getUsers();
    }
}

如果要使用 slave 数据源进行查询,只需在相应的方法上添加该注解:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    @Qualifier("slaveSqlSessionTemplate")
    private SqlSessionTemplate slaveSqlSessionTemplate;

    @Override
    public List<User> getUsers() {
        return slaveSqlSessionTemplate.selectList("com.example.dao.UserMapper.getUsers");
    }
}

示例2:分页查询

首先,我们需要在pom.xml文件中添加依赖:

<!--Mybatis Plus 分页插件 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>${mybatis-plus.version}</version>
</dependency>

接着,我们需要在Service中注入分页插件PageHelper:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;
    @Autowired
    private PageHelper pageHelper;

    @Override
    public List<User> getUsers(int pageNum, int pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        return userMapper.getUsers();
    }
}

在使用时,指定master或slave数据源即可:

@Autowired
@Qualifier("slavePageHelper")
private PageHelper slavePageHelper;

@Autowired
@Qualifier("masterPageHelper")
private PageHelper masterPageHelper;

public Page<User> getUsers(int pageNum, int pageSize) {
    slavePageHelper.startPage(pageNum, pageSize);
    return userMapper.getUsers();
}

public Page<User> getUsers(int pageNum, int pageSize) {
    masterPageHelper.startPage(pageNum, pageSize);
    return userMapper.getUsers();
}

到此为止,一个完整的双数据库配置过程就完成了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于MybatisPlus配置双数据库驱动连接数据库问题 - Python技术站

(0)
上一篇 2023年6月16日
下一篇 2023年6月16日

相关文章

  • Ajax的简单实用实例代码

    当我们做网页开发的时候,经常需要通过 Ajax 技术来实现异步请求与响应。在这里,我将为大家讲解 Ajax 的简单使用实例代码,帮助大家更好地理解这项技术。 基本语法 Ajax 的基本语法如下: let xhr = new XMLHttpRequest(); // 创建XMLHttpRequest对象 xhr.onreadystatechange = fun…

    Java 2023年5月20日
    00
  • Java Class.forName()用法和newInstance()方法原理解析

    Java中的Class对象提供了一些强大的机制来处理编译时期未知的类,比如在运行时动态加载并实例化一个类。其中Class.forName()和newInstance()方法是两个非常重要的方法,本文将详细讲解它们的用法和原理。 Java Class.forName()方法 Class.forName()是Java反射机制中的核心方法之一,它可以根据类名动态加…

    Java 2023年5月26日
    00
  • 游戏开发常见面试题与知识点整理总结

    游戏开发常见面试题与知识点整理总结 前言 游戏开发是一个涉及众多技术领域的综合性行业,因此在游戏开发岗位的面试中,会涉及到众多的技术领域与知识点。本篇文章将介绍游戏开发常见面试题与知识点,帮助读者了解游戏开发领域的常识,并为游戏开发岗位的应聘者提供参考。 1. 编程基础 作为一个游戏开发者,编程基础是不能缺少的部分。在面试中,经常会涉及到编程相关的面试题,需…

    Java 2023年5月19日
    00
  • Java反射机制的学习总结

    Java反射机制的学习总结 什么是Java反射机制? Java反射机制是指在程序运行时动态获取类的信息以及动态调用对象的方法的机制。 我们在开发中常常需要在运行时动态地加载和使用类,例如在插件系统中使用的动态加载和使用各种插件类的方式,这就需要用到Java反射机制。 通过利用Java反射机制,程序可以在不知道具体类名的情况下,获取类的相关信息,创建对象实例,…

    Java 2023年6月1日
    00
  • win7 64位系统JDK安装配置环境变量教程

    Win7 64位系统JDK安装配置环境变量教程 本文将详细讲解Win7 64位系统JDK安装配置环境变量的完整攻略,让读者能够快速、准确地完成JDK环境配置。 1. 下载JDK 首先,在Oracle官网上下载JDK安装包。 选择适合Win7 64位的版本,下载到本地。 2. 安装JDK 点击下载好的JDK安装包,按照提示进行安装。 选择安装路径,一般建议安装…

    Java 2023年5月26日
    00
  • Java的Hibernate框架中用于操作数据库的HQL语句讲解

    关于Java的Hibernate框架中用于操作数据库的HQL语句,我可以提供以下详细攻略。 什么是HQL HQL(Hibernate Query Language)是Hibernate框架中用来操作数据库的面向对象的语言。它类似于SQL,但是使用OOP的方法来表述查询,完全面向对象。 HQL语句的结构 HQL语句的结构与SQL类似,由SELECT、FROM、…

    Java 2023年5月20日
    00
  • java.Net.UnknownHostException异常处理问题解决

    Java.Net.UnknownHostException异常处理问题解决 当我们在使用Java进行网络编程时,经常会遇到一种异常:java.net.UnknownHostException,这是由于未知的主机名或者IP地址问题导致的,但有时候可能并不是我们的代码问题,而是网络环境问题,这就需要我们做一些异常处理。下面我们来详细讲解如何处理这个异常。 1. …

    Java 2023年5月27日
    00
  • Java并发编程的作用是什么?

    Java并发编程的作用 简介 Java并发编程能够提高程序的执行效率和程序的并发性,充分利用多核处理器的能力,提高系统的吞吐量和响应时间,保证程序的线程安全,确保程序数据的正确性。 Java并发编程是基于线程的,通过多线程的方式来实现并发编程,Java提供了一系列的并发包,例如java.util.concurrent包用于并发编程和并行编程,提供了一些用于原…

    Java 2023年5月11日
    00
合作推广
合作推广
分享本页
返回顶部