MySQL に接続できない問題
簡単に
クラスパスを本当にちゃんと通したか?
java -classpath .:./[jarファイル] [Classファイル]
だぞ!!
です。
詳しく
どうやらMySQLの新しいバージョンが出たことにより色々と仕様が変わっているらしい。そのせいで混乱したところもあるので、ver8に絞ってみて行く。
まずはサンプルプログラムを
土台が必要ということで、ここの回答者さんのプログラムを実行してみる。
これはmain関数だけなので、class Main として一つのクラスファイルとしてMain.java を作成した。
問題だったのは、「クラスパス」をよく理解していなかったこと。つなげたい二つのファイルが同じディレクトリに入っていればいいと思っていたが、そうではなかった。
ここのサイトのように「クラスパスを通せばいいよ」と言ってくれる人は多かったが、それを具体的にどうすればいいかを教えてくれる人があまりいなかった。
そこで、クラスパスの通し方を検索したところ、このサイトがヒット。
もし理解していない人は、全文をきっちり読んで欲しい。すぐに理解できる。
コマンドラインからクラスパスを実行した場合、
どこにクラスパスが通るのか?
そういう話をきっちりしておきましょう。
例えば、
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ファイル]
と並べることでクラスパスを通すことができました。
また出たエラーは次の問題ですね、、、