亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springboot配置多數據源框架的示例分析

發布時間:2021-09-10 15:45:08 來源:億速云 閱讀:178 作者:柒染 欄目:開發技術

本篇文章為大家展示了springboot配置多數據源框架(dynamic-datasource-spring-boot-starter),內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

框架簡介

dynamic-datasource-spring-boot-starter 是一個基于 springboot 的快速集成多數據源的啟動器

 框架說明

  • 本框架只做 切換數據源 這件核心的事情,并不限制你的具體操作,切換了數據源可以做任何 CRUD

  • 配置文件所有以下劃線 _ 分割的數據源 首部 即為組的名稱,相同組名稱的數據源會放在一個組下

  • 切換數據源可以是組名,也可以是具體數據源名稱。組名則切換時采用負載均衡算法切換

  • 默認的數據源名稱為 master ,你可以通過 spring.datasource.dynamic.primary 修改

  • 方法上的注解優先于類上注解

  • DS 支持繼承抽象類上的 DS,暫不支持繼承接口上的 DS

與 springboot 的整合

數據準備
  •  springboot 版本:2.0.6.RELEASE

  • mysql 版本:5.7

分別創建數據庫 test1,test2,數據庫表均為 goods,數據不相同

CREATE TABLE `goods` (
  `goodsId` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `goodsName` varchar(500) NOT NULL DEFAULT '' COMMENT 'name',
  `subject` varchar(200) NOT NULL DEFAULT '' COMMENT '標題',
  `price` decimal(15,2) NOT NULL DEFAULT '0.00' COMMENT '價格',
  `stock` int(11) NOT NULL DEFAULT '0' COMMENT 'stock',
  PRIMARY KEY (`goodsId`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COMMENT='商品表';

test1 數據庫數據如下

springboot配置多數據源框架的示例分析

test2 數據庫數據如下

springboot配置多數據源框架的示例分析

引入依賴

至于其他依賴,不再贅述

<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
	<version>3.3.2</version>
</dependency>
springboot 配置文件

配置文件詳情可以參考官方文檔

server.port=8080

#設置test1為主數據源
spring.datasource.dynamic.primary=master
#test1主數據源配置
spring.datasource.dynamic.datasource.master.url=jdbc:mysql://127.0.0.1:3306/test1?characterEncoding=utf8&useSSL=false&autoReconnect=true&serverTimezone=UTC
spring.datasource.dynamic.datasource.master.username=root
spring.datasource.dynamic.datasource.master.password=123456
spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.dynamic.datasource.master.type=com.alibaba.druid.pool.DruidDataSource
#druid連接池配置
spring.datasource.dynamic.datasource.master.druid.initial-size=5
spring.datasource.dynamic.datasource.master.druid.max-active=20
spring.datasource.dynamic.datasource.master.druid.min-idle=5
spring.datasource.dynamic.datasource.master.druid.max-wait=60000

#test2從數據源配置
spring.datasource.dynamic.datasource.slave.url=jdbc:mysql://127.0.0.1:3306/test2?characterEncoding=utf8&useSSL=false&autoReconnect=true&serverTimezone=UTC
spring.datasource.dynamic.datasource.slave.username=root
spring.datasource.dynamic.datasource.slave.password=123456
spring.datasource.dynamic.datasource.slave.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.dynamic.datasource.slave.type=com.alibaba.druid.pool.DruidDataSource
#druid連接池配置
spring.datasource.dynamic.datasource.slave.druid.initial-size=5
spring.datasource.dynamic.datasource.slave.druid.max-active=20
spring.datasource.dynamic.datasource.slave.druid.min-idle=5
spring.datasource.dynamic.datasource.slave.druid.max-wait=60000

#mybatis配置
mybatis.mapper-locations=classpath:org/example/mapper/*.xml
mybatis.configuration.cache-enabled=true
#開啟駝峰命名
mybatis.configuration.map-underscore-to-camel-case=true
#打印SQL
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

啟動類

需要排除掉 DruidDataSourceAutoConfigure 類,不然啟動會報錯找不到配置的 url

@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
@Slf4j
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
        log.info("------springboot running-----");
    }
}

實體類

@Data
@ApiModel
public class Goods implements Serializable {

    @ApiModelProperty(value = "商品id")
    private Long goodsid;

    @ApiModelProperty(value = "商品名稱")
    @NotBlank(message = "商品名稱不能為空")
    private String goodsname;

    @ApiModelProperty(value = "商品描述")
    @NotBlank(message = "商品描述不能為空")
    private String subject;

    @ApiModelProperty(value = "商品價格")
    @NotNull(message = "商品價格不能為空")
    private BigDecimal price;

    @ApiModelProperty(value = "商品庫存", example = "0")
    @NotNull(message = "商品庫存不能為空")
    private Integer stock;
}

service

至于 dao 層,使用的是 mybatis-generator 插件自動生成

@Service
public class GoodServiceImpl implements GoodService {

    @Autowired
    private GoodsMapper goodsMapper;

    @Override
    public Goods selectOneGoods(Long goodsid) {
        return goodsMapper.selectByPrimaryKey(goodsid);
    }

    @Override
    public int addGoods(Goods goods) {
        return goodsMapper.insertSelective(goods);
    }
}

controller

@Controller
@RequestMapping(path = "/goods")
@Api(tags = "商品管理相關接口")
@Slf4j
public class GoodsController {

    @Autowired
    private GoodService goodService;

    @GetMapping(path = "/selectOne")
    @ResponseBody
    @ApiOperation(value = "查詢商品接口")
    @ApiImplicitParam(name = "id", value = "商品id", required = true)
    public ResultMap selectOne(@RequestParam(name = "id", defaultValue = "3") Long goodsid) {
        Goods goods = goodService.selectOneGoods(goodsid);
        log.info("查詢到的商品數據:" + goods.toString());
        if (StringUtils.isEmpty(goods)) {
            return new ResultMap().fail().message("查詢失敗,沒有您要的數據");
        }
        return new ResultMap().success().message("查詢成功").data(goods);
    }

    @PostMapping(path = "/addGoods")
    @ResponseBody
    @ApiOperation(value = "添加商品的接口")
    public ResultMap addGoods(@Valid Goods goods, @NotNull BindingResult bindingResult) {
        if (bindingResult.hasErrors()){
            String defaultMessage = Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage();
            return new ResultMap().fail().message(defaultMessage);
        }
        int i = goodService.addGoods(goods);
        if (i > 0) {
            return new ResultMap().success().message("添加成功");
        }
        return new ResultMap().fail().message("添加失敗");
    }
}

測試 service 層方法上都沒有注解 @DS

使用 postman 測試第一個接口

springboot配置多數據源框架的示例分析

使用 postman 測試第二個接口

springboot配置多數據源框架的示例分析
springboot配置多數據源框架的示例分析

以上兩個接口測試說明:它們都默認操作的是主數據源 test1,證明我們配置文件中配置的主數據源 test1 是配置正確的,已經生效

service 層方法上加上注解 @DS 再測試

@Service
public class GoodServiceImpl implements GoodService {

    @Autowired
    private GoodsMapper goodsMapper;

    @DS(value = "slave")// 切換數據源,并指定要訪問的數據庫名稱
    @Override
    public Goods selectOneGoods(Long goodsid) {
        return goodsMapper.selectByPrimaryKey(goodsid);
    }

    @Override
    public int addGoods(Goods goods) {
        return goodsMapper.insertSelective(goods);
    }
}

使用 postman 測試第一個接口

springboot配置多數據源框架的示例分析

此時 @DS 注解已生效,發生了數據源的動態切換

使用 postman 測試第二個接口

springboot配置多數據源框架的示例分析

springboot配置多數據源框架的示例分析

由于該接口沒有 @DS 注解,所以沒有發生數據源的切換,依然操作的是 test1 默認數據源

@DS 注解說明

注解結果
沒有@DS默認數據源
@DS("dsName")dsName可以為組名也可以為具體某個庫的名稱
  • @DS 可以注解在方法上或類上,同時存在就近原則 方法上注解 優先于 類上注解

  • @DS 官方建議使用在 service 層的方法上

上述內容就是springboot配置多數據源框架(dynamic-datasource-spring-boot-starter)的示例分析,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

崇仁县| 博爱县| 溧水县| 老河口市| 贺州市| 吴川市| 郁南县| 抚顺市| 抚州市| 阳原县| 扎兰屯市| 定结县| 县级市| 当阳市| 历史| 北辰区| 舞阳县| 乡城县| 巢湖市| 喜德县| 天柱县| 深水埗区| 凤台县| 禄劝| 石楼县| 磐石市| 黑龙江省| 衢州市| 珲春市| 乌兰浩特市| 保康县| 珠海市| 保德县| 柏乡县| 仲巴县| 东阳市| 芮城县| 葵青区| 潜山县| 三穗县| 永寿县|