1. 添加 maven
<groupId>org.springframework.boot>
<artifactId>spring-boot-starter-data-jpa> 同时也支持 jpa
2. 动态添加数据源
DTO:
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class DataSourceDTO {
private String username;
private String password;
private String url;
private String driverClassName;
private String poolName;
}
添加数据源controller:
@RestController
public class HelloController {
@Autowired
private JdbcTemplatejdbcTemplate;
@Autowired
private DefaultDataSourceCreatordataSourceCreator;
@Autowired
private DataSourcedataSource;
@GetMapping
public Setnow() {
DynamicRoutingDataSource ds = (DynamicRoutingDataSource)dataSource;
return ds.getDataSources().keySet();
}
@PostMapping("/add")
public Setadd(@Validated @RequestBody DataSourceDTO dto) {
DataSourceProperty dataSourceProperty =new DataSourceProperty();
BeanUtils.copyProperties(dto, dataSourceProperty);
DynamicRoutingDataSource ds = (DynamicRoutingDataSource)dataSource;
DataSource dataSource =dataSourceCreator.createDataSource(dataSourceProperty);
ds.addDataSource(dto.getPoolName(), dataSource);
return ds.getDataSources().keySet();
}
@GetMapping("/hello")
public Objecthello()throws IOException {
Expression expression = AviatorEvaluator.getInstance().compileScript("C:\\Users\\P1337892\\IdeaProjects\\springboot_demo01\\src\\main\\java\\com\\yuanwu\\ncs\\aviator\\hello\\hello.av");
expression.execute();
List> maps =jdbcTemplate.queryForList("SELECT * FROM student");
return maps;
}
}
3. application.yml 配置
mybatis:
mapper-locations: classpath:mappers/*xml
type-aliases-package: com.yuanwu.ncs.mybatis.entity
spring:
datasource:
dynamic:
primary: master
strict: false
datasource:
master:
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mariadb://localhost:3306/test?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&allowMultiQueries=true
username: root
password: root
4. 基于拦截器 切换数据源:
@Slf4j
@WebFilter(filterName ="dsFilter", urlPatterns = {"/*"})
public class DynamicDatasourceFilterimplements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
String requestURI = request.getRequestURI();
String headerDs = request.getHeader("ds");
log.info("经过多数据源filter,当前路径是{}", requestURI);
String dsKey = StringUtils.hasText(headerDs) ? headerDs :"master";
log.info("经过多数据源filter,dsKey={}", dsKey);
//执行
try {
DynamicDataSourceContextHolder.push(dsKey);
filterChain.doFilter(servletRequest, servletResponse);
}finally {
DynamicDataSourceContextHolder.poll();
}
}
}
5. 添加数据源 json
{
"username": "root",
"password": "root",
"url": "jdbc:mariadb://localhost:3306/test_order?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&allowMultiQueries=true",
"driverClassName": "org.mariadb.jdbc.Driver",
"poolName": "test_order"
}
6. saas 多租户就可以 基于 注册动态添加数据库 动态添加数据源
然后租户id 给 用户, 然后登陆的时候 在header 中 或者 cookie中 添加 租户Id 实现数据源切换。。。










网友评论