springBoot+Mybatis多数据源配置

maonidou(苞米豆)团队针对springboot使用多数据源提供了一个启动器:dynamic-datasource-spring-boot-starter
我们在pom文件中添加依赖

<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
	<version>2.5.6</version>
</dependency>

这里我配置了Druid连接池,需要注意的是我们要排除原生的Druid的快速配置类。

@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

为什么要排除呢?
DruidDataSourceAutoConfigure在DynamciDataSourceAutoConfiguration之前,其会注入一个DataSourceWrapper,会在原生的spring.datasource下找url,username,password等。而我们动态数据源的配置路径是变化的。

此时我们修改application.properties,配置主从数据库(注意配置默认数据源)

# 默认数据源
spring.datasource.dynamic.primary=master
# 主库配置 master
spring.datasource.dynamic.datasource.master.username=root
spring.datasource.dynamic.datasource.master.password=root
spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.master.url=jdbc:mysql://172.16.0.157:3306/guoheng?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&allowMultiQueries=true&serverTimezone=GMT%2B8


# 从库配置 slave
spring.datasource.dynamic.datasource.slave.username=root
spring.datasource.dynamic.datasource.slave.password=root
spring.datasource.dynamic.datasource.slave.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.slave.url=jdbc:mysql://172.16.1.18:3306/guoheng?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&allowMultiQueries=true&serverTimezone=GMT%2B8

配置好以上的东西就能使用多数据源了,下面展示例子
我在mapper层切换数据源向从数据库查询数据插入到主数据库中

package com.guoheng.safe.sys.mapper.iot;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.guoheng.safe.sys.model.iot.IotData;
import org.apache.ibatis.annotations.Mapper;
@DS("slave")
@Mapper
public interface IotDataMapper {
    IotData selectLastOne();
    }

注意:我这个mapper接口使用了@DS(“slave”)注解,表示使用的是从数据库,如果不使用@DS注解,使用默认配置数据源。@DS注解可以注解在service层,也可以注解在mapper层,当在service层时,整个业务中使用的都是这个数据源,注解在mapper层时,可以在不同逻辑中切换不同数据源。但强烈不建议同时在service和mapper注解。 (可能会有问题)

package com.guoheng.safe.sys.scheduling;

import com.guoheng.safe.sys.model.iot.IotData;
import com.guoheng.safe.sys.model.map.SensorData;
import com.guoheng.safe.sys.service.HazardMapService;
import com.guoheng.safe.sys.service.IotDataService;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 类功能描述: IotDataScheduling
 *
 * @author Eternal
 * @date 2019-30-12 13:30
 */
@Component
public class IotDataScheduling {

    @Resource
    IotDataService iotDataService;

    @Resource
    HazardMapService hazardMapService;

   /* @Scheduled(cron = "0/5 * * * * ?")*/
    public void getIotData() throws ParseException {
        IotData iotData = iotDataService.selectLastOne();

        SensorData sensorData = new SensorData();
        sensorData.setSensorNo(iotData.getBh());
        sensorData.setSensorValue(iotData.getDataValue().doubleValue());
        String collectTime = iotData.getCollectTime();
        SimpleDateFormat sdf = new SimpleDateFormat("YYYYMMDDHHMMSS");
        Date time = sdf.parse(collectTime);
        sensorData.setCreateTime(time);
        
        hazardMapService.addSensorData(sensorData);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章