JDBC調用Mysql8.0.13問題解決

一、Windows 10 上安裝 MySQL 8.0.13

最新版本可以上官網在 MySQL 下載 中選擇 Microsoft Windows(x86,64-bit) ,ZIP Archive 下載。無需在該網站註冊信息。下載完後,我們將 zip 包解壓到相應的目錄,這裏我將解壓後的文件夾放在 F:\Mysql\mysql-8.0.13-winx64 下。

接下來我們需要配置下 MySQL 的配置文件

打開剛剛解壓的文件夾 F:\Mysql\mysql-8.0.13-winx64 ,在該文件夾下創建 my.ini 配置文件,編輯 my.ini 配置以下基本信息:

[mysql]
# 設置mysql客戶端默認字符集
default-character-set=utf8
[mysqld]
# 設置3306端口
port = 3306
# 設置mysql的安裝目錄
basedir=F:\\Mysql\\mysql-8.0.13-winx64
# 設置 mysql數據庫的數據的存放目錄,MySQL 8+ 不需要以下配置,系統自己生成即可,否則有可能報錯
# datadir=C:\\web\\sqldata
# 允許最大連接數
max_connections=20
# 服務端使用的字符集默認爲8比特編碼的latin1字符集
character-set-server=utf8
# 創建新表時將使用的默認存儲引擎
default-storage-engine=INNODB

接下來我們來啓動下 MySQL 數據庫:

以管理員身份打開 cmd 命令行工具,切換目錄:

cd /d  F:\Mysql\mysql-8.0.13-winx64\bin

初始化數據庫:

mysqld --initialize --console

執行完成後,會輸出 root 用戶的初始默認密碼,如:

...
2018-04-20T02:35:05.464644Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: APWCY5ws&hjQ
...

APWCY5ws&hjQ就是初始密碼,後續登錄需要用到,記得在關閉當前命令行之前先複製下來。

繼續,在F:\Mysql\mysql-8.0.13-winx64\bin目錄下:

執行數據庫的安裝、初始化mysql數據庫的數據存放目錄data以及mysql服務的啓動。

mysqld install
mysqld --initialize-insecure 
net start mysql	

如果在執行第三條語句net start mysql出現:

發生系統錯誤 2。
系統找不到指定的文件。

原因:你服務的路徑和安裝的路徑不一致造成的,之前安裝過mysql後卸載的機器容易出現這樣的問題。

解決方法:修改一下註冊表。首先進入命令行,輸入regedit,回車,進入註冊表編輯器。選擇 HKEY_LOCAL_MACHINE -> SYSTEM -> CurrentControlSet -> services -> MySQL, 修改ImagePath的路徑,爲你的安裝路徑, 比如 F:\Mysql\mysql-8.0.13-winx64\bin\mysqld MySQL


二、登錄 MySQL

如果我們要登錄本機的 MySQL 數據庫,只需要輸入以下命令即可:

mysql -u root -p

如果出現:

ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)

從錯誤的提示中可以看出MySQL服務沒有啓動,因此只需要啓動MySQL服務就可以了

直接採用net start MySQL 就可以啓動MySQL服務,但如果輸入命令後仍然出現錯誤 :

服務名無效
請鍵入 NET HELPMSC 2185 以獲得更多幫助。

原因:服務名不一致引起。在自定義安裝的過程默認服務名可能會加上MYSQL的版本數字。

解決方案:系統搜索進入服務,找到其中的MySQL服務,檢查其服務名是否有數字後綴,如:MYSQL80。此時再輸入net start MySQL80,如果發生如下錯誤:

發生系統錯誤 5。
拒絕訪問。

原因:權限不夠

解決方案:以管理員身份運行CMD,系統搜索cmd之後右擊以管理員的方式運行。

以上錯誤都不發生的正常情況如下:按回車確認會得到以下響應:

Enter password:

將我們剛剛複製下來初始密碼輸入,如果正確的話,就已經 成功進入數據庫中了。命令提示符會一直以 mysq> 加一個閃爍的光標等待命令的輸入, 輸入 exit退出登錄。

接下來我們來修改下 MySQL 數據庫的登錄密碼:

正常的修改密碼方法如:

mysql> use mysql;  
mysql> update user set password=password('123456') where user='root' and host='localhost';  
mysql> flush privileges;  

執行報錯的話:

ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

我們可以用如下語句執行:

set password '123456'

成功的話,執行show databases;能夠看到當前所以的數據庫。


三、連接SQLYog

如果一切順利的話,只需要在SQLYog中新建一個MYSQL連接,填入主機地址:localhost,用戶名:root,密碼:123456,端口:3306就可以了。

如果端口不對,可以用命令行進入數據庫通過以下指令查詢得到:

show global variables like 'port';

如果配置新連接報錯:錯誤號碼 2058,分析是 mysql 密碼加密方法變成caching_sha2_password了(8.0版本開始出現的問題)。

解決方法:windows 下cmd 登錄 mysql -u root -p 登錄你的 mysql 數據庫,然後執行這條SQL(注意分號):

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpassword';

用新密碼到SQLYog登錄。


四、JDBC中調用Mysql出現的問題

本人一直使用的是5.x版本的mysql進行開發,不料在這次的項目開發中JDBC加載數據庫時,出現了從未有過的問題,一慌之下就卸載重載了(天知道我當時怎麼想的…)

由於本人用的是8.0版本數據庫,所以JDBC調用時需要注意如果出現以下問題(這個問題也是我重裝8.0版本吧的根源…):

SunCertPathBuilderException: unable to find valid certification path to requested target

原因:可能是由於選擇使用SSL的方式訪問數據庫,沒有有效證書

解決方案:配置驅動類的url時,將uesrSSL設爲false。

ds.setUrl("jdbc:mysql://localhost:3306/software_project?serverTimezone=UTC&userSSL=false");

需要補充的時,8.0的Mysql也支持開發者這麼使用。修改之後依舊出現如下問題:

java.sql.SQLException: Unknown system variable 'query_cache_size'

原因:mysql-connecter-java的版本過低,很顯然是數據庫驅動程序與數據庫版本不對應 。

解決方法:導入mysql-connecter-java-8.0.13.jar,如果使用maven管理的話在pom.xml中添加:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.13</version>
</dependency>

沒想到我在使用maven管理的時候,下載這個版本的竟然沒成功(maven導包經常由於網絡原因沒有下成功,網上建議換成阿里源的我嘗試了,效果不是很理想),於是手動上官網下載放入maven的存庫中我的路徑是C:\Users\user\.m2\repository\mysql\mysql-connector-java\8.0.13,避免中間有坑,這裏直接貼上網址

之後,我們連接數據庫驅動時需要注意:

驅動類改成com.mysql.cj.jdbc.Driver,指定時區改成serverTimezone=UTC

BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
//ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/software_project?serverTimezone=UTC&userSSL=false");
ds.setUsername("root");
ds.setPassword("123456");

如果已經確定導入最近mysql-connecter-java包還出現如下錯誤:

java.lang.ClassNotFoundException:com.mysql.cj.jdbc.Driver)

原因:必需的jar沒有包含在應用程序服務器上部署的Artifact配置中

解決方案:進入Project Structure 將該jar包部署進Artifact 中,在如下方框處,右擊選擇第一個選項。FQ2BVg.png

最後JDBC成功訪問8.0版本的Mysql數據庫。


五、注意點

  1. 數據庫平時不用又嫌佔內存的話可以關閉服務,進入服務找到MYSQL後關閉即可。
  2. 如果嫌棄每次進命令行都要切換到Mysql的安裝目錄下麻煩的話,可以將Mysql的安裝路徑設置到系統環境變量,具體方法在此不展開了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章