最終更新日:170620 原本2016-01-14 

Java でデータベース(MySQL)にアクセス

Java でデータベース(MySQL)にアクセスしてみたのでメモ。

環境

  • Windows7 64bit

    • XAMPP 5.6.12

      • MySQL 5.6.26

    • NetBeans 8.02

文字コードの設定は、以下参照。

ConEmu + MySQL + NetBeans で文字コードをutf-8 に統一 Windows で起きる面倒な 文字コードを ConEmu + MySQL + NetBeans 環境で utf-8 に統一してみたのでメモ。 目次 環境 ConEmu の文字コード変更 MySQL の文字コード変更 NetBeans…

テスト用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 - Wikipedia

JDBCドライバのライブラリを追加

NetBeansではJDBCドライバはすでにインストールされているが、各プロジェクトにライブラリを追加する必要がある。

ライブラリの追加は、 プロジェクトの中の「ライブラリ」 を右クリックして「ライブラリの追加」を選択。 「MySQL JDBCドライバ」を選択して追加する。

ライブラリ 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();
}
}
}
}
view raw DbConnect.java hosted with ❤ by GitHub

JDBCドライバでMySQLのDBにアクセス

実行結果

MySQL に接続できれば、 Catalog名(DB名)が出力される。

NetBeansコンソールにDBのCatalog名を表示
Catalog名を出力

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");
    
    

    参考:Connection (Java Platform SE 8)

  • SQL文を作成

    SQL文には、 prepareStatement() を使う。 (Statement よりSQLインジェクションが起きにくい。 シングルクォートなどがエスケープされる。)

    参考:竹形誠司 ブログ:Java+MySQL+Tomcat:SQLの実行にはStatementよりPreparedStatementを使おう

    SQL文を実行するには、 PreparedStatement オブジェクトの.executeQuery()を使う。 ResultSet オブジェクトに 実行結果が格納される。

    
    PreparedStatement pre_statement = connection.prepareStatement("select * from user");
    ResultSet result_set = pre_statement.executeQuery();
    
    参考:PreparedStatement (Java Platform SE 8)

    参考:ResultSet (Java Platform SE 8)

  • SQLの実行結果を確認

    ResultSetオブジェクトの .nexr()メソッドで次のレコードに移動する。

    .getString('カラム名') で そのカラムの値をString型で取得できる。 他にもgetInt() など 各型で用意されている。

    
    while(result_set.next() /* 次のレコードに移動 */ ){
      System.out.println(result_set.getString("name"));
    }
    
  • close処理を行う

    Connection, PreparedStatementResultSet オブジェクトは、 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();
}
}
}
view raw SampleDao.java hosted with ❤ by GitHub

access MySQL DB by DAO pattern, print "name" of co ...

実行結果

"name" カラムの値が表示される。

SQL文'select * from user;'が実行され、カラムnameの値がNetBeansコンソールに表示される
MySQL(DB)の "name" カラムの値を表示