本篇文章为大家展示了springboot配置多数据源框架(dynamic-datasource-spring-boot-starter),内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
dynamic-datasource-spring-boot-starter
是一个基于 springboot
的快速集成多数据源的启动器
本框架只做 切换数据源
这件核心的事情,并不限制你的具体操作,切换了数据源可以做任何 CRUD
配置文件所有以下划线 _
分割的数据源 首部
即为组的名称,相同组名称的数据源会放在一个组下
切换数据源可以是组名,也可以是具体数据源名称。组名则切换时采用负载均衡算法切换
默认的数据源名称为 master
,你可以通过 spring.datasource.dynamic.primary
修改
方法上的注解优先于类上注解
DS
支持继承抽象类上的 DS
,暂不支持继承接口上的 DS
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
数据库数据如下
test2
数据库数据如下
至于其他依赖,不再赘述
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
配置文件详情可以参考官方文档
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
测试第一个接口
使用 postman
测试第二个接口
以上两个接口测试说明:它们都默认操作的是主数据源 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
测试第一个接口
此时 @DS
注解已生效,发生了数据源的动态切换
使用 postman
测试第二个接口
由于该接口没有 @DS
注解,所以没有发生数据源的切换,依然操作的是 test1
默认数据源
@DS
注解说明
注解 | 结果 |
---|---|
没有@DS | 默认数据源 |
@DS("dsName") | dsName可以为组名也可以为具体某个库的名称 |
@DS 可以注解在方法上或类上,同时存在就近原则 方法上注解 优先于 类上注解
@DS 官方建议使用在 service 层的方法上
上述内容就是springboot配置多数据源框架(dynamic-datasource-spring-boot-starter)的示例分析,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。