Java 连接到用户输入数据库

Java 连接到用户输入数据库,java,mysql,Java,Mysql,我有一个Connect()方法,它有一个字符串参数,这个参数是用户输入的。我创建了两个数据库:test和test2,但我只能从用户输入连接到testdb。我是否应该更改托管2个数据库的服务器,以便能够连接到用户编写的任何数据库 public void Connect(String DataBase) { try{ Class.forName("com.mysql.jdbc.Driver"); con =

我有一个Connect()方法,它有一个字符串参数,这个参数是用户输入的。我创建了两个数据库:test和test2,但我只能从用户输入连接到testdb。我是否应该更改托管2个数据库的服务器,以便能够连接到用户编写的任何数据库

  public void Connect(String DataBase) {
            try{
                Class.forName("com.mysql.jdbc.Driver");
                con = DriverManager.getConnection("jdbc:mysql://localhost:3306/" + DataBase);
                st = con.createStatement();
                System.out.println("Connected to " + DataBase + " !!!");
                con.close();
            }catch(SQLException se){
                System.out.println("Cannot connect to database " + DataBase);
            }
            catch(Exception ex){
                System.out.println("Error: " + ex);
            }  
        }
主要方法

   // DB1Connect connect = new DBConnect("test");
    //connect.getData();

    Scanner scanner = new Scanner(System.in);
    System.out.println("Choose from these choices");
    System.out.println("-------------------------\n");
    System.out.println("1 - Connect to a specific DB schema");
    System.out.println("2 - List DB schema structure: tables, fields, types");
    System.out.println("3 - List table structure: fields, types");
    System.out.println("4 - Quit");
    int choice = scanner.nextInt();
     switch(choice) {
         case 1:
             System.out.println("Enter the Db's name:");
             String dbName = scanner.next();
             DBConnect connect = new DBConnect();
             connect.Connect(dbName);
             break;
         case 2:

             break;
         default:
             System.out.println("Incorrect option");
     }
}
堆栈跟踪:

Enter the Db's name: test2 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied for user ''@'localhost' to database 'test2' Cannot connect to database test2 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:422) at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) at com.mysql.jdbc.Util.getInstance(Util.java:381) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:910) at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3923) at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1273) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2031) at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:718) at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:46) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:422) at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282) at java.sql.DriverManager.getConnection(DriverManager.java:664) at java.sql.DriverManager.getConnection(DriverManager.java:270) at medapp.DBConnect.Connect(DBConnect.java:19) at medapp.MedApp.main(MedApp.java:29) 输入数据库的名称: 测试2 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:拒绝用户“@'localhost”访问数据库“test2” 无法连接到数据库test2 位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 位于java.lang.reflect.Constructor.newInstance(Constructor.java:422) 位于com.mysql.jdbc.Util.HandleneInstance(Util.java:406) 位于com.mysql.jdbc.Util.getInstance(Util.java:381) 位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030) 位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) 在com.mysql.jdbc.MysqlIO.checkErrorPacket上(MysqlIO.java:3491) 在com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)上 在com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:910)上 位于com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3923) 位于com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1273) 位于com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2031) 位于com.mysql.jdbc.ConnectionImpl(ConnectionImpl.java:718) JDBC4Connection.(JDBC4Connection.java:46) 位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 位于java.lang.reflect.Constructor.newInstance(Constructor.java:422) 位于com.mysql.jdbc.Util.HandleneInstance(Util.java:406) 位于com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302) 位于com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282) 位于java.sql.DriverManager.getConnection(DriverManager.java:664) 位于java.sql.DriverManager.getConnection(DriverManager.java:270) 位于medapp.DBConnect.Connect(DBConnect.java:19)
在medapp.medapp.main(medapp.java:29)上,堆栈跟踪告诉您存在SQLSyntax错误。使用此选项可以追溯错误。在这种情况下,StackTrace中的最后X2行:

位于medapp.DBConnect.Connect(DBConnect.java:19)
位于medapp.medapp.main(medapp.java:29)

告诉您使用“main”和“Connect”方法的“medapp”类有错误

我可以建议您将数据库连接包含到彼此不同的类吗?另一种方法是使用
.close()
方法关闭所有连接

不同的类别


如果您计划在运行时返回主表或交换表,我建议在进行转换之前添加一个
finally
块来关闭连接


上述方法的替代方法是在主类中为每个连接指定一个方法,并使用一个方法关闭连接以重新连接


编辑

根据回复,我强烈建议检查两个表的状态。安装MySQL工作台(已找到)并使用它连接到数据库。这将有助于调试连接问题


我还建议您检查一下代码,确保SQL语句中没有拼写错误。

与服务器建立连接后,尝试连接到数据库

  public void Connect(String DataBase) {
            try{
                Class.forName("com.mysql.jdbc.Driver");
                con = DriverManager.getConnection("jdbc:mysql://localhost:3306/");
                st = con.createStatement();
                st.execute("USE " + "[" + DataBase + "]");
                System.out.println("Connected to " + DataBase + " !!!");
                con.close();
            }catch(SQLException se){
                System.out.println("Cannot connect to database " + DataBase);
            }
            catch(Exception ex){
                System.out.println("Error: " + ex);
            }  
        }
数据库是否需要身份验证?如果是这样,请尝试以下方法:

Properties connProperties;
connProperties = new Properties();
connProperties.setProperty("user", getUsername());
connProperties.setProperty("password",getPassword());

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/" + DataBase, connProperties);
另外,检查数据库是否存在也是一个好主意

stat.executeQuery("SELECT * FROM sys.sysdatabases");

为什么你说你只能连接到
test
数据库?如果用户输入
test2
,会发生什么情况?抛出异常并在此处输入catch(SQLException se){System.out.println(“无法连接到数据库”+数据库);}当输入为test时,它将打印连接到test!!!将
se.printStackTrace()
添加到该
catch
并将完整堆栈跟踪复制到您的问题中如何?问题下有一个
edit
链接。编写类似“这是堆栈跟踪”的内容,然后粘贴堆栈跟踪,然后在其开头添加
,在其结尾添加
,以对其进行格式化。无身份验证,两个数据库运行在同一本地服务器上,尝试设置当前数据库的范围,但仍然只有测试通过con=lineyes,但这意味着我必须为我拥有的每一个数据库设置一个if stmt,我有点想让用户选择他想要连接的数据库…我不认为问题是因为连接没有关闭,我启动程序并首先设置test2,什么都没有..如果你可以连接到其中一个数据库而不是另一个数据库,我建议调查一下数据库本身。确保没有身份验证(如果有,则说明身份验证)。如果数据库已联网,请尝试(在windows上)Telnet以查看服务器是否联机。另外,看看您的版本是否支持并发服务器连接;创建数据库test2;没有身份验证,服务器处于联机状态,仍然可能是服务器不支持并发性…这取决于您拥有的许可证,可能是真的。正如我所说的,检查MySQL的网站并阅读您拥有的许可证。很抱歉回复太晚,我自己也在做项目
stat.executeQuery("SELECT * FROM sys.sysdatabases");