当前位置: 首页 > article >正文

【JDBC】JDBC常见错误处理方法及驱动的加载

MySQL8中数据库连接的四个参数有两个发生了变化

          String driver = "com.mysql.cj.jdbc.Driver";

String url = "jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai";

          或者String url = ".......serverTimezone=GMT%2B8";

错误1:Exception in thread "main" java.lang.ClassNotFoundException: com.mysql.jdbc2.Driver

原因:没有添加jar包或者com.mysql.jdbc2.Driver路径错误

错误2:Exception in thread "main" java.sql.SQLException:

No suitable driver found for jbdc:mysql://127.0.0.1:3306/stumgr

原因:url错误

 

错误3:Exception in thread "main" java.sql.SQLException:

Access denied for user 'root'@'localhost' (using password: YES)

原因:用户名或者密码错误

  错误4:Exception in thread "main" com.mysql.jdbc.exceptions

.jdbc4.MySQLIntegrityConstraintViolationException:Duplicate entry '90' for key 'PRIMARY'

原因:主键冲突

错误5:Public Key Retrieval is not allowed

如果用户使用 sha256_password 认证,密码在传输过程中必须使用 TLS 协议保护,但是如果 RSA 公钥不可用,可以使用服务器提供的公钥;可以在连接中通过 ServerRSAPublicKeyFile 指定服务器的 RSA 公钥,或者AllowPublicKeyRetrieval=True参数以允许客户端从服务器获取公钥;但是需要注意的是 AllowPublicKeyRetrieval=True可能会导致恶意的代理通过中间人攻击(MITM)获取到明文密码,所以默认是关闭的,必须显式开启

在jdbc连接添加上参数allowPublicKeyRetrieval=true即可,注意参数间用&

驱动的加载

加载数据库驱动时,我们可以通过自己创建一个实例的方式,然后去注册驱动

在查看Driver的源代码时我们发现,该类内部有一个静态代码块,在代码块中就是在实例化一个驱动并在驱动中心注册.静态代码块会在类进入内存时执行,也就是说,我们只要让该类字节码进入内存,就会自动完成注册,不需要我们手动去new

 

所以我们在代码中直接使用反射,通过Class.forName("com.mysql.jdbc.Driver"),加载该类进入内存即可

      我们继续查看jar包发现,jar包中已经默认配置了驱动类的加载

jar--META-INF--services--java.sql.Driver--com.mysql.jdbc.Driver,在加载jar包时,会自动读取该内容并加载驱动,所以我们不去编写Class.forName("com.mysql.jdbc.Driver"),程序也是可以自动完成加载驱动的

结合异常处理代码

  1. package com.msb.test1;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. /**
  7.  * @Author: Ma HaiYang
  8. * @Description: MircoMessage:Mark_7001
  9. */
  10. public class TestJDBC3 {
  11.     private static String driver ="com.mysql.cj.jdbc.Driver";
  12.     private static String url="jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
  13.     private static String user="root";
  14.     private static String password="root";
  15.     public static void main(String[] args)  {
  16.         Connection connection=null;
  17.         Statement statement=null;
  18.         try{
  19.             Class.forName(driver);
  20.             connection =DriverManager.getConnection(url, user,password);
  21.             statement = connection.createStatement();
  22.             String sql="insert into dept values(DEFAULT ,'助教部门','北京');";
  23.             int rows = statement.executeUpdate(sql);
  24.             System.out.println("影响数据行数为:"+rows);
  25.         }catch (Exception e){
  26.             e.printStackTrace();
  27.         }finally {
  28.             if(null != statement){
  29.                 try {
  30.                     statement.close();
  31.                 } catch (SQLException e) {
  32.                     e.printStackTrace();
  33.                 }
  34.             }
  35.             if(null != connection){
  36.                 try {
  37.                     connection.close();
  38.                 } catch (SQLException e) {
  39.                     e.printStackTrace();
  40.                 }
  41.             }
  42.         }
  43.     }
  44. }
http://www.lryc.cn/news/2378594.html

相关文章:

  • React中useState中更新是同步的还是异步的?
  • Vim编辑器命令模式操作指南
  • 车载以太网驱动智能化:域控架构设计与开发实践
  • 如何利用技术手段提升小学数学练习效率
  • C# DataGrid功能总览
  • BGP路由策略 基础实验
  • 第9讲、深入理解Scaled Dot-Product Attention
  • 2025B难题练习
  • 双向长短期记忆网络-BiLSTM
  • MySQL UPDATE 执行流程全解析
  • 亚马逊云科技:开启数字化转型的无限可能
  • Gartner《How to Leverage Lakehouse Design in Your DataStrategy》学习心得
  • 【实测有效】Edge浏览器打开部分pdf文件显示空白
  • RJ连接器的未来:它还会是网络连接的主流标准吗?
  • Redis持久化机制详解:保障数据安全的关键策略
  • shell脚本练习(6):备份MySQL数据库表
  • 深度学习模型基本框架
  • [Java][Leetcode middle] 134. 加油站
  • DeepSeek 大模型部署全指南:常见问题、优化策略与实战解决方案
  • 嵌入式培训之数据结构学习(五)栈与队列
  • RabbitMQ--进阶篇
  • Android Studio报错Cannot parse result path string:
  • matlab求矩阵的逆、行列式、秩、转置
  • 关于网站提交搜索引擎
  • 计算机视觉与深度学习 | Python实现EMD-SSA-VMD-LSTM-Attention时间序列预测(完整源码和数据)
  • 二进制与十进制互转的方法
  • 05、基础入门-SpringBoot-HelloWorld
  • LeetCode 153. 寻找旋转排序数组中的最小值:二分查找法详解及高频疑问解析
  • 基于QT(C++)OOP 实现(界面)酒店预订与管理系统
  • 人工智能100问☞第25问:什么是循环神经网络(RNN)?