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
随机推荐
- 记一次Linux光盘救援
最近遇到一个zz把/etc/profile改坏了导致系统起不来,所以复习一下光盘救援 工具:vm-workstation,centos6 原系统盘起不来后,插入有救援工具的系统盘后 按照提示进入she ...
- 璞华HawkEye平台助力乳品行业巨头在数字化转型中领“鲜”一步!
中国乳制品的市场规模接近4,000亿.在今天,产业数字化正在帮助这个传统产业实现更高质量的发展. 乳品行业现状 随着乳品行业规模扩大,各工厂引进大量的专用设备,设备故障也随之增多.设备的突发故障极易造 ...
- Java中如何创建不可变(immutable)类
什么是不可变类 1. 不可变类是指类的实例一经创建完成,这个实例的内容就不会改变. 2. Java中的String和八个基本类型的包装类(Integer, Short, Byte, Long, Dou ...
- 在没有安装终端服务的Windows 2012 R2服务器上配置远程桌面的属性
在没有安装终端服务的Windows2012 R2服务器上配置远程桌面的属性. 从Windows 2012开始,如果没有在服务器上启用终端服务的计算机,要想配置远程桌面使用更安全加密的RDP连接就 ...
- Java语言(基础一)
Java语言 Java的特性和优势 简单性(简单易学) 面向对象(一种思想 万物皆对象) 可移植性(一次编写到处运行 JVM) 高性能(及时编译) 分布式(网络分布式url) 动态性(反射机制) 多线 ...
- 查询nginx访问日志中访问次数最多的前10个IP地址
cat log | cut -d ' ' -f 1 | sort | uniq -c | sort -nr | awk '{print $0}' | head -n 10
- Elasticsearch:创建 API key 接口访问 Elasticsearch
转载自:https://blog.csdn.net/UbuntuTouch/article/details/107181440 在之前我的文章 "Elastic:使用Postman来访问El ...
- Android 使用压缩纹理
本文介绍了什么是压缩纹理,以及加载压缩纹理的核心步骤.并在 Android OpenGLES 平台上实现了压缩纹理的显示. 一.压缩纹理概念 传统的图片文件格式有 PNG . JPEG 等,这种类型的 ...
- PAT (Basic Level) Practice 1017 A除以B 分数 20
本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数.你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立. 输入格式: 输入在一行中依次给出 A 和 B,中间以 ...
- nsis新插件:Aero.dll
可以使安装界面在 win7 Aero特效下非客户区透明并美化BrandingText定义的字串 下载:http://nsis.sourceforge.net/Aero_plug-in nsis交流群: ...