データベース接続の壁を突破!JDBCでPostgreSQLスキーマを指定する
JDBC で PostgreSQL に接続時にスキーマを指定することは可能ですか?
方法:
- 接続 URL: 接続 URL に
currentSchema
パラメータを追加することで、デフォルトのスキーマを指定できます。
例:
String url = "jdbc:postgresql://localhost:5432/mydb?currentSchema=public";
- DriverManager.getConnection():
DriverManager.getConnection()
メソッドの 4 番目の引数にスキーマ名を指定できます。
Connection conn = DriverManager.getConnection(
"jdbc:postgresql://localhost:5432/mydb",
"postgres",
"password",
"public"
);
- PooledDataSource:
PooledDataSource
を使用している場合は、setSchemaName()
メソッドを使用してスキーマを指定できます。
PooledDataSource ds = new PooledDataSource();
ds.setDriverClassName("org.postgresql.Driver");
ds.setUrl("jdbc:postgresql://localhost:5432/mydb");
ds.setUsername("postgres");
ds.setPassword("password");
ds.setSchemaName("public");
Connection conn = ds.getConnection();
注意事項:
- スキーマ名を指定しないと、デフォルトのスキーマ (
public
) が使用されます。 - 接続 URL に
currentSchema
パラメータとschema
パラメータの両方を指定すると、schema
パラメータが優先されます。 - PostgreSQL 9.3 以前を使用している場合は、
currentSchema
パラメータは使用できません。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JdbcPostgreSQLSchema {
public static void main(String[] args) throws SQLException {
// 接続情報
String url = "jdbc:postgresql://localhost:5432/mydb";
String user = "postgres";
String password = "password";
String schema = "public";
// 接続
Connection conn = DriverManager.getConnection(url, user, password);
// スキーマ設定
Statement stmt = conn.createStatement();
stmt.execute("SET search_path TO " + schema);
// クエリ実行
ResultSet rs = stmt.executeQuery("SELECT * FROM customers");
// 結果処理
while (rs.next()) {
System.out.println(rs.getString("name"));
}
// 接続クローズ
rs.close();
stmt.close();
conn.close();
}
}
ポイント:
SET search_path TO
ステートメントを使用して、スキーマを設定しています。- クエリを実行する前に、スキーマが設定されていることを確認する必要があります。
JDBC で PostgreSQL に接続時にスキーマを指定する他の方法
DriverManager.getConnection()
メソッドの 3 番目の引数に Properties
オブジェクトを渡すことで、接続プロパティを設定できます。Properties
オブジェクトには、currentSchema
キーを使用してスキーマを指定できます。
Properties props = new Properties();
props.setProperty("currentSchema", "public");
Connection conn = DriverManager.getConnection(
"jdbc:postgresql://localhost:5432/mydb",
"postgres",
"password",
props
);
DataSource ds = new BasicDataSource();
ds.setDriverClassName("org.postgresql.Driver");
ds.setUrl("jdbc:postgresql://localhost:5432/mydb");
ds.setUsername("postgres");
ds.setPassword("password");
ds.setSchemaName("public");
Connection conn = ds.getConnection();
JNDI を使用して接続を作成する場合、java:comp/env/jdbc/mydb
のような JNDI 名を使用してスキーマを指定できます。
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mydb");
Connection conn = ds.getConnection();
これらの方法は、上記で紹介した方法よりも複雑ですが、より柔軟な接続設定が可能です。
java database postgresql