在使用eclipse連接mysql資料庫時報異常: java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) at com.mysql.jdbc.SQLError.createSQLE ...
在使用eclipse連接mysql資料庫時報異常:
java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:943)
at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:4113)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1308)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2336)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2369)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2153)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305)
at java.sql.DriverManager.getConnection(DriverManager.java:571)
at java.sql.DriverManager.getConnection(DriverManager.java:233)
at cn.itcast.mybatis.jdbc.jdbcTest.main(jdbcTest.java:36)
jdk版本:1.7.0_79,mysql為5.7,使用mysql-connector-java-5.1.18.jar。
代碼如下:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * * @author lilia * */ public class jdbcTest { //mysql資料庫地址 private static final String url = "jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"; //mysql資料庫用戶名 private static final String username = "root"; //myslq資料庫密碼 private static final String password = "root"; public static void main(String[] args) { //資料庫連接 Connection connection = null; //預編譯的statement(使用預編譯的statement可以提高資料庫的性能) PreparedStatement preparedStatement = null; //結果集對象 ResultSet resultSet = null; try { //載入數據驅動 Class.forName("com.mysql.jdbc.Driver"); //通過驅動管理類獲取資料庫連接 connection = DriverManager.getConnection(url, username, password); //定義sql語句 String sql = "select * from user where username = ?"; //獲取預處理statement,並把sql放入到statement中。 preparedStatement = connection.prepareStatement(sql); //參數賦值,序號從1開始 preparedStatement.setString(1, "王五"); //向資料庫發出sql執行查詢,並返回查詢結果集 resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { System.out.println(resultSet.getString("id") + ":" + resultSet.getString("username")); } } catch (Exception e) { e.printStackTrace(); } finally { //釋放資源 if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if(preparedStatement != null){ try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } if(connection != null){ try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }View Code
執行後報錯如上。
網上搜索很多解決方案行不通,最終找到問題所在:root帳戶預設不開放遠程訪問許可權,所以需要修改一下相關許可權。,參考:https://blog.csdn.net/jack__love/article/details/79019049
具體解決步驟如下:
- 打開MySQL目錄下的my.ini文件(win10預設安裝在C:\ProgramData\MySQL\MySQL Server 5.7\my.ini),在文件的最後添加一行“skip-grant-tables”,保存並關閉文件。
- 重啟mysql服務,通過服務管理器(服務名稱:mysql57)或者cmd(>net stop mysql57 >net start mysql57)都行。
- 通過命令行進入MySQL的安裝目錄BIN下(WIN10預設安裝,BIN目錄為:C:\Program Files\MySQL\MySQL Server 5.7\bin,如果配置過mysql環境變數可不進入該目錄,直接執行命令),輸入“mysql -u root -p”(不輸入密碼),提示輸入密碼不用管,直接Enter回車即可進入資料庫。
- 執行“use mysql;”,使用mysql資料庫。
- 執行命令“update user set authentication_string=PASSWORD("root") where user='root';”(修改root的密碼)。
- 打開MySQL目錄下的my.ini文件,刪除最後一行的“skip-grant-tables”,保存並關閉文件。
- 重啟MySQL服務。
- 重新執行代碼,執行成功。
問題解決。