ubuntuのJavaからJDBCドライバを使ってMySQLに接続する。

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();
		}
	}
}

ubuntuにTomcatをインストールして使ってみた。

ubuntu20.04LTSにJavaのアプリケーションサーバーであるTomcatを入れて動かしてみました。学習用に入れただけなのでセキュリティ設定などはしていません。動かすだけであれば、ダウンロードサイトからtarファイルを持ってきて、展開して、任意の場所に置いて終わりです。Tomcatの起動と停止をしています。なお、Javaのインストールは済んでいます。

まず、Apache Tomcat のサイトにアクセスします。

赤枠➀の「Which version?」をクリックします。Tomcatのバージョンにより対応するServletとJSPのバージョンも異なってくるため、どのバージョンのTomcatを使用するかを決めます。Tomcatを動かす際のJavaのバージョンにも気をつけます。

なお、先ほどの赤枠③の記述によるとTomcat10以降では仕様が変わっているようです。赤枠③のgoogleでの翻訳です。

JakartaEEプラットフォームは、JavaEEプラットフォームが進化したものです。Tomcat10以降は、JakartaEEの一部として開発された仕様を実装しています。Tomcat9以前は、JavaEEの一部として開発された仕様を実装しています。

JavaEEをもとに作成されたソースコードを試したいので、Tomcat9にします。

Tomcat9
Version: 9.0.65
Servlet: 4.0対応
JSP: 2.3対応
Java: Java8以降であること

赤枠②の「Tomcat9」をクリックします。ダウンロードの画面が出るので「tar.gz」をクリックしてダウンロードします。

ダウンロードされたファイル名は「apache-tomcat-9.0.65.tar.gz」でした。ダウンロードされたファイルのハッシュ値を確認してみます。

$ sha512sum apache-tomcat-9.0.65.tar.gz

ダウンロードの画面の「sha512」のところをクリックして同じ出力結果となっていれば大丈夫です。

tarファイルを展開します。

$ tar xvf apache-tomcat-9.0.65.tar.gz

「apache-tomcat-9.0.65」というフォルダができました。これを任意の場所に配置します。

apache-tomcat-9.0.65フォルダの下にはbinフォルダがあるので、その中にある「startup.sh」を実行するとTomcatが起動します。

ブラウザで「http://localhost:8080/」にアクセスしてみます。Tomcatの画面が表示されます。

Tomcatの停止は「shutdown.sh」を実行します。

Tomcatの画面の「Manager App」をクリックするとManager画面を表示するのですが、デフォルトのままだとユーザ名とパスワードの設定がないため表示しません。表示させるにはconfフォルダにある「tomcat-users.xml」を修正します。confフォルダはapache-tomcat-9.0.65フォルダの下にあります。


<tomcat-users>
  :
<user username="user" password="pass" roles="manager-gui"/> ←追加(ユーザ名とパスワードを任意に設定)
  :
</tomcat-users>

Manager画面はwarファイルをTomcatにデプロイする際に使用する画面です。

Tomcatの起動と停止のログはlogsフォルダに出力されます。logsフォルダはapache-tomcat-9.0.65フォルダの下にあります。catalina.outファイルを見ると良いでしょう。

ServletをjavacコマンドでコンパイルするときにはCLASSPATHの設定が必要になるので、libフォルダの下にある「servlet-api.jar」にCLASSPATHを通しておきます。


$ export CLASSPATH="/Tomcatを配置したディレクトリ/apache-tomcat-9.0.65/lib/servlet-api.jar"

javacコマンドでコンパイルしたクラスファイルを /apache-tomcat-9.0.65/webapps/コンテキスト名/WEB-INF/classes に配置します。ブラウザからTomcatにアクセスすればServletの動きを確認できます。