MySQL远程连接提示Accesss denied for user 'root'@'此处为你自己的ip'(using password:YES)

本文介绍了一种常见的数据库远程连接失败的情况,原因是使用了root用户。通过创建新用户并授予远程访问权限的方法解决了该问题。

昨天在服务器上配置了一个数据库,可是不论如何也连不上,数据库权限也开了,服务器防火墙也关了,但就是连不上,报如下错误,如图
这里写图片描述

今天终于找到解决办法了
不能连接主要是因为数据库的用户名是root,所以会被拒绝连接

解决办法就是新建一个用户,比如TestUser
然后再给TestUser授权远程访问,即:
mysql>GRANT ALL PRIVILEGES ON *.* TO 'TestUser'@'%' IDENTIFIED BY '此处为TestUser的密码’' WITH GRANT OPTION;

即可远程连接数据库

<think>我们正在讨论Java连接Access数据库的方法。根据引用内容,有两种主要方法:JDBC-ODBC桥接(在较新的Java版本中已不再支持)和纯JDBC连接。 引用[1]提到,Java SE 1.8不支持ODBC连接方式,因此需要使用JDBC连接,并下载一个JDBC驱动包(例如Access_JDBC30.jar)。 引用[2]展示了一个使用JDBC-ODBC桥接的示例(尽管引用[1]说明新环境不支持,但这里作为历史方法参考),它使用了`sun.jdbc.odbc.JdbcOdbcDriver`,这个驱动在Java 8中已经被移除。 引用[3]展示了使用纯JDBC连接后执行查询并处理结果集的方法。 因此,目前推荐使用纯JDBC连接方式。步骤如下: 1. 下载并添加Access JDBC驱动包(如`Access_JDBC30.jar`)到项目的类路径中。 2. 加载JDBC驱动类。 3. 建立数据库连接,需要指定连接URL。 4. 创建Statement对象并执行SQL查询。 5. 处理结果集。 6. 关闭连接。 注意:纯JDBC连接的URL格式通常为:`jdbc:ucanaccess://<数据库文件路径>`,但根据提供的引用,并没有明确使用UCanAccess(另一种常用的Access JDBC驱动),而是提到了一个特定的驱动包(Access_JDBC30.jar)。因此,我们需要根据所使用的具体驱动来确定URL和驱动类名。 然而,常见的是使用UCanAccess驱动,因为它是一个开源的Access数据库驱动程序。如果使用UCanAccess,步骤如下: 1. 下载UCanAccess驱动(包括ucanaccess-5.0.1.jar及其依赖包:libs/commons-lang3-3.8.1.jar, libs/commons-logging-1.2.jar, libs/hsqldb-2.5.0.jar, libs/jackcess-3.0.1.jar),并将所有jar包添加到项目中。 2. 使用以下代码连接: ```java import java.sql.*; public class AccessTest { public static void main(String[] args) { String path = "F:/ge/123.mdb"; // 数据库文件路径 String url = "jdbc:ucanaccess://" + path; try (Connection conn = DriverManager.getConnection(url); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM Roche_position")) { while (rs.next()) { System.out.println(rs.getString("cname")); } } catch (SQLException e) { e.printStackTrace(); } } } ``` 但是,根据引用[1]提到的驱动包(Access_JDBC30.jar),可能是另一个驱动。由于该驱动不是标准驱动,我们需要确认其驱动类名和URL格式。通常,如果是net.ucanaccess.jdbc.UcanaccessDriver,则与上面的示例相同。但如果是其他驱动,则需按照其文档。 若使用Access_JDBC30.jar,根据经验,其驱动类名可能是`com.hxtt.sql.access.AccessDriver`,URL格式为`jdbc:Access:///<数据库文件路径>`(例如:`jdbc:Access:///F:/ge/123.mdb`)。但具体需要查阅该驱动包的文档。 因此,如果使用的是Access_JDBC30.jar,连接示例: ```java Class.forName("com.hxtt.sql.access.AccessDriver"); // 加载驱动 Connection conn = DriverManager.getConnection("jdbc:Access:///F:/ge/123.mdb"); ``` 然而,由于该驱动不是广泛使用的,且引用[2]中使用了ODBC方式(已过时),引用[3]没有给出连接部分,因此我们更推荐使用UCanAccess。 总结:推荐使用UCanAccess驱动连接Access数据库,因为它是最新且维护良好的解决方案。具体步骤为: 1. 下载UCanAccess及其依赖的jar包,并添加到项目。 2. 使用连接URL:`jdbc:ucanaccess://<数据库文件的绝对路径>` 3. 无需显式加载驱动(从Java 6开始,DriverManager会自动加载驱动),但为了兼容性,也可以使用`Class.forName("net.ucanaccess.jdbc.UcanaccessDriver")`。 如果使用Access_JDBC30.jar,则按如下方式: 1. 将Access_JDBC30.jar添加到项目。 2. 加载驱动类:`Class.forName("com.hxtt.sql.access.AccessDriver")` 3. 连接URL:`jdbc:Access:///<数据库文件路径>`(注意:路径分隔符用正斜杠,且有三个斜杠) 注意:路径中如果有空格等特殊字符,需要进行URL编码。 由于引用中并未明确驱动包的具体使用方式,这里给出两种可能,但优先推荐UCanAccess。 下面是一个使用UCanAccess的完整示例: ```java import java.sql.*; public class AccessExample { public static void main(String[] args) { // 数据库路径,注意:使用绝对路径 String dbPath = "C:/path/to/your/database.accdb"; // 或者.mdb文件 // JDBC URL String url = "jdbc:ucanaccess://" + dbPath; try { // 1. 加载驱动(可选,自动加载机制下可以省略) // Class.forName("net.ucanaccess.jdbc.UcanaccessDriver"); // 2. 建立连接 Connection conn = DriverManager.getConnection(url); // 3. 创建Statement Statement stmt = conn.createStatement(); // 4. 执行查询 ResultSet rs = stmt.executeQuery("SELECT * FROM YourTable"); // 5. 处理结果集 while (rs.next()) { // 假设有一列名为"name" System.out.println(rs.getString("name")); } // 6. 关闭资源 rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 对于使用Access_JDBC30.jar的示例: ```java import java.sql.*; public class AccessExample2 { public static void main(String[] args) { try { // 1. 加载驱动 Class.forName("com.hxtt.sql.access.AccessDriver"); // 2. 建立连接,注意URL格式 Connection conn = DriverManager.getConnection("jdbc:Access:///C:/path/to/your/database.mdb"); // ... 后续与上面相同 ... } catch (Exception e) { e.printStackTrace(); } } } ``` 请根据实际使用的驱动选择合适的方法。由于ODBC桥接在Java 8中已被移除,因此不再推荐。 注意:如果使用Access 2007及以上版本(.accdb文件),UCanAccess支持,而某些旧驱动可能不支持。 因此,强烈建议使用UCanAccess。 </think>### Java连接Access数据库的实现方法 在Java中连接Access数据库主要有两种方法,下面我将详细介绍每种方法的实现步骤: --- ### 方法一:JDBC-ODBC桥接(已过时) 这是早期Java版本连接Access的方式,**从Java 8开始已不再支持**。仅供历史参考: ```java try { // 数据库路径需要替换成实际路径 String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=F://path//database.mdb"; // 加载驱动(Java 8+不再支持) Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection conn = DriverManager.getConnection(url); Statement sta = conn.createStatement(); ResultSet res = sta.executeQuery("SELECT * FROM table"); while(res.next()) { System.out.println(res.getString("column_name")); } res.close(); sta.close(); conn.close(); } catch(Exception e) { e.printStackTrace(); } ``` ⚠️ **注意**:此方法在Java 8及以上版本会报`ClassNotFoundException`,官方已移除ODBC桥接支持[^1][^2]。 --- ### 方法二:纯JDBC驱动(推荐方案) 使用第三方JDBC驱动(如UCanAccess),支持最新Java版本: 1. **添加依赖**: - 下载驱动包:`ucanaccess-5.0.1.jar` + 依赖包(jackcess, hsqldb等) - Maven依赖: ```xml <dependency> <groupId>net.sf.ucanaccess</groupId> <artifactId>ucanaccess</artifactId> <version>5.0.1</version> </dependency> ``` 2. **连接代码**: ```java import java.sql.*; public class AccessDemo { public static void main(String[] args) { String dbPath = "F:/path/database.accdb"; // 数据库文件路径 try { // 1. 注册驱动(可选,Java 6+自动加载) Class.forName("net.ucanaccess.jdbc.UcanaccessDriver"); // 2. 建立连接 String url = "jdbc:ucanaccess://" + dbPath; Connection conn = DriverManager.getConnection(url); // 3. 执行查询 Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM Roche_position"); // 4. 处理结果 List<String> names = new ArrayList<>(); while(rs.next()) { names.add(rs.getString("cname")); } // 5. 关闭资源 rs.close(); stmt.close(); conn.close(); // 使用结果集 names.forEach(System.out::println); } catch (Exception e) { e.printStackTrace(); } } } ``` --- ### 关键要点 1. **驱动选择**: - 推荐 UCanAccess(开源免费)或 Access_JDBC30(商业驱动) - UCanAccess 支持 `.mdb` 和 `.accdb` 格式文件 2. **路径处理**: - 绝对路径格式:`jdbc:ucanaccess://C:/database.mdb` - 网络路径:`jdbc:ucanaccess:////server/share/db.accdb` 3. **结果集处理**: ```java ResultSet rs = stmt.executeQuery("SELECT name FROM users"); List<String> userNames = new ArrayList<>(); while(rs.next()) { userNames.add(rs.getString("name")); } ``` 4. **事务控制**: ```java conn.setAutoCommit(false); // 关闭自动提交 // 执行多个操作... conn.commit(); // 提交事务 ``` --- ### 常见问题解决 - **文件锁定问题**:确保Access文件未被其他程序打开 - **32/64位冲突**:JDK与Access驱动需保持相同位数 - **特殊字符处理**:路径含空格时需URL编码 - **连接ACCDB文件**:UCanAccess支持新版.accdb格式
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

打代码的苏比特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值