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

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

ただいまの
回答率

90.51%

  • Java

    13790questions

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

  • MySQL

    5854questions

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

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 342

denno_shun

score 0

 前提・実現したいこと

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は報告されません。スローするには、捕捉または宣言する必要があります」

 該当のソースコード

下記コードを次のコマンドで実行しました。

> set CLASSPATH=C:\java\test;C:\java\testlib\mysql-connector-java-8.0.11.jar
> java Sample
import java.sql.*;
import java.util.*;

public class Sample {
  static final String URL = "jdbc:mysql://localhost/sampledb";
  static final String USERNAME = "root"; 
  static final String PASSWORD = "password"; //書き換えて実行

  public static void main(String[] args) {
    try (Connection connection = DriverManager.getConnection
(URL, USERNAME, PASSWORD); 
         Statement statement = connection.createStatement(); ){
      String sql = "SELECT * FROM ENGLISH";
      ResultSet result = statement.executeQuery(sql);

      while (result.next()) {
        System.out.print  (result.getInt   ("STUDENTNO"  ) + "\t");
        System.out.print  (result.getString("STUDENTNAME") + "\t");
        System.out.println(result.getInt   ("SCORE"      ));
      }
    } catch (SQLException e) {
      e.printStackTrace();
    }
  }
}

 試したこと

次のような手順で確認しました。
■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は次のように作りました。

CREATE DATABASE SAMPLEDB;
USE SAMPLEDB;
CREATE TABLE ENGLISH (
  STUDENTNO INT(10),
  STUDENTNAME VARCHAR(20),
  SCORE INT
);
INSERT INTO ENGLISH VALUES(1001,'野口英雄',70);
INSERT INTO ENGLISH VALUES(1002,'板垣退助',25);
INSERT 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は次のように作りました。

import java.sql.*;
import java.util.*;

public class Sample {
  static final String URL = "jdbc:mysql://localhost/sampledb";
  static final String USERNAME = "root"; 
  static final String PASSWORD = "password"; //書き換えて実行

  public static void main(String[] args) {
    try (Connection connection = DriverManager.getConnection
(URL, USERNAME, PASSWORD); 
         Statement statement = connection.createStatement(); ){
      String sql = "SELECT * FROM ENGLISH";
      ResultSet result = statement.executeQuery(sql);

      while (result.next()) {
        System.out.print  (result.getInt   ("STUDENTNO"  ) + "\t");
        System.out.print  (result.getString("STUDENTNAME") + "\t");
        System.out.println(result.getInt   ("SCORE"      ));
      }
    } catch (SQLException e) {
      e.printStackTrace();
    }
  }
}

■前述の方法以外に、次の方法も試してみました。
「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/ツールのバージョンなど)

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/07/18 13:13

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

    キャンセル

回答 1

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/18 20:45 編集

    ご回答ありがとうございます。

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

    キャンセル

  • 2018/07/23 13:25

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

    キャンセル

  • 2018/07/25 14:31

    Java10では、
    try {
    Class.forName("com.mysql.jdbc.Driver");

    } catch (SQLException e) {

    でエラーが出ています。

    キャンセル

  • 2018/07/25 14:41

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

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13790questions

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

  • MySQL

    5854questions

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

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