MySQL JDBC驱动版本与数据库版本的对应关系及注意事项
MySQL JDBC驱动版本与数据库版本的对应关系及注意事项
事情发生
学了三遍的servlet,经典老师又教的第一万遍登陆注册,并且让实现,并且让演示,我们老师可能和之前的小学期公司老师
完全没有沟通过,我们小学期大作业都做了一个小项目出来还搁这登陆注册。
就把五个月前写的一个小项目拿出来,是一个类似菜鸟教程的网站,不过只有java的教程,这都是后话,
项目地址为:https://gitee.com/zxeao/Study_Station.git
大佬有兴趣可以看看
里面有登录注册,就想着跑一下,给老师演示演示得了,问题出现了,因为之前的服务器过期了,我把数据库环境搭在自己的电脑上,跑起来之后,后台报错,前端登录也是500错误,这就奇了怪了。
错误缘由
前端报错如下:

这谁受得了,自己亲生的项目在自己手里跑不起来,于是研究了一下报错,
java.sql.SQLException: The server time zone value '???ú±ê×??±??' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:76)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:835)
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:455)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:199)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
at utils.DBHelper.getConnection(DBHelper.java:27)
at DAO.UserDao.queryLogin(UserDao.java:22)
at Controller.loginController.doPost(loginController.java:29)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
发现问题的根源就在DBHelper包,数据库没有链接上,我在idea还是在navicat上都能连接上,正当我百思不得其解,突然想到老师讲过,mysql对应的jdbc驱动版本的问题。
查阅相关资料之后,得知是由于jdbc驱动包引发的问题,我之前服务器上的MySQL版本是8+版本,我查看了现在本机的MySQL版本

果然,版本不一致,我之前在maven里面配置的也是8.0.15的驱动版本,正想着去找5+数据库的驱动版本,打开我的pom一看,

这不就有么?之前做的准备足了现在就不用坐牢了。
解决方法
于是把MySQL驱动的版本换成5.1.38,

更新之后,正当我满心欢喜的等待跑起来,正常登录一下的时候,问题又出现了
java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1291)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:375)
at utils.DBHelper.getConnection(DBHelper.java:24)
at DAO.UserDao.queryLogin(UserDao.java:22)
at Controller.loginController.doPost(loginController.java:29)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
不是,现在版本也对应上了,为什么还会报错,跑不起来呢?
问题就在
com.mysql.cj.jdbc.Driver
大家肯定还见过
com.mysql.jdbc.Driver
这俩区别在哪,大家看我最下面的注意事项。
就是这俩的问题,当我把cj去掉之后,就跑起来了

只能说确实好看。
版本对应
所以我简单做了个整理,把驱动版本和MySQL数据库版本做个可用性对应。
| mysql-connector-java | MySQL | JDK | 补充 |
|---|---|---|---|
| 8.0.x | 5.6、5.7、8.0 4.2 | JDK 8.0或更高版本 | 全面上市。推荐版本。 |
| 5.1.x | 5.6、5.7、8.0 3.0、4.0、4.1、4.2 | JDK 5.0和JDK 8.0或更高版本 | 一般可用性 |
注意事项
jar包名称
MySQL数据库8.x版本的驱动文件jar包对应的是:
Class.forName("com.mysql.cj.jdbc.Driver");
语句来加载数据库驱动
而我使用的是5.0x版本的数据库驱动文件,对此,需要将加载数据库驱动的语句更改为:
Class.forName("com.mysql.jdbc.Driver");
此外,url的设置也得进行修改,原本的url如下:
String ur="jdbc:mysql://127.0.0.1:3306/study_station";
应修改为如下:
String url="jdbc:mysql://127.0.0.1:3306/study_station?useUnicode=true&characterEncoding=UTF-8&userSSL=false&serverTimezone=GMT%2B8";
关于useSSL的选项
8.0x是不需要建立ssl连接的,你需要显示关闭,即url中的&useSSL=false;
5.0x可以建立ssl连接,如果没有加useSSL选项,就会报错
WARN: Establishing SSL connection without server’s identity verification is not recommended.
According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection
must be established by default if explicit option isn’t set.
For compliance with existing applications not using SSL the verifyServerCertificate property is set to ‘false’.
You need either to explicitly disable SSL by setting useSSL=false,
or set useSSL=true and provide truststore for server certificate verification.
翻译
警告:建议不要在没有服务器身份验证的情况下建立SSL连接。
根据MySQL 5.5.45 +,5.6.26+和5.7.6+要求SSL连接
如果未设置显式选项,则必须默认建立。
为了符合不使用SSL的现有应用程序,verifyServerCertificate属性设置为“false”。
您需要通过设置useSSL = false显式禁用SSL,
或者设置useSSL = true并为服务器证书验证提供信任库。
所以5.0x无论使用不使用ssl都要显式的把设置加上,不然就会报错。
关于时区:serverTimezone
serverTimezone=GMT%2B8"是进行时区的设置
使用mysql 8.0.16 版本的驱动的时候解决如下报错:
java.sql.SQLException: The server time zone value '???ú±ê×??±??' is unrecognized or represents more than one time zone.
这是由于数据库和系统时区差异所造成的,在jdbc连接的url后面加上serverTimezone=GMT即可解决问题,如果需要使用gmt+8时区,需要写成GMT%2B8,否则会被解析为空。
再一个解决办法就是使用低版本的MySQL jdbc驱动,5.1.28不会存在时区的问题。
url基本格式如下:
连接地址+ssl连接关闭+字符集为utf-8+时区设置
顺便一提
如果输入中文存在乱码,可以如下设置:
jdbc:mysql://127.0.0.1:3306/hello?useUnicode=true&characterEncoding=UTF-8
当然,为了时间什么的稳妥,你也可以都写上 如下:
jdbc:mysql://127.0.0.1:3306/hello?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
搞定。
MySQL JDBC驱动版本与数据库版本的对应关系及注意事项的更多相关文章
- MySQL JDBC驱动版本与MySQL数据库版本对应关系
前言:前段时间发现在家使用和公司一样的mysql jdbc驱动版本发生了异常,原因:家里mysql数据库版本与公司不一致导致.查询了相关资料,发现mysql jdbc驱动版本与mysql数据库版本有一 ...
- MapReduce 程序mysql JDBC驱动类找不到原因及学习hadoop写入数据到Mysql数据库的方法
报错 :ClassNotFoundException: com.mysql.jdbc.Driver 需求描述: hadoop需要动态加载个三方jar包(比如mysql JDBC 驱动包),是在MR结束 ...
- MySQL的JDBC驱动(8.0版本)
1.引用外部库 mysql-connector-java-8.0.版本的jar 2.jdbc驱动类:com.mysql.jdbc.Driver 改成 com.mysql.cj.jdbc.Drive ...
- MYSQL 查看当前用户与数据库版本
问题一: 查看当前用户 select user(); 问题二: 查看数据库版本 select version();
- 一个MySQL JDBC驱动bug引起的血案
1.1 问题背景 公司是做电商系统的,整个系统搭建在华为云上.系统设计的时候,考虑到后续的用户和订单数量比较大,需要使用一些大数据库的组件.关系型数据库这块,考虑到后续数据量的快速增长,不是 ...
- mysql——jdbc驱动下载&连接mysql例子
mysql-connector-java-5.1.46.zip[解压后里面jar文件就是所需要的] https://dev.mysql.com/get/Downloads/Connector-J/my ...
- java的JDBC驱动使用链接数据库
1. import java.sql.*; 2 . 导入所需要的数据库的jar包,如oracle/informix的 3. String sql = "select * from ...
- mysql jdbc驱动与java 版本对应关系
当使用某些密码套件时,Connector/J5.1需要JRE 1.8.x才能使用SSL/TLS连接到MySQL 5.6,5.7和8.0.
- jmeter通过org.sqlite.JDBC驱动连接db数据库
最近遇到个项目,默认业务库为内置db数据库,在性能脚本编辑过程中要通过正则表达式提取器(关联)获取对应的id号,通过该id号到db数据库中查找对应的数据源name字段内容,为下一个post请求做par ...
- MySQL JDBC驱动下载
下载地址:https://pan.baidu.com/s/1VLNaV_rz2P1jMtYrjJydiQ
随机推荐
- Java SE final关键字
final关键字 final可以修饰类.属性.方法和局部变量 如下情况,可以使用final 当不希望类被继承时,可以用final修饰 当不希望父类的某个方法被子类覆盖/重写(override)时,可以 ...
- 基于Containerd安装部署高可用Kubernetes集群
转载自:https://blog.weiyigeek.top/2021/7-30-623.html 简述 Kubernetes(后续简称k8s)是 Google(2014年6月) 开源的一个容器编排引 ...
- Fluentd 简明教程
转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247491814&idx=1&sn=3b0f1a3477 ...
- centos下如何获取某个命令的源代码?
以ls命令为例,其它命令类似: 1.利用which命令获取命令可执行文件的位置: [root@228 /]# which ls alias ls='ls --color=auto' /usr/bin/ ...
- PAT (Basic Level) Practice 1014 福尔摩斯的约会 分数 20
大侦探福尔摩斯接到一张奇怪的字条: 我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm 大侦探很快就明白了,字 ...
- liunx的三个时间atime,mtime,ctime详细说明与使用场景
导航:一.文件与文件夹三个时间:atime,mtime,ctime的含义二.ll命令查看文件时间三.stat命令查看文件的时间四.测试创建/修改文件的时间五.常用命令关于文件时间相关 - - - - ...
- 关于vmware虚拟机的ova/ovf转换成aws上的AMI镜像
很多时候,我们会有这样的需求,需要将DC中vmware虚拟化的服务器,迁移到aws上,我们就得先将vmware虚拟机导出,然后转换 关于vmvare虚拟的导出备份,一般有ova(Open Virtua ...
- The XOR Largest Pair (trie树)
题目描述 在给定的 NN 个整数 A_1,A_2,--,A_NA1,A2,--,AN 中选出两个进行xor运算,得到的结果最大是多少?xor表示二进制的异或(^)运算符号. 输入格式 第一行输入 ...
- 洛谷P2863 [USACO06JAN]The Cow Prom S (tarjan)
题目简述:一个有向图,求出这个图点数>1的强连通分量的个数. 那么就是tarjan求强联通分量的模板了. 记得要用一个数组标记节点是否在栈中. 1 #include<bits/stdc++ ...
- 洛谷P3397 地毯(差分)
二维平面上的差分,我们可以对每行处理. 比如我们要把(2,2)(5,5)之间的矩形加上1,可以这样处理. 0 0 0 0 0 0 0 +1 0 0 0 -1 0 +1 0 0 0 -1 0 +1 0 ...