最近想學習一下 Java 連接 MySQL 數據庫,於是有了這樣的一些問題&解決辦法。
首先是解決 JDBC(Java Data Base Connectivity)驅動問題,因為默認安裝的JDK的擴展中沒有JDBC驅動,不然報錯如下:
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) Sorry,can`t find the Driver! at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) at Main.main(Main.java:24)
所以要去 https://dev.mysql.com/downloads/connector/j/ 下載 MySQL Connector/J,也就是 JDBC 驅動,訪問鏈接如圖,可以從下拉菜單中選擇對應系統下載,不過作為大眾的 Windows 系統下面有個區域是 MySQL Installer for Windows ,之后繞過一登錄帳號下載。
下載后打開安裝,Select Products and Features 中, Available Products 下的 MySQL Connectors 中會有 Connector/J 選擇 Next 即可,此圖是因為已經安裝后匆情況;
這樣安裝后,再使用 Eclipse 或 Intellij 再運行代碼發現,好像並沒有什么用呀,依然是報同樣的錯誤,反正筆者是這個情況。那怎么辦?用 MySQL 安裝了 JDBC 驅動,為什么還不可以呢。
難道要將驅動放到 JDK 下么,百度了一下 https://jingyan.baidu.com/article/3aed632e1a4ceb70108091f6.html 大概是要在項目中關聯此驅動的 jar 包,也可以將其放到 jre 目錄中的 lib\ext 下,這樣就為所有的項目添加了。
在 Intellij 中則是 File -> Project Structure -> SDKs 的jdk的classpath點擊右側加號添加,如果你在將驅動包復制到 jre 目錄下的 lib\ext 就不需要在此設置了,不管此處有沒有包名,驅動已經在 Eclipse 或 Intellij 運行之前已經加載。
那么怎樣獲取這個驅動包呢,或者已經安裝了MySQL怎么去找到呢?
默認的安裝路徑在 C:\Program Files (x86)\MySQL\Connector J 8.0 , mysql-connector-java-8.0.12.jar 就是JDBC驅動包,其它的文件大概是這個包的源碼吧。當然如果你不想安裝MySQL的話,可以通過此鏈接下載 https://pan.baidu.com/s/1paML6HezE9ok-8ZBJU6EgA
注意:不保證以后是最新版本的,所以欲求最新版還是關注 MySQL 吧。
可以通過項目的設置來關聯此 jar 驅動文件,不想這么麻煩的話,就復制到 jre 包所在目錄下的 bin\ext 下,注意並不是要和筆者一樣的路徑,具體根據自身情況來。
這樣后,重啟 Eclipse 或 Intellij 等IDE后,再去運行時,估計不會錯了。
當然筆者遇到一個錯誤就是
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)
關於此錯誤 ,MySQL時區問題,可參閱
https://blog.csdn.net/weixin_37577564/article/details/80329775
https://blog.csdn.net/dongsl161/article/details/56495361
按照此設置,應該不會有錯誤的。(注意的是要區別大小寫!!!)
代碼如下,參考了網上的文章后做了一些修改:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Main { public static void main(String[] args) { // 聲明Connection對象 Connection con; // 驅動程序名 String driver = "com.mysql.jdbc.Driver"; // URL指向要訪問的數據庫名 test String url = "jdbc:mysql://localhost:3306/test?serverTimezone=UTC"; // MySQL配置時的用戶名 String user = "root"; // MySQL配置時的密碼 String password = "root"; // 遍歷查詢結果集 try { // 加載驅動程序 Class.forName(driver); // 1.getConnection()方法,連接MySQL數據庫!! con = DriverManager.getConnection(url, user, password); if (!con.isClosed()) System.out.println("\n\t\t成功以 " + user + " 身份連接到數據庫!!!"); // 2.創建statement類對象,用來執行SQL語句!! Statement statement = con.createStatement(); // 要執行的SQL語句 String sql = "select * from demo"; // 3.ResultSet類,用來存放獲取的結果集!! ResultSet rs = statement.executeQuery(sql); System.out.println("\n\t\t執行結果如下所示:"); System.out.println("\t\t-----------------------------------------------------------------"); System.out.println("\t\t|\t" + "ID" + "\t" + "姓名" + "\t" + "性別" + "\t" + "年齡" + "\t" + "手機號碼" + "\t\t" + "地址\t|"); System.out.println("\t\t-----------------------------------------------------------------"); int ID = 0; String Name = null; String Sex = null; int Age = 0; String Phone = null; String Address = null; while (rs.next()) { // 獲取 ID 這列數據 ID = rs.getInt("ID"); // 獲取 Name 這列數據 Name = rs.getString("Name"); // 獲取 Sex 這列數據 Sex = rs.getString("Sex"); // 獲取 Age 這列數據 Age = rs.getInt("Age"); // 獲取 Phone 這列數據 Phone = rs.getString("Phone"); // 獲取 Address 這列數據 Address = rs.getString("Address"); // 輸出結果 System.out.println("\t\t|\t" + ID + "\t" + Name + "\t" + Sex + "\t" + Age + "\t" + Phone + "\t" + Address + "\t|\t\t"); } System.out.println("\t\t-----------------------------------------------------------------"); rs.close(); con.close(); } catch (ClassNotFoundException e) { // 數據庫驅動類異常處理 System.out.println("Sorry,can`t find the Driver!"); e.printStackTrace(); } catch (SQLException e) { // 數據庫連接失敗異常處理 e.printStackTrace(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } finally { System.out.println("\t\t\t\t\t\t\t\t獲取數據庫數據完畢!!!"); } }
MySQL數據庫結構
運行后效果視圖
如有錯誤,歡迎指正!