天天看點

springboot + mybatisplus 實作 動态切換 多資料源

需求闡述:

根據前端入參(例如: conn=MYSQL 或者 conn=ORACLE 等等) 實作動态切換 多資料源 連接配接不同的資料庫 進行 增删查改 等相關操作

實作步驟:

  1. 根據前端入參 conn 值 擷取 資料庫 相關連接配接資訊 如: driver/url/userName/passwd等等
  2. 根據 資料庫連接配接資訊 擷取 SqlSessionFactory
  3. 擷取 SqlSession
  4. 執行個體化 Mapper
  5. 執行 增删查改 相關操作

補充:

關于資料庫連接配接資訊 和 conn 對應關系 建議 通過配置清單維護

相關代碼片段:

@Data
public class DbDriver {

   /**
    * 資料庫驅動
    */
   private String driver;

   /**
    * 資料庫連接配接資訊
    */
   private String conn;

   /**
    * 使用者名
    */
   private String userName;

   /**
    * 密碼
    */
   private String passwd;

}
           
@Autowired
SqlSessionFactoryUtil util;

@PostMapping("/demo")
public Object select(@RequestBody Para para) {
   // 1. 以入參 conn 為例 , 需要 工具類 可以擷取 對應的 資料庫連接配接資訊 如: driver url userName passwd ...
   String conn = para.getConn();
   // 2. 建構參數
   DbDriver dbDriver = buildDbDriver(conn);
   // 3. 擷取 SqlSession
   SqlSession sqlSession = util.getSqlSessionFactory(dbDriver).openSession();
   // 4. 執行個體化 mapper
   CustomApiMapper mapper = sqlSession.getMapper(CustomApiMapper.class);
   FlowAttachMapper flowAttachMapper = sqlSession.getMapper(FlowAttachMapper.class);
   return flowAttachMapper.selectById("9528");
   //return mapper.demo();
}           
private DbDriver buildDbDriver(String conn) {
   DbDriver dbDriver = new DbDriver();
   // 模拟 建構 參數
   if ("MYSQL".equals(code)) {
      dbDriver.setDriver("com.mysql.cj.jdbc.Driver");
      dbDriver.setConn("jdbc:mysql://x.x.x.x:3306/xxx?characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true");
      dbDriver.setUserName("xxx");
      dbDriver.setPasswd("xxx");
   } else if ("mysql".equals(code)) {
      dbDriver.setDriver("com.mysql.cj.jdbc.Driver");
      dbDriver.setConn("jdbc:mysql://x.x.x.x:3306/ooo?characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai");
      dbDriver.setUserName("ooo");
      dbDriver.setPasswd("ooo");
   }
   return dbDriver;
}           
@Component
public class SqlSessionFactoryUtil {
   private static final String ID = "development";
   /**
    * getSqlSessionFactory
    *
    * @param dbDriver
    * @return
    */
   public SqlSessionFactory getSqlSessionFactory(DbDriver dbDriver) {
      // 連接配接池
      DataSource dataSource = new PooledDataSource(dbDriver.getDriver(), dbDriver.getConn(), dbDriver.getUserName(), dbDriver.getPasswd());
      // 事務控制 隔離級别、自動送出等
      TransactionFactory transactionFactory = new JdbcTransactionFactory();
      // 環境配置 查詢特性
      Environment environment = new Environment(ID, transactionFactory, dataSource);
      // 建立配置
      MybatisConfiguration configuration = new MybatisConfiguration(environment);
      configuration.setMapUnderscoreToCamelCase(true);
      configuration.setCallSettersOnNulls(true);
      // 加入資源 Mapper
      configuration.addMapper(CustomApiMapper.class);
      configuration.addMapper(FlowAttachMapper.class);
      return new MybatisSqlSessionFactoryBuilder().build(configuration);
   }
}
           

以上實作方式 對于 形如:

XxxService extends com.baomidou.mybatisplus.extension.service.IService 
// 直接 service 調用 mp 通用接口
xxxService.list(wrapper)           

直接 通過 service 調用 mybatisplus 提供 通用接口 暫時 沒有 比較好的解決方案

希望 各位 大佬 能夠 指點迷津

找出實作 需求 最佳方案

繼續閱讀