使用db2想指定schema,使用语句如下
jdbc:db2://" + hostname + ":" + port + "/" + databaseName + ":currentSchema=" + this.databaseSchema + ";";
切记:最后的分号一定要有,否则报错。
但是此处有个问题,就是如果schema实际不存在,直接testConnection也会连接成功。
这是因为,如下(gpt回答)
这样就会产生一个问题,当执行具体sql时,需要使用到具体schema时,程序就会报错。
具体可以如下操作
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DB2SchemaValidation {
public static void main(String[] args) {
// JDBC 连接参数
String url = "jdbc:db2://hostname:port/database";
String user = "username";
String password = "password";
String schema = "your_schema_name";
// JDBC 连接对象
Connection conn = null;
try {
// 建立连接
conn = DriverManager.getConnection(url, user, password);
// 验证指定 schema 是否存在
if (isSchemaExists(conn, schema)) {
System.out.println("Schema '" + schema + "' exists.");
} else {
System.out.println("Schema '" + schema + "' does not exist.");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭连接
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
// 验证指定 schema 是否存在的方法
private static boolean isSchemaExists(Connection conn, String schema) throws SQLException {
// 创建 Statement 对象
Statement stmt = conn.createStatement();
ResultSet rs = null;
try {
// 查询指定 schema 下是否存在表
rs = stmt.executeQuery("SELECT 1 FROM SYSIBM.SYSTABLES WHERE CREATOR = '" + schema + "' FETCH FIRST 1 ROWS ONLY");
return rs.next(); // 如果存在结果集,则说明 schema 存在
} finally {
// 关闭 ResultSet 和 Statement 对象
if (rs != null) {
rs.close();
}
stmt.close();
}
}
}
此处又有一个注意点,就是当在配置时,schema是需要区分大小写的;因为 isSchemaExists 方法中直接使用的单引号将schema拼接的。尤其是小写会出问题,因为DB2的schema一般是大写,如果是小写,schema找不到,sql也会报错。
我们这里需要区分大小写,所以这样写,如果不需要,直接用变量转换为大写即可,按照实际场景来就可以。