IT大生、洋楽和訳とプログラミング

これからのIT時代を生き抜くブログ。

MySQL に接続できない問題

簡単に

クラスパスを本当にちゃんと通したか?
java -classpath .:./[jarファイル] [Classファイル]
だぞ!!

です。

詳しく

どうやらMySQLの新しいバージョンが出たことにより色々と仕様が変わっているらしい。そのせいで混乱したところもあるので、ver8に絞ってみて行く。

まずはサンプルプログラムを

teratail.com

土台が必要ということで、ここの回答者さんのプログラムを実行してみる。

f:id:rhe_9:20210108114520p:plain

これはmain関数だけなので、class Main として一つのクラスファイルとしてMain.java を作成した。

問題だったのは、「クラスパス」をよく理解していなかったこと。つなげたい二つのファイルが同じディレクトリに入っていればいいと思っていたが、そうではなかった。

teratail.com

ここのサイトのように「クラスパスを通せばいいよ」と言ってくれる人は多かったが、それを具体的にどうすればいいかを教えてくれる人があまりいなかった。

そこで、クラスパスの通し方を検索したところ、このサイトがヒット。

www.searchman.info

もし理解していない人は、全文をきっちり読んで欲しい。すぐに理解できる。

コマンドラインからクラスパスを実行した場合、
どこにクラスパスが通るのか?

そういう話をきっちりしておきましょう。

例えば、
c:\tmpには、以下の二つのファイルがあって、

Sample.class
mysql-connector-java-5.1.7-bin.jar(mysqlのドライバ)

Sampleを実行するためには、
mysql-connector-java-5.1.7-bin.jarファイルが必要
(つまり、クラスパスを通す必要があったとします)
そういう関係だったとしましょう。
よくやってしまう間違いが二つあります。


●一つ目の間違い

C:\tmp>java -classpath . Sample
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

カレントにクラスファイルも、jarファイルもあるんだから、
これでいいだろ?

と思われるかもしれませんが、
クラスパスでカレントを指定した場合は、
クラスファイルにしかクラスパスが通りませんからね。
jarファイルは、きっちり指定する必要があります。

●二つ目の間違い

じゃあ、ってんで、↓のようにやると、
C:\tmp>java -classpath ./mysql-connector-java-5.1.7-bin.jar Sample

Exception in thread "main" java.lang.NoClassDefFoundError: Sample

またエラーがでます。
これだと、
カレントのクラスファイルにクラスパスが通らない。

「カレントには環境変数でクラスパスを通してあるよ」
と思うかもしれませんが、

java -classpath ホニャララ

とやってしまった時点で、
環境変数のクラスパスはご破算になりますからね。

●だから、正しくは、
java -classpath .;./mysql-connector-java-5.1.7-bin.jar Sample

みたいに、
カレントのクラスファイル(Sample.class)
と、
カレントのjarファイル(mysql-connector-java-5.1.7-bin.jar)

にきっちりとクラスパスを通す必要があります。

このように書かれていました。まさかと思い、この通りに実行すると、

$ java -classpath .:./mysql-connector-java-8.0.22.jar Main

Connected....

Connection Failed. : java.sql.SQLSyntaxErrorException: Table 'test.busyou' doesn't exist

Exception in thread "main" java.lang.RuntimeException: java.sql.SQLSyntaxErrorException: Table 'test.busyou' doesn't exist

at Main.main(Main.java:36)

Caused by: java.sql.SQLSyntaxErrorException: Table 'test.busyou' doesn't exist

at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)

at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)

at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)

at com.mysql.cj.jdbc.StatementImpl.executeQuery(StatementImpl.java:1200)

at Main.main(Main.java:22)

エラーが変わった!

接続できているということです。

貼り付けたサイトは若干間違っています。

java -classpath .;./mysql-connector-java-5.1.7-bin.jar Sample
ではなく

java -classpath .:./mysql-connector-java-5.1.7-bin.jar Sample
です。わかりやすくすると、

java -classpath .:./[jarファイル] [Classファイル]

と並べることでクラスパスを通すことができました。

 

また出たエラーは次の問題ですね、、、

 

まとめ