需求闡述:
根據前端入參(例如: conn=MYSQL 或者 conn=ORACLE 等等) 實作動态切換 多資料源 連接配接不同的資料庫 進行 增删查改 等相關操作
實作步驟:
- 根據前端入參 conn 值 擷取 資料庫 相關連接配接資訊 如: driver/url/userName/passwd等等
- 根據 資料庫連接配接資訊 擷取 SqlSessionFactory
- 擷取 SqlSession
- 執行個體化 Mapper
- 執行 增删查改 相關操作
補充:
關于資料庫連接配接資訊 和 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 提供 通用接口 暫時 沒有 比較好的解決方案
希望 各位 大佬 能夠 指點迷津
找出實作 需求 最佳方案