数据源与 DatabaseInfo
DatabaseInfo
Rabbit SQL 通过 DatabaseInfo 识别当前数据库:
DatabaseInfo info = baki.databaseInfo();
String dbName = info.getName();
String version = info.getVersion();
动态 SQL 中也可以访问:
-- #if :_databaseId.name == 'postgresql'
...
-- #fi
DatabaseInfoProvider
当使用动态数据源时,默认的 databaseInfo() 可能无法返回准确结果。实现 DatabaseInfoProvider 并注册为 Bean,可以实时解析当前数据源:
@Component
public class DynamicDatabaseInfoProvider implements DatabaseInfoProvider {
private final Map<String, DatabaseInfo> cache = new ConcurrentHashMap<>();
@Override
public DatabaseInfo resolve(DataSource dataSource, Supplier<DatabaseInfo> supplier) {
if (dataSource instanceof DynamicDataSource dynamicDataSource) {
String key = DynamicDataSourceContextHolder.peek();
return cache.computeIfAbsent(key, k -> supplier.get());
}
return null;
}
}
详细说明见 整合动态数据源。
多 Baki 实例
Spring 容器中存在多个 Baki 实例时,XQL 接口映射可以使用 @Baki 指定底层依赖:
@Baki("slaveBaki")
@XQLMapper("slave")
public interface SlaveMapper {
}