欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Eclipse使用jdbc连接MySql数据库报:java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

程序员文章站 2022-04-28 20:23:09
在使用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();
                }
            }
        }
    }
}

 

执行后报错如上。

网上搜索很多解决方案行不通,最终找到问题所在:root帐户默认不开放远程访问权限,所以需要修改一下相关权限。,参考:

具体解决步骤如下:

  1. 打开mysql目录下的my.ini文件(win10默认安装在c:\programdata\mysql\mysql server 5.7\my.ini),在文件的最后添加一行“skip-grant-tables”,保存并关闭文件。
  2. 重启mysql服务,通过服务管理器(服务名称:mysql57)或者cmd(>net stop mysql57  >net start mysql57)都行。
  3. 通过命令行进入mysql的安装目录bin下(win10默认安装,bin目录为:c:\program files\mysql\mysql server 5.7\bin,如果配置过mysql环境变量可不进入该目录,直接执行命令),输入“mysql -u root -p”(不输入密码),提示输入密码不用管,直接enter回车即可进入数据库。
  4. 执行“use mysql;”,使用mysql数据库。
  5. 执行命令“update user set authentication_string=password("root") where user='root';”(修改root的密码)。
  6. 打开mysql目录下的my.ini文件,删除最后一行的“skip-grant-tables”,保存并关闭文件。
  7. 重启mysql服务。
  8. 重新执行代码,执行成功。

 Eclipse使用jdbc连接MySql数据库报:java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

问题解决。