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