前提・実現したいこと
JavaプログラムからMysqlにJDBCインターフェースで接続すること。
発生している問題・エラーメッセージ
コンパイルは正しく終了したが、実行時に「ドライバを読み込めませんでした java.lang.ClassNotFoundException: com.mysql.jdbc.Driver」になる。
該当のソースコード
Java
1 2import java.sql.Connection; 3import java.sql.DriverManager; 4import java.sql.ResultSet; 5import java.sql.SQLException; 6import java.sql.Statement; 7 8/** 9* localhost上のデータベースと接続し、取得したデータをコンソール出力する。 10*/ 11public class UseJdbc { 12 13 public static void main( String args[] ) throws Exception { 14 15 /*接続先サーバー名を"localhost"で与えることを示している*/ 16 String servername = "localhost"; 17 18 /*接続するデータベース名をsenngokuとしている*/ 19 String databasename = "shop"; 20 21 /*データベースの接続に用いるユーザ名をrootユーザとしている*/ 22 String user = "root"; 23 24 /*データベースの接続に用いるユーザのパスワードを指定している*/ 25 String password = "xxxxxx"; 26 27 /*取り扱う文字コードをUTF-8文字としている*/ 28 String serverencoding = "UTf8mb4"; 29 30 /*データベースをあらわすURLを設定している*/ 31 String url = "jdbc:mysql://localhost/" + databasename; 32 33 /*MySQLの場合、URLの形式は次のようになります。 34 jdbc:mysql://(サーバ名)/(データベース名)*/ 35 36 /*↑データベースをあらわすURL(データベースURL)は、データベースに接続する場合に 37 必要となる情報をセットした文字列である。 38 この文字列の構造は、"jdbc"、サブプロトコル、サブネームの3つの部分から構成される。*/ 39 40 /*接続を表すConnectionオブジェクトを初期化*/ 41 Connection con = null; 42 43 try{ 44 45 /*クラスローダによりJDBCドライバを読み込んでいることを示している。 46 引数は、データベースにアクセスするためのJDBCドライバのクラス名である。*/ 47 Class.forName( "com.mysql.jdbc.Driver" ).newInstance(); 48 49 /*DriverManagerクラスのgetConnectionメソッドを使ってデータベースに接続する。*/ 50 con = DriverManager.getConnection( url, user, password ); 51 52 System.out.println( "Connected...." ); 53 54 /*データベースの接続後に、sql文をデータベースに直接渡すのではなく、 55 sqlコンテナの役割を果たすオブジェクトに渡すためのStatementオブジェクトを作成する。*/ 56 Statement st = con.createStatement(); 57 58 /*SQL文を作成する*/ 59 String sqlStr = "SELECT * FROM busyou"; 60 61 /*SQL文を実行した結果セットをResultSetオブジェクトに格納している*/ 62 ResultSet result = st.executeQuery( sqlStr ); 63 64 /*クエリ結果を1レコードずつ出力していく*/ 65 while( result.next() ) 66 { 67 /*getString()メソッドは、引数に指定されたフィールド名(列)の値をStringとして取得する*/ 68 String str1 = result.getString( "shohin_id" ); 69 String str2 = result.getString( "shohin_mei" ); 70 String str3 = result.getString( "shohin_bunrui" ); 71 String str4 = result.getString( "hanbai_tanka" ); 72 String str5 = result.getString( "shiire_tanka" ); 73 String str6 = result.getString( "torokubi_tanka" ); 74 System.out.println( str1 + ", " + str2 + ", " + str3 + "," + str4+ "," +str5+ "," +str6); 75 } 76 77 /*ResultSetオブジェクトを閉じる*/ 78 result.close(); 79 80 /*Statementオブジェクトを閉じる*/ 81 st.close(); 82 83 /*Connectionオブジェクトを閉じる*/ 84 con.close(); 85 } 86 catch( SQLException e ){ 87 88 /*エラーメッセージ出力*/ 89 System.out.println( "Connection Failed. : " + e.toString() ); 90 91 /*例外を投げちゃうぞ*/ 92 throw new Exception(); 93 94 }catch (ClassNotFoundException e){ 95 96 /*エラーメッセージ出力*/ 97 System.out.println("ドライバを読み込めませんでした " + e); 98 } 99 finally{ 100 try{ 101 if( con != null ){ 102 con.close(); 103 } 104 } 105 catch(Exception e){ 106 107 /*エラーメッセージ出力*/ 108 System.out.println( "Exception2! :" + e.toString() ); 109 110 /*例外を投げちゃうぞ*/ 111 throw new Exception(); 112 } 113 } 114 } 115}
試したこと
mysql-connector-java-8.0.17.jarをダウンロードし、Usejdbcクラスと同じディレクトリに格納したが、結果は同じでした。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
クラスパスにmysql-connector-java-8.0.17.jarが含まれていますか?質問にクラスパスを追記してください。うまく動作したなら、Class.forName()を削除して実行してみてください。
あと今のJDBC技術は4.0以降です。
3.x系のコードをサンプルにするのはやめましょう。
まともに答えたいのですが情報が不足しています。IDE、Java、ドライバーのバージョンは?、IDEではなくオンラインの実行環境でしょうか?コンパイルと実行はどのように行っていますか。このプログラムはどこから入手しましたか?書籍なら書籍名を、どこかの教材なら開示できる範囲で、教えてください。
ご指摘ありがとうございます。
mysql-connector-java-8.0.17.jarは、ソースと同じフォルダにあるのでクラスパスは指定しませんでした。
指定して下記の通り実行しました。
javac -classpath ¥mysql-connector-java-8.0.17.jar Usejdbc.java
警告メッセージは出ましたが、オブジェクトはできたので、実行しました。
java -classpath ¥mysql-connector-java-8.0.17.jar Usejdbc
「エラー: メイン・クラスUsejdbcが見つからなかったかロードできませんでした」になりました。
IDEは、CPad for Java2 SDKを使用しました。
Jdkは11.0.2
コンパイルは、CPad for Java2 SDKとコマンドプロンプトの両方で行いました。Mysql(xampp MariaDB)のバージョンは、10.3.16.0です。
本プログラムは、https://qiita.com/norikiyo777/items/0bc3bf28b94ae4922b9aを修正しました。
jdbc接続は初めてなので苦労しています。
よろしくお願いいたします。
クラスパスにカレントディレクトリを含めてください。クラス名が間違っています。
java -classpath .;mysql-connector-java-8.0.17.jar UseJdbc
このプログラムはレガシーコードです。もはや使われていません。
正しく実行しましたが、以下のエラーになりました。
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: UseJdbc has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
-------------------------------------------------------------------------
>java -version
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)
-------------------------------------------------------------------------
java runtimeが古いのでしょうか?
echo %PATH%
パスの先頭にJRE 8があり、パスの後にJDK 11があると思われます。Windowsのシステム環境設定で、JREのパスを削除するか、とりあえず、PATH=<jdk11のパス>;%PATH%として実行してください。JDK 8 のインストーラが、先頭にJREのパスを追加してしまうのでこうなります。