これを行う理想的な方法は、リクエストからスキーマ関連情報をキャプチャしてThreadLocalに保存し、接続がリクエストされるたびにスキーマを設定することです。残念ながら、このアプローチを試したところ、setSchemaメソッドがまだドライバーに実装されていないことがわかりました。しかし、これを解決する別の方法(ハック)を見つけました。JDBIは、この問題を解決するためにここで使用できるステートメントLocatorを提供しています。
クエリパラメータでスキーマ名を送信するとします。ジャージリクエストフィルタを使用してスキーマ名を取得できます。
public class Schema {
public static ThreadLocal<String> name = new ThreadLocal<>();
}
public class SchemaNameFilter implements ContainerRequestFilter {
@Override
public ContainerRequest filter(ContainerRequest request) {
if(request.getQueryParameters().containsKey("schema")) {
Schema.name.set(request.getQueryParameters().get("schema").get(0));
}
return request;
}
}
これにより、すべてのリクエストでスキーマ名が取得されます。このファイラーをアプリケーションのブートストラップに登録します。
environment.jersey().property(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS, asList(new SchemaNameFilter()));
次に、このスキーマ情報を使用する2番目の部分を作成する必要があります。このSchemaRewriterを含めます
public class SchemaReWriter implements StatementLocator {
@Override
public String locate(String sql, StatementContext ctx) throws Exception {
if (nonNull(Schema.name.get())) {
sql = sql.replaceAll(":schema", Schema.name.get());
}
return sql;
}
}
すべてのスキーマにあるテーブル「users」にアクセスしたいとします。次のようにクエリを記述します。
@OverrideStatementLocatorWith(SchemaReWriter.class)
public interface UserDao {
@SqlQuery("select * from :schema.users")
public List<User> getAllUsers();
}
ステートメントリライターでDaoに注釈を付けることを忘れないでください。それで全部です。複数のスキーマについて心配する必要はありません。