开发环境
maven3.9.2
tomcat9.0.75
mysql8.0.33
eclipse:2023-3
在eclipse中建立web app的maven项目,方法参考本博主博文
(9条消息) eclipse创建webapp 类型的maven项目_eclipse新建maven的web工程_whitesnow2020的博客-CSDN博客
在生成的src/test/java 目录中新建一个测试数据库连接的类DBTest.java,代码如下
import com.mysql.jdbc.Driver;
import java.sql.*;
import org.junit.Test;
public class DBTest {
// MySQL8.0以下版本 - JDBC驱动名及数据库URL
static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
// test为数据库名,?后面这句很重要,设置useSSl=false
static final String DB_URL = "jdbc:mysql://localhost:3306/blogs?characterEncoding=UTF8&autoReconnect=true&useSSL=false";
// 数据库的用户名与密码,需要根据自己的设置
static final String USER = "root";
static final String PASS = "123456";
@Test
public void testDBConn() {
Connection conn = null;
Statement stmt = null;
try{
// 注册 JDBC 驱动,加载驱动
Class.forName(JDBC_DRIVER);
// 打开链接,连接数据库
System.out.println("数据库连接中...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
// 执行查询
System.out.println(" 实例化Statement对象...");
stmt = conn.createStatement();
String sql;
sql = "SELECT userId,userName, password FROM userinfo";
ResultSet rs = stmt.executeQuery(sql);
// 展开结果集数据库
while(rs.next()){
// 通过字段检索
int id = rs.getInt("userId");
String name = rs.getString("userName");
String url = rs.getString("password");
// 输出数据
System.out.println("userid: " + id);
System.out.println(", 姓名: " + name);
System.out.println(", 密码: " + url);
System.out.println("\n");
}
// 完成后关闭
rs.close();
stmt.close();
conn.close();
}catch(SQLException se){
// 处理 JDBC 错误
se.printStackTrace();
}catch(Exception e){
// 处理 Class.forName 错误
e.printStackTrace();
}finally{
// 关闭资源
try{
if(stmt!=null) stmt.close();
}catch(SQLException se2){
}// 什么都不做
try{
if(conn!=null) conn.close();
}catch(SQLException se){
se.printStackTrace();
}
}
System.out.println("操作结束!");
}
}
然后单击RUN-->RUN AS-->JUnit Test菜单,就会在下面的Console控制台中出现如下错误
Public Key Retrieval is not allowed
百度发现:造成这个错误的原因是MySQL版本的更改,它在MySQL 8中引入了一些新的安全特性。
解决方法
方法一:设置allowPublicKeyRetrieval=true
该错误的一个简单的解决方法是在MySQL连接字符串中设置allowPublicKeyRetrieval=true
。
static final String DB_URL = "jdbc:mysql://localhost:3306/blogs?characterEncoding=UTF8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true";
再次运行该测试类,结果如下
数据库连接中...
实例化Statement对象...
userid: 1
, 姓名: admin
, 密码: admin
userid: 50
, 姓名: lllll
, 密码: cxmll
userid: 51
, 姓名: mmm
, 密码: cxm
操作结束!
参考链接:MySQL 在Java中使用MySQL进行连接时 : Public Key Retrieval is not allowed错误|极客笔记 (deepinout.com)