Springboot+mybatis实现双数据源读写分离

Springboot+mybatis实现双数据源读写分离

注:需要配置两台服务器的MySQL数据库,数据同步:点我跳转

源码地址:https://gitee.com/liu-miaos-xiaojing/springboot-mybatis-master_slave.git

效果如下:

查询:

插入:

目录结构如下:

  1. 创建数据表

CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;

-- test.`user` definition

CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `age` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

2.插入数据

INSERT INTO test.`user` (name,age) VALUES
     ('张三','18'),
     ('李四','18'),
     ('赵六','18'),
     ('赵六','18');

3.导入maven依赖

<!--数据库连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.17</version>
        </dependency>

        <!--双数据源依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>

        <!--数据库连接-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!--数据库连接驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version>
        </dependency>

        <!--mybatis依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

4.创建application.yaml文件

server:
  port: 8888
spring:
  datasource:
    dynamic:
      primary: master # 默认使用数据库
      datasource:
        master: #----------------主数据库配置(写入)----------------
          url: jdbc:mysql://10.70.20.78:3306/test?serverTimezone=Asia/Shanghai
          username: root
          password: MySQL123456.
          driver-class-name: com.mysql.jdbc.Driver
          type: com.alibaba.druid.pool.DruidDataSource
        slave: #----------------从库(读取)----------------
          url: jdbc:mysql://10.70.20.146:3306/test?serverTimezone=Asia/Shanghai
          username: root
          password: MySQL123456.
          driver-class-name: com.mysql.jdbc.Driver
          type: com.alibaba.druid.pool.DruidDataSource
      durid:
        initial-size: 1
        max-active: 20
        min-idle: 1
        max-wait: 60000
  autoconfigure: # 去除druid配置
    exclude:  com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure

mybatis:
  mapper-locations: classpath:mapper/*                                  #扫描mapper接口映射层
  configuration:
    map-underscore-to-camel-case: true                                  #开启驼峰命名规则
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl               #控制台打印sql语句

5.创建实体类

package com.lm.master_slave.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class User {

    private Integer id;

    private String name;

    private String age;

}

6.创建mapper接口

package com.lm.master_slave.mapper;

import com.lm.master_slave.bean.User;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface UserMapper {
    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user
     *
     * @mbggenerated Tue Feb 14 21:53:41 GMT+08:00 2023
     */
    int deleteByPrimaryKey(Integer id);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user
     *
     * @mbggenerated Tue Feb 14 21:53:41 GMT+08:00 2023
     */
    int insert(User record);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user
     *
     * @mbggenerated Tue Feb 14 21:53:41 GMT+08:00 2023
     */
    User selectByPrimaryKey(Integer id);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user
     *
     * @mbggenerated Tue Feb 14 21:53:41 GMT+08:00 2023
     */
    List<User> selectAll();

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user
     *
     * @mbggenerated Tue Feb 14 21:53:41 GMT+08:00 2023
     */
    int updateByPrimaryKey(User record);
}

7.创建service层

解释:

这里,service层的@DS("slave") 、@DS("master")注解
在调用对应方法时,会自动对应数据源(durid数据连接池)中的
package com.lm.master_slave.service;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.lm.master_slave.bean.User;
import com.lm.master_slave.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author: lm
 * @createDate: 2023-02-14 21:55
 * @description:
 */
@Service
public class UserService {

    @Autowired
    private UserMapper mapper;

    @DS("slave")        //自动连接从库
    public List<User> selectAll() {
        return mapper.selectAll();
    }

    @DS("master")        //自动连接注库
    public int insert(User record) {
        return mapper.insert(record);
    }

}

8.创建controller层

package com.lm.master_slave.controller;

import com.lm.master_slave.bean.User;
import com.lm.master_slave.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author: lm
 * @createDate: 2023-02-14 21:57
 * @description:
 */
@RestController
public class UserController {

    @Autowired
    private UserService service;


    @RequestMapping("/users")
    public List<User> selectAll() {
        return service.selectAll();
    }

    @RequestMapping(value = "/user",method = RequestMethod.POST)
    public int insert(User user) {
        return service.insert(new User(null,user.getName(),user.getAge()));
    }

}

使用api接口测试工具发送对应请求,进行测试,效果见文章顶

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Spring Boot应用中使用Mybatis和Hikari实现多数据,可以按照以下步骤进行操作: 1. 在pom.xml文件中添加相关依赖,包括spring-boot-starter-jdbc、mybatis-spring-boot-starter、hikariCP等。 2. 在application.yml配置文件中配置多个数据,例如: ``` spring: datasource: master: jdbc-url: jdbc:mysql://localhost:3306/master username: root password: root driver-class-name: com.mysql.jdbc.Driver slave: jdbc-url: jdbc:mysql://localhost:3306/slave username: root password: root driver-class-name: com.mysql.jdbc.Driver ``` 3. 创建多个数据的配置类,例如: ``` @Configuration @MapperScan(basePackages = "com.example.demo.master.mapper", sqlSessionTemplateRef = "masterSqlSessionTemplate") public class MasterDataSourceConfig { @Primary @Bean(name = "masterDataSource") @ConfigurationProperties(prefix = "spring.datasource.master") public DataSource masterDataSource() { return DataSourceBuilder.create().type(HikariDataSource.class).build(); } @Primary @Bean(name = "masterSqlSessionFactory") public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); return bean.getObject(); } @Primary @Bean(name = "masterTransactionManager") public DataSourceTransactionManager masterTransactionManager(@Qualifier("masterDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Primary @Bean(name = "masterSqlSessionTemplate") public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } } ``` ``` @Configuration @MapperScan(basePackages = "com.example.demo.slave.mapper", sqlSessionTemplateRef = "slaveSqlSessionTemplate") public class SlaveDataSourceConfig { @Bean(name = "slaveDataSource") @ConfigurationProperties(prefix = "spring.datasource.slave") public DataSource slaveDataSource() { return DataSourceBuilder.create().type(HikariDataSource.class).build(); } @Bean(name = "slaveSqlSessionFactory") public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); return bean.getObject(); } @Bean(name = "slaveTransactionManager") public DataSourceTransactionManager slaveTransactionManager(@Qualifier("slaveDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "slaveSqlSessionTemplate") public SqlSessionTemplate slaveSqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } } ``` 4. 在需要使用数据的地方使用@Qualifier注解指定数据,例如: ``` @Service public class UserService { @Autowired @Qualifier("masterSqlSessionTemplate") private SqlSessionTemplate masterSqlSessionTemplate; @Autowired @Qualifier("slaveSqlSessionTemplate") private SqlSessionTemplate slaveSqlSessionTemplate; public List<User> getUsersFromMaster() { return masterSqlSessionTemplate.selectList("com.example.demo.master.mapper.UserMapper.selectAll"); } public List<User> getUsersFromSlave() { return slaveSqlSessionTemplate.selectList("com.example.demo.slave.mapper.UserMapper.selectAll"); } } ``` 这样就可以在Spring Boot应用中使用Mybatis和Hikari实现多数据了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值