【问题标题】:Can't Connect to Database from Java program无法从 Java 程序连接到数据库
【发布时间】:2013-12-21 14:10:57
【问题描述】:

我安装了 MySQL 数据库和 JDBC。我通过 MySQL 命令行客户端创建了一个名为 feedback 的数据库,我想通过 java 程序访问该数据库。

这是我在 MySQL 命令行客户端上使用的命令创建数据库。

create database feedback;
use feedback; 
CREATE USER sqluser IDENTIFIED BY 'sqluserpw'; 

grant usage on *.* to sqluser@localhost identified by 'sqluserpw'; 
grant all privileges on feedback.* to sqluser@localhost; 
CREATE TABLE COMMENTS (id INT NOT NULL AUTO_INCREMENT, 
MYUSER VARCHAR(30) NOT NULL);
INSERT INTO COMMENTS values (default, 'lars');

然后,Java 中的代码:

package de.vogella.mysql.first;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;

import javax.swing.JOptionPane;


public class MYSQLACCESS {
private Connection connect = null;
  private Statement statement = null;
  private PreparedStatement preparedStatement = null;
  private ResultSet resultSet = null;


  public void readDataBase() throws Exception {

      JOptionPane.showMessageDialog(null, "Before try" );
      try {
      // This will load the MySQL driver, each DB has its own driver
      Class.forName("com.mysql.jdbc.Driver");
      // Setup the connection with the DB
      JOptionPane.showMessageDialog(null, "1" );

      connect = DriverManager.getConnection("jdbc:mysql://localhost/feedback?"
              + "user=sqluser&password=sqluserpw");


      // Statements allow to issue SQL queries to the database
      statement = connect.createStatement();
      // Result set get the result of the SQL query
      resultSet = statement.executeQuery("select * from FEEDBACK.COMMENTS");
    //  writeResultSet(resultSet);

      String my_user = resultSet.getString("MYUSER");
      System.out.println(my_user);
      JOptionPane.showMessageDialog(null, my_user );
    } catch (Exception e) {
        throw e;
      } 

    }
  }

主类:

package de.vogella.mysql.first;
import de.vogella.mysql.first.MYSQLACCESS;

public class Main {
public static void main(String[] args) throws Exception {
MYSQLACCESS first_access = new MYSQLACCESS();
first_access.readDataBase();
}

}

但是,我得到以下异常:

Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:              
 Access denied for user 'sqluser'@'localhost' to database 'feedback'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4237)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4169)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:928)
at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1750)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1290)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2493)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2526)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2311)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:834)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:416)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:347)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at de.vogella.mysql.first.MYSQLACCESS.readDataBase(MYSQLACCESS.java:30)
at de.vogella.mysql.first.Main.main(Main.java:7)

我正在关注下面link中的教程

有什么帮助吗?

【问题讨论】:

  • 确保 sqluser@localhost 有权限访问数据库反馈
  • 检查我写的第一个代码块,就是我创建数据库的方式,有什么遗漏吗?
  • 参考:(权限变更生效时)[dev.mysql.com/doc/refman/5.6/en/privilege-changes.html]
  • @Ravinder 从你的 url 好友那里拿走 ]
  • @яша 很多时候我在 cmets 编辑工具实现中发现了一个错误。

标签: java mysql database jdbc


【解决方案1】:

用户sqluser没有访问localhost上的数据库feedback的权限。

对用户使用mysql command line toolgrant 的权限。

别忘了flush privileges

【讨论】:

    【解决方案2】:

    通常在出现此异常时:

    用户'sqluser'@'localhost'拒绝访问数据库'feedback'

    表示这个用户没有足够的权限访问数据库,我建议你做的是去你的 SQL shell 并编写这个命令:

    show grants;
    

    它会显示哪些用户可以访问数据库以及他们的权限级别

    如果此用户似乎没有访问数据库的必要权限,您可以通过在 SQL Shell 中编写此查询来授予他权限

    GRANT ALL PRIVILEGES ON *.* TO 'sqluser'@'localhost' WITH GRANT OPTION;
    

    祝你好运;

    【讨论】:

    • 我知道但我猜他是在测试状态
    猜你喜欢
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    相关资源
    最近更新 更多