JDBCドライバを使ってMySQLに接続するサンプルプログラムを作りました。ubuntuにJavaをインストールし、MySQLもubuntuのローカルにあります。
OS: ubuntu 20.04 LTS
Java: OpenJDK 1.8
MySQL: ver 8.0.30
まずは、MySQLのJDBCドライバを入手します。MySQLの公式ページに行きます。
「デベロッパーゾーン」をクリックします。
「MySQL Downloads」を選びます。
「Connector/J」を選びます。
Select Operating System: に「Ubuntu Linux」を、Select OS Version: には「Ubuntu Linux 20.04」を選びます。ドライバのバージョンは 8.0.30 です。「Download」を押下します。
ログインかサインアップを促す画面となりますが、下部にある「No thanks, just start my download.」をクリックします。
ファイルがダウンロードされます。
ダウンロードしたファイルですが、ファイル名が mysql-connector-java_8.0.30-1ubuntu20.04_all.deb となっていました。jarファイルがダウンロードされるものと思っていたので、ちょっと想定外です。debパッケージなので、このパッケージをubuntuにインストールします。
JDBCドライバのインストール
$ sudo apt install ./mysql-connector-java_8.0.30-1ubuntu20.04_all.deb
/usr/share/java 配下に mysql-connector-java-8.0.30.jar ができているのを見つけました。どうやらこれがMySQLのJDBCドライバのようです。
ここまでがJDBCドライバであるjarファイルの配置です。
サンプルプログラムを動かす前にMySQLの接続情報を確認しておきます。
サーバー: localhost
データベース名: testdb
ユーザ名: test
パスワード: test
コマンドラインでMySQLに接続したときのログです。SHOHINテーブルを検索しました。
同様のことをJavaでやってみます。JavaからSHOHINテーブルの検索をします。サンプルプログラム( JdbcSample.java )のソースです。文字コードはUTF-8で記載しています。
※テキストエディタの画像を貼り付けたのでソースコードは最後に記載しておきます。
処理としては、
- DBへの接続
- SQLの実行
- 結果の出力
- オブジェクトのclose
としています。
MySQLの場合の接続文字列の書式です。サンプルプログラムではポートがデフォルトのままなので省略しています。
jdbc:mysql://サーバー名:ポート/データベース名
オブジェクトのcloseですが、ResultSetに関してはPreparedStatementをcloseすれば自動的にcloseされるのですが、省略せずに書いています。エラー処理については、かなり省略しています。
javacコマンドでコンパイルします。
Javaのコンパイル
$ javac ./JdbcSample.java
サンプルプログラムを実行する前にJDBCドライバへのパスを通しておきます。
クラスパスの追加
$ export CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-8.0.30.jar
サンプルプログラムを実行します。
Javaの実行
$ java JdbcSample
画面上の出力結果
1, Apple, 120
2, Orange, 150
3, Banana, 100
実行してみてわかったことですが、ドライバ名を com.mysql.jdbc.Driver にして実行すると次のメッセージが出ます。
Loading class `com.mysql.jdbc.Driver’. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver’. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
googleで和訳すると
クラス「com.mysql.jdbc.Driver」をロードしています。これは非推奨です。新しいドライバクラスは「com.mysql.cj.jdbc.Driver」です。ドライバは SPI を介して自動的に登録され、ドライバクラスを手動でロードする必要は通常ありません。
とのことです。ですので、ドライバ名を com.mysql.cj.jdbc.Driver としています。MySQLのver8.xだと、こちらが正しいようです。
最後にソースコードを載せておきます。色が無いのはご容赦ください。
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JdbcSample
{
public static void main( String[] args )
{
//ドライバ名
String driver = "com.mysql.cj.jdbc.Driver";
//接続文字列
String url = "jdbc:mysql://localhost/testdb";
//ユーザー名
String user = "test";
//パスワード
String pass = "test";
//SQL文
String sql = "select * from SHOHIN";
try
{
//DBへの接続
Class.forName( driver );
Connection cn = DriverManager.getConnection( url, user, pass );
//SQLの実行
PreparedStatement st = cn.prepareStatement( sql );
ResultSet rs = st.executeQuery();
//結果の出力
while( rs.next() )
{
String col1 = rs.getString( "NUMBER" );
String col2 = rs.getString( "PRODUCT" );
String col3 = rs.getString( "PRICE" );
System.out.println( col1 + ", " + col2 + ", " + col3 );
}
//オブジェクトのclose
rs.close();
st.close();
cn.close();
}
catch ( ClassNotFoundException e )
{
System.out.println( "ドライバのロード失敗" );
e.printStackTrace();
}
catch ( SQLException e )
{
System.out.println( "SQLエラーコード: " + e.getErrorCode() );
e.printStackTrace();
}
}
}