JDBC连接到主机但不连接到数据库

时间:2015-06-01 16:31:43

标签: java sql jdbc

我正在创建一个可以管理mySql数据库的应用程序,首先我希望用户通过提供主机名,用户名和密码来连接到主机。这是我的代码:

try {
        Class.forName(ServerConnect.JDBC_DRIVER);

    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        System.out.println("Cannot register JDBC Driver...");
    }

    try {
        conn = DriverManager.getConnection("jdbc:mysql://"
                + toServer.getHostname() + "/hrmanagement?" + "user=" + toServer.getUsername()
                + "&password=" + toServer.getPassword());
        System.out.println("Connected to the server!");
    } catch (SQLException e) {
        System.out
                .println("Not Connected to the server. Make sure username or password is correct!");
    }

我的问题是,如何在不指定数据库的情况下进行连接,以便我可以让用户选择可以连接的数据库。我试过删除“/ hrmanagement?”但它没有连接到服务器。我该怎么办?

2 个答案:

答案 0 :(得分:2)

来自documentation

  

MySQL Connector / J的JDBC URL格式如下,方括号([,])中的项是可选的:

     

jdbc:mysql://[host][,failoverhost...][:port]/[database] » [?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]...

因此,请删除hrmanagement,请注意/?user...部分仍然存在

答案 1 :(得分:1)

  

我的问题是,如何在不指定数据库的情况下进行连接   我可以让我的用户选择他可以连接到哪个数据库。一世   试图删除" / hrmanagement?"但它没有连接到服务器。   我该怎么办?

将问号移至"?user ="。我认为另一个答案是正确的。

在更改数据库方面,我相信您可以使用setCatalog()来使用不同的数据库。

从连接页面:

  

void setCatalog(String catalog)            抛出SQLException

     

设置给定的目录名称以选择此子空间   连接对象的工作数据库。

     

如果驱动程序不支持目录,它将默默忽略它   请求。

     

调用setCatalog对以前创建或准备没有影响   声明对象。它是实现定义DBMS是否准备   Connection方法时立即进行操作   调用prepareStatement或prepareCall。为了最大的便携性,   应在创建或准备Statement之前调用setCatalog。

     

参数:       catalog - 要在其中工作的目录的名称(此Connection对象的数据库中的子空间)抛出:       SQLException - 如果发生数据库访问错误或在已关闭的连接上调用此方法另请参见:       getCatalog()

使用这个版本的呼叫可能会更容易,但不那么令人困惑

public static Connection getConnection(String url,
                                       String user,
                                       String password)
                                throws SQLException

所以你的代码看起来像

try {
    conn = DriverManager.getConnection("jdbc:mysql://" + toServer.getHostname(),
           toServer.getUsername(),
           toServer.getPassword());

    conn.setCatalog("someDifferentDB");

    System.out.println("Connected to the server!");

} catch (SQLException e) {
    System.out.println(e.toString());
}

作为旁注,getConnection将尝试为您加载JDBC驱动程序,因此您并不需要整个Class.forName try / catch块。这是旧代码的遗迹,大多数现代JDBC驱动程序都不需要它。还有一些人需要它,但我相信mysql符合更新的风格。只需确保驱动程序位于命令行的类路径中

  

java -cp \ path \ to \ mysql \ driver \ driver.jar myProgram