質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

1回答

3988閲覧

Java10にアップデートしたら、MySQLが読めなくなりました。「No suitable driver」エラーとなります。

denno_shun

総合スコア4

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2018/07/18 03:38

編集2018/07/22 15:17

前提・実現したいこと

Java8で実行していたMySQLを読み込む簡単なサンプルが、Javaのバージョンを10にアップデートしたら、「No suitable driver」エラーとなり、実行できなくなりました。
Java8とJava10は互換性が保証されないと聞いていましたが、もろに影響を受けてしまいました。MySQLで作成したデータベースを、コマンドプロンプトでjavaを実行して表示する簡単なプログラムなのに動かなくなりました。(eclipse等は使っていません)

Java10でMySQLをどのように読み込んだらよいか、ぜひ教えてください。

発生している問題・エラーメッセージ

1. lib/extフォルダの廃止
Java8ではjdbcドライバを「C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext」の下にコピーしていました。
ところがJava10では、extフォルダはありませんでした。
自分でフォルダを作成、コピーして実行すると、次のエラーとなりました。

/lib/ext exists, extensions mechanism no longer supported; Use -classpath instead.

2.CLASSPATHの指定
CLASSPATHを次のように指定して実行すると、次のエラーとなりました。

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/sampledb (Sample.java:11)

いろいろな様式でクラスパスを指定してみましたが、結果は同じでした。

3.「Class.forName」を使う
「No suitable driver」の解決方式では「Class.forName」を使ことが広く行われている(Java8以前)ようでしたので、試したところ、次のようにJava10ではコンパイルエラーになってしまいました。、

「例外ClassNotFoundExceptionは報告されません。スローするには、捕捉または宣言する必要があります」

該当のソースコード

Java10/MySQL8

1下記コードを次のコマンドで実行しました。 2 3> set CLASSPATH=C:\java\test;C:\java\testlib\mysql-connector-java-8.0.11.jar 4> java Sample 5import java.sql.*; 6import java.util.*; 7 8public class Sample { 9 static final String URL = "jdbc:mysql://localhost/sampledb"; 10 static final String USERNAME = "root"; 11 static final String PASSWORD = "password"; //書き換えて実行 12 13 public static void main(String[] args) { 14 try (Connection connection = DriverManager.getConnection 15(URL, USERNAME, PASSWORD); 16 Statement statement = connection.createStatement(); ){ 17 String sql = "SELECT * FROM ENGLISH"; 18 ResultSet result = statement.executeQuery(sql); 19 20 while (result.next()) { 21 System.out.print (result.getInt ("STUDENTNO" ) + "\t"); 22 System.out.print (result.getString("STUDENTNAME") + "\t"); 23 System.out.println(result.getInt ("SCORE" )); 24 } 25 } catch (SQLException e) { 26 e.printStackTrace(); 27 } 28 } 29} 30

試したこと

次のような手順で確認しました。
■MySQL8のインストール
△インストール前に、MySQL5.1.12をアンインストールし、さらにMySQL関連のファイルをすべて削除し、完全に空の状態でダウンロード/インストールしました。

△認証方法としては、「Legacy Authentication Method」を選択しました。
(Legacyにしないと、うまくいかないようでしたので、再度インストールしました)

△MySQLに対するパスを設定しました。

■MySQLをコマンドプロンプトで実行し、次のようにデータベースを作成、表示しました。

>mysql –u root –p Enter password: ******** mysql> source sampledb; mysql> use sampledb; mysql>select * from english;

△テーブルは正しく表示されました。
ここで、sampledbは次のように作りました。

MySQL

1CREATE DATABASE SAMPLEDB; 2USE SAMPLEDB; 3CREATE TABLE ENGLISH ( 4 STUDENTNO INT(10), 5 STUDENTNAME VARCHAR(20), 6 SCORE INT 7); 8INSERT INTO ENGLISH VALUES(1001,'野口英雄',70); 9INSERT INTO ENGLISH VALUES(1002,'板垣退助',25); 10INSERT INTO ENGLISH VALUES(1003,'伊藤博文',90);

■次に、作成されたSAMPLEDBをJavaのプログラムで表示することにしました。
△MySQL8のインストールで、「mysql-installer-community-8.0.11.0.msi」が得られました。ダブルクリックすると、「mysql-connector-java-8.0.11.jar」が生成されたので、これがjdbcドライバと判断し、JDKライブラリフォルダへ設定することにしました。

△java8では「C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext」の下にコピーしました。
ところがJava10では、extフォルダはありませんでした。

△仕方がないので、libの下に自分でextフォルダを作成して、JDBCドライバを挿入して実行したら、次のメッセージが出て、叱られました。

/lib/ext exists, extensions mechanism no longer supported; Use -classpath instead.

■「C:\java\test」フォルダを作成し、Sample.javaとjdbcのドライバをコピーして入れました。
△次の結果となりました。

>set CLASSPATH=C:\java\test >java Sample java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/sampledb (Sample.java:11)


ここで、Sample.javaは次のように作りました。

Java

1import java.sql.*; 2import java.util.*; 3 4public class Sample { 5 static final String URL = "jdbc:mysql://localhost/sampledb"; 6 static final String USERNAME = "root"; 7 static final String PASSWORD = "password"; //書き換えて実行 8 9 public static void main(String[] args) { 10 try (Connection connection = DriverManager.getConnection 11(URL, USERNAME, PASSWORD); 12 Statement statement = connection.createStatement(); ){ 13 String sql = "SELECT * FROM ENGLISH"; 14 ResultSet result = statement.executeQuery(sql); 15 16 while (result.next()) { 17 System.out.print (result.getInt ("STUDENTNO" ) + "\t"); 18 System.out.print (result.getString("STUDENTNAME") + "\t"); 19 System.out.println(result.getInt ("SCORE" )); 20 } 21 } catch (SQLException e) { 22 e.printStackTrace(); 23 } 24 } 25}

■前述の方法以外に、次の方法も試してみました。
「C:\java\test」フォルダにSample.java、「C:\java\testlib」にjdbcドライバを入れて実行
△結果は次の通りです。

> set CLASSPATH=C:\java\test;C:\java\testlib\mysql-connector-java-8.0.11.jar > java Sample java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/sampledb (Sample.java:11)

ほかにもいろいろ試してみましたが、結局上記のエラーとなってしまいます。
何が問題なのでしょうか。Java10とMySQL8の組み合わせが悪いのでしょうか。よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/07/18 04:13

プログラムコード(およびエラーメッセージ)は質問内容としては最も重要な部分であるため、見やすくしていただけると助かります。<code>ボタン押下→「コード」部分にコードを貼り付け→「ここに言語を入力」に対象言語名記入(エラーメッセージの場合は不要)の手順で「コードハイライト化」してください。(質問編集画面ではリアルタイムでプレビューが表示されるので見ながら調整してください)
guest

回答1

0

"No suitable driver found"でぐぐったら以下の情報がありましたが参考になりませんか?
No suitable driver found for~でデータベースに接続出来ない

投稿2018/07/18 05:41

unz.hori

総合スコア1057

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

denno_shun

2018/07/20 08:47 編集

ご回答ありがとうございます。 教えていただいた「Class.forName」を使う方式でチェックしました。 Java8では実行できたようですが、Java10ではコンパイルエラーとなってしまいました。(「例外ClassNotFoundExceptionは報告されません。スロー するには、捕捉または宣言する必要があります」) Class.forNameは、Java6以降無効になったそうです。Javaの互換性のため、指定してもエラーにしなかったのを、Java10からエラーチェックするようにしたため、動かなくなったようです。
unz.hori

2018/07/23 04:25

エラーはthrowsまたはtry~catchしてないからではないですか?
denno_shun

2018/07/25 05:31

Java10では、 try { Class.forName("com.mysql.jdbc.Driver"); : } catch (SQLException e) { : でエラーが出ています。
unz.hori

2018/07/25 05:41

確か、ドライバのパッケージがどっかのパージョンで変わってたというのをネットで見かけました。今は出先なので詳細は答えられないですがネットで調べてみて下さい
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問