使用JDBC连接Mysql数据库会出现的问题总结
首先理清几个概念:
- JDBC:java数据库连接,是Orical公司的指定的一套规范接口
- java数据库驱动:JDBC的实现类,由相应的数据库厂商提供,可以通过驱动去操作不同的数据库
- 在java-数据库这里,jdbc-api中的所有包都是java.sql或者javax.sql
JDBC的操作步骤:
(1)建立数据库和表
(2)创建项目
(3)导入驱动jar包
(4)注册驱动
Class.forName("com.mysql.jdbc.Driver");
(5)获取连接
Connectionconn=DriverManager.getConnection("jdbc:mysql://localhost:端口号/项目名","登录名","密码");
前言
最近安装了一个mysql8.0版本的数据库,在程序中连接的时候可谓是状况不断。之前也会遇到一些问题,这里就对使用JDBC连接mysql会出现的问题做一个汇总。
在此之前说明一下环境:
- 开发工具:IDEA
- mysql版本:8.0.12forWin64onx86_64(MySQLCommunityServer-GPL)
- mysql驱动包:8.0.12
驱动包URL的改变
异常信息
Loadingclasscom.mysql.jdbc.Driver.Thisisdeprecated.Thenewdriverclassiscom.mysql.cj.jdbc.Driver.ThedriverisautomaticallyregisteredviatheSPIandmanualloadingofthedriverclassisgenerallyunnecessary.
原因
通过异常我们可以发现,新的驱动url是com.mysql.cj.jdbc.Driver,经过在网上查阅资料发现,从mysql6开始,驱动包开始使用新的驱动url。如果使用旧的5.0版本的驱动包,则不用驱动URL,但是如果使用旧的驱动可能会出现一些意想不到的问题。所以还是建议将驱动包升级,然后改变驱动URL的值。
解决方法
将驱动URL由com.mysql.jdbc.Driver换成com.mysql.cj.jdbc.Driver
SSL警告
警告信息
EstablishingSSLconnectionwithoutserver'sidentityverificationisnotrecommended.AccordingtoMySQL5.5.45+,5.6.26+and5.7.6+requirementsSSLconnectionmustbeestablishedbydefaultifexplicitoptionisn'tset.ForcompliancewithexistingapplicationsnotusingSSLtheverifyServerCertificatepropertyissetto‘false'.YouneedeithertoexplicitlydisableSSLbysettinguseSSL=false,orsetuseSSL=trueandprovidetruststoreforservercertificateverification.
原因
对警告信息翻译如下。
不建议在没有服务器身份验证的情况下建立SSL连接。根据MySQL5.5.45+,如果未设置显式选项,则默认情况下必须建立5.6.26+和5.7.6+要求的SSL连接。对于不使用SSL的现有应用程序,ValuyServer证书属性设置为“false”。您需要通过设置useSSL=false来显式禁用SSL,或者设置useSSL=true并提供用于服务器证书验证的信任库`。
解决方法
一般在开发中基本不需要使用SSL连接,在连接字符串后添加useSSL=false参数就行。但是如果真的有SSL连接的需要,则在驱动URL后添加useSSL=true参数。
jdbc:mysql://localhost:3306/dbname?characterEncoding=UTF-8&useSSL=false
时区问题
异常信息
java.sql.SQLException:Theservertimezonevalue‘Öйú±ê׼ʱ¼ä'isunrecognizedorrepresentsmorethanonetimezone.YoumustconfigureeithertheserverorJDBCdriver(viatheserverTimezoneconfigurationproperty)touseamorespecifctimezonevalueifyouwanttoutilizetimezonesupport.
原因
同样也是由于版本升级后,新的版本数据库和系统之间有了时区差异,需要指定时区serverTimezone
解决方法
连接字符串后添加参数&serverTimezone=GMT%2B8,最终连接字符串如下:
jdbc:mysql://localhost:3306/dbname?characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
修改数据库时间。先通过命令行连上数据库,依次输入命令及其输出如下
mysql>showvariableslike"%time_zone"; +------------------+--------+ |Variable_name|Value| +------------------+--------+ |system_time_zone|| |time_zone|SYSTEM| +------------------+--------+ 2rowsinset,1warning(0.04sec) mysql>setglobaltime_zone="+8:00"; QueryOK,0rowsaffected(0.01sec)
XML配置文件中&的转义
异常信息
org.mybatis.generator.exception.XMLParserException:XMLParserErroronline16:对实体“useSSL”的引用必须以‘;'分隔符结尾。
原因
这是我在使用mybatisgenerator时出现的错误。当时我想在连接字符串后加上useSSL参数,但是由于在XML文件中,&是被禁止的,所以需要使用&的时要用它的转义&来代替。
解决方法
将连接字符串中的&符号改成&
详细连接字符串参考
jdbc:mysql://127.0.0.1:3306/dbname?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&serverTimezone=GMT%2B8&verifyServerCertificate=false&autoReconnct=true&autoReconnectForPools=true&allowMultiQueries=true
当然如果是使用XML作为配置文件,需要将连接字符串中的&符号改成&
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。