使用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也会报错。
我们这里需要区分大小写,所以这样写,如果不需要,直接用变量转换为大写即可,按照实际场景来就可以。