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

yizhihongxing

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日

相关文章

  • Java提取两个字符串中的相同元素方法

    当我们需要提取两个字符串中相同的元素时,可以采用以下两种方法: 方法一:利用Java集合框架的交集函数 Java集合框架提供了intersection函数可以方便的求出两个已知集合的交集,因此我们可以将两个字符串分别转化为字符数组,然后再转化为集合,最后求出它们的交集。 示例一: String str1 = "abcde"; String…

    Java 2023年5月27日
    00
  • Java语言中flush()函数作用及使用方法详解

    Java语言中flush()函数作用及使用方法详解 1. flush()函数的作用 在Java语言中,flush()函数用于清空输出流缓冲区,强制将缓冲区的内容输出到目标位置(比如文件、网络等)。具体来说,flush()函数将输出流中的所有缓冲数据都写入到目标位置,同时清空缓冲区,保证数据能够及时地被输出到目标位置。在输出流关闭之前,我们经常需要调用flus…

    Java 2023年5月26日
    00
  • java处理转义字符↑ → ↓ 保存后的展示还原操作

    Java处理转义字符的攻略 在Java中,我们经常需要处理转义字符以及它们的展示还原操作。在本文中,我们将介绍一些实现这些操作的基本方法。 转义字符的定义 转义字符是一些特殊字符,它们的字符值用于表示一些难以在文本字符集中表达的含义。在Java中,有一些常见的转义字符,如“\n”表示换行,”\t”表示制表符等。这些转义字符将在字符串中使用。 转义字符的展示 …

    Java 2023年5月27日
    00
  • 基于编译虚拟机jvm—openjdk的编译详解

    基于编译虚拟机jvm—openjdk的编译详解 在这篇攻略中,我们将通过使用编译虚拟机jvm-openjdk来编译代码。下面是详细的步骤: 步骤一:安装OpenJDK 在使用OpenJDK编译代码之前,我们需要先安装它。在Linux系统中,我们可以通过以下命令来安装OpenJDK: sudo apt-get install default-jdk 在Wind…

    Java 2023年5月26日
    00
  • spring security中的csrf防御原理(跨域请求伪造)

    Spring Security 中的 CSRF(Cross-Site Request Forgery)攻击防御是非常重要的安全机制。在这个攻防机制中,Spring Security 通过在表单中添加或者 TkCooikeToken 的形式防御 CSRF 攻击,保障 Web 应用程序的安全。 CSRF 防御机制 CSRF 攻击利用用户在 Web 浏览器中处于登…

    Java 2023年5月20日
    00
  • 教你用JAVA写文本编辑器(一)

    “教你用JAVA写文本编辑器(一)”这篇文章主要是为初学者介绍如何用JAVA语言编写一个简单的文本编辑器程序。整篇文章介绍了搭建开发环境、项目创建及代码实现等过程,并给出了一个简单的示例。下面是该攻略的详细内容: 搭建开发环境 在开始编写JAVA文本编辑器程序之前,我们需要先搭建好JAVA开发环境。这里我们用的是Eclipse(也可以使用其他的JAVA集成开…

    Java 2023年5月19日
    00
  • 什么是Java缓存技术?

    Java缓存技术是指将计算机处理的结果或持久化数据存储在计算机内存中,以便更快地访问这些数据。Java缓存技术主要用于改善性能,减少应用程序请求数据的间隔时间。在Java中,常用的缓存技术包括内存缓存、文件缓存和Redis缓存等。 内存缓存 内存缓存是一种基于Java集合框架的缓存技术,它将数据存储在应用程序的内存中。内存缓存能够提供快速响应时间,但受到内存…

    Java 2023年5月11日
    00
  • 一天吃透SpringMVC面试八股文

    说说你对 SpringMVC 的理解 SpringMVC是一种基于 Java 的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于Spring框架的一个模块。 它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无须实现任何接口。同时它还支持RESTful编程风格的请求。 什么是MVC模式? MVC的全名是Model View Control…

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