「掘金者说」动态数据源,查库表字段数据

1,241 阅读2分钟

这两天在研究实践一个神奇的功能。可以根据动态数据库,进行切换查看不同数据库的表名;根据不同的表名,查询出不同的字段数据。在开发过程中,我们常常沟通上面说的都比较抽象。

幸福只在拼命努力后才会来敲门

那么,我们来画个原型图吧~~~时间有点赶,所以就大概上图,这个我们看数据是不是很方便了。

动态数据源 即在一个应用中配置多个不同的连接池。对于数据源的使用是相对容易的。由于某些架构或业务中,有时候是要进行多个数据库的操作,这就涉及到多个数据源的创建以及数据源的切换。平台通过整合 dynamic-datasource-spring-boot-starter 为框架提供动态数据源、主从分离、读写分离能力。

/**
 * @author Lucky
 * @date 2019-05-18
 * <p>
 * 开启动态数据源
 */
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@EnableAutoConfiguration(exclude = { DruidDataSourceAutoConfigure.class })
@Import(DynamicDataSourceAutoConfiguration.class)
public @interface EnableDynamicDataSource {

}

如何使用

  1. 业务服务引入动态数据源服务
<dependency>
  <groupId>com.pig4cloud</groupId>
  <artifactId>pig-common-datasource</artifactId>
</dependency>
  1. 配置数据源信息来源 (JDBC配置)
spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      username: root
      password: root
      url: jdbc:mysql://IP:PORT/pig_demo
      query-ds-sql: 'select * from gen_datasource_conf where del_flag = 0'
  1. 开启动态数据源
@EnableDynamicDataSource
public class PigApplication {
   public static void main(String[] args) {
      SpringApplication.run(PigApplication.class, args);
   }
}
  1. 使用动态数据源查询
  • Mapper 层@Ds("#last")固定写法,最后一个参数为指定数据源(必须有)
@Mapper
public interface PigDemoMapper extends BaseMapper<PigDemo> {
   @DS("#last")
   Map selectDs(String dsName);
}
  • Service 层调用
@Service
public class PigDemoServiceImpl extends ServiceImpl<PigDemoMapper, Demo> implements PigDemoService {
   @Override
   public Object getByDs(Integer id) {
      // 此处 dsName 为以上 gen_datasource_conf 加载数据源 name 字段
      return baseMapper.selectDs("sca_core");
   }
}
  1. 扩展使用
@DS("#session.tenantName")//从session获取
public List selectSpelBySession() {
   return userMapper.selectUsers();
}

@DS("#header.tenantName")//从header获取
public List selectSpelByHeader() {
   return userMapper.selectUsers();
}

@DS("#tenantName")//使用spel从参数获取
public List selectSpelByKey(String tenantName) {
   return userMapper.selectUsers();
}

@DS("#user.tenantName")//使用spel从复杂参数获取
public List selecSpelByTenant(User user) {
   return userMapper.selectUsers();
}

《当幸福来敲门》别让人家告诉你、你做不成什么事、即使我也不行!那些意识无成的人总想告诉你、你也成不了大器、如果你有梦想、你就要去捍卫他、仅此而已!

如果你想要做些什么,就得去努力争取,仅此而已。

参考资料