Java でデータベース(MySQL)にアクセス
Java でデータベース(MySQL)にアクセスしてみたのでメモ。
環境
-
Windows7 64bit
-
XAMPP 5.6.12
-
MySQL 5.6.26
-
-
NetBeans 8.02
-
文字コードの設定は、以下参照。
テスト用DBの準備
sample という名前のDBを作成。
ログイン
mysql -u root -p
sampleという名前のデータベースの作成。
create database sample character set 'utf8';
user というtable を作成。 属性は、id, pass, name, age とする。
create table user(id varchar(5) not null primary key, pass varchar(20) not null, name varchar(10), age int) character set 'utf8';
一覧を見ると
mysql> select * from user;
+-------+----------+--------+------+
| id | pass | name | age |
+-------+----------+--------+------+
| web01 | password | Taro | 20 |
| web02 | password | Jiro | 10 |
| web03 | password | Saburo | 7 |
| web04 | pass | Siro | 1 |
+-------+----------+--------+------+
4 rows in set (0.00 sec)
Java からDB へアクセス してCatalog名を出力するサンプル
JDBCドライバを使えば簡単にデータベースに接続できる。 MySQL用JDBCドライバであれば NetBeans 8 ではすでにインストールされている。
JDBCドライバのライブラリを追加
NetBeansではJDBCドライバはすでにインストールされているが、各プロジェクトにライブラリを追加する必要がある。
ライブラリの追加は、 プロジェクトの中の「ライブラリ」 を右クリックして「ライブラリの追加」を選択。 「MySQL JDBCドライバ」を選択して追加する。
コード
接続には、Connectionオブジェクトを使う。 DriverManager から getConnection を呼び、 DBの名前、ユーザ名とパスワードを与える。
Connection connection_mysql = null;
/*
* データベースと接続
* 「ライブラリの追加」で「MySQL JDBCドライバ」を追加しておく
*/
connection_mysql = DriverManager.getConnection("jdbc:mysql://localhost:3306/sample", "user_name", "password");
Connectionオブジェクトから .getCatalog() メソッドでCatalog名(DB名)を取得。
System.out.println("getCatalog: " + connection_mysql.getCatalog());
| import java.sql.Connection; | |
| import java.sql.DriverManager; | |
| import java.sql.SQLException; | |
| /** | |
| * データベース接続クラス | |
| */ | |
| public class DbConnect { | |
| public static void main(String[] args) { | |
| Connection connection_mysql = null; | |
| try { | |
| /* JDBCドライバのロード | |
| * 「com.mysql.jdbc.Driver」クラス名 | |
| * JDBC4以降ではClass.forName必要なし | |
| * http://www.ne.jp/asahi/hishidama/home/tech/java/DriverManager.html | |
| * Class.forName("com.mysql.jdbc.Driver"); | |
| */ | |
| /* | |
| * データベースと接続 | |
| * 「ライブラリの追加」で「MySQL JDBCドライバ」を追加しておく | |
| */ | |
| connection_mysql = DriverManager.getConnection("jdbc:mysql://localhost:3306/sample", "user_name", "password"); | |
| // 接続しているデータベース名を表示 | |
| System.out.println("MySQLに接続できました。"); | |
| System.out.println("getCatalog: " + connection_mysql.getCatalog()); | |
| } /*catch(ClassNotFoundException ce) { | |
| // JDBCドライバが見つからなかった場合 | |
| ce.printStackTrace(); | |
| } */ catch (SQLException se) { | |
| // データベースとの接続に失敗した場合 | |
| se.printStackTrace(); | |
| } finally { | |
| try { | |
| // データベースとの接続を解除 | |
| if (connection_mysql != null) { | |
| connection_mysql.close(); | |
| } | |
| } catch (SQLException se) { | |
| // データベースとの接続解除に失敗した場合 | |
| se.printStackTrace(); | |
| } | |
| } | |
| } | |
| } |
実行結果
MySQL に接続できれば、 Catalog名(DB名)が出力される。
DAOクラス(パターン)でデータベースに接続
データベースにアクセスする際、 DataAccessObject (DAO) を使うことで、データベースアクセス処理の部分を抽象化できる。DAOのみで データベース処理専門の処理クラスとする。
参考:DAOパターン サルでもわかる 逆引きデザインパターン 第3章 逆引きカタログ J2EE編 DAO(Data Access Object)
DAOクラスの作り方(必要機能)
-
DBへの接続
Connection オブジェクトを使って接続する。
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/sample", "root", "password"); -
SQL文を作成
SQL文には、
prepareStatement()を使う。 (Statement よりSQLインジェクションが起きにくい。 シングルクォートなどがエスケープされる。)参考:竹形誠司 ブログ:Java+MySQL+Tomcat:SQLの実行にはStatementよりPreparedStatementを使おう
SQL文を実行するには、
PreparedStatementオブジェクトの.executeQuery()を使う。ResultSetオブジェクトに 実行結果が格納される。
参考:PreparedStatement (Java Platform SE 8)PreparedStatement pre_statement = connection.prepareStatement("select * from user"); ResultSet result_set = pre_statement.executeQuery(); -
SQLの実行結果を確認
ResultSetオブジェクトの.nexr()メソッドで次のレコードに移動する。.getString('カラム名')で そのカラムの値をString型で取得できる。 他にもgetInt()など 各型で用意されている。while(result_set.next() /* 次のレコードに移動 */ ){ System.out.println(result_set.getString("name")); } -
close処理を行う
Connection,PreparedStatementとResultSetオブジェクトは、 DBと接続しているので、 closeメソッドを使って、DBとの接続を解除する。 解除しなままだと上限に達し、いずれ接続できなくなる。 try-cactch-finalyの finalyの中に書くことが多い。if (con != null) { con.close(); } if (ps != null) { ps.close(); } if (rs != null) { rs.close(); }
コード
| package sampledao; | |
| import java.sql.Connection; | |
| import java.sql.DriverManager; | |
| import java.sql.PreparedStatement; | |
| import java.sql.ResultSet; | |
| import java.sql.SQLException; | |
| /** | |
| * access MySQL DB by DAO pattern, print "name" of colum. | |
| * @author cartman | |
| */ | |
| public class SampleDao { | |
| /** | |
| * @param args the command line arguments | |
| */ | |
| public static void main(String[] args) { | |
| // TODO code application logic here | |
| Connection connection = null; | |
| PreparedStatement pre_statement = null; | |
| ResultSet result_set = null; | |
| try { | |
| // mySQLの接続 | |
| connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/sample?useUnicode=true&characterEncoding=utf8", "user_name", "password"); | |
| pre_statement = connection.prepareStatement("select * from user"); | |
| result_set = pre_statement.executeQuery(); | |
| while (result_set.next()) { | |
| System.out.println(result_set.getString("name")); | |
| } | |
| } catch (SQLException sqle) { | |
| sqle.printStackTrace(); | |
| } finally { | |
| closeSql(connection, pre_statement, result_set); | |
| } | |
| } | |
| static void closeSql(Connection con, PreparedStatement ps, ResultSet rs) { | |
| try { | |
| if (con != null) { | |
| con.close(); | |
| } | |
| if (ps != null) { | |
| ps.close(); | |
| } | |
| if (rs != null) { | |
| rs.close(); | |
| } | |
| } catch (SQLException sqle) { | |
| System.err.println("Error closeSql Func"); | |
| sqle.printStackTrace(); | |
| } | |
| } | |
| } |
実行結果
"name" カラムの値が表示される。
"name" カラムの値を表示