JDBC
はじめに
データベースに指示を送り操作するものがSQLです。
Javaには、データベース操作専用のAPIがあります。それが、JDBC APIです。
Javaでデータベースにアクセスするアプリケーション開発に必要な JDBC の基本についてご紹介します。
以下の内容をご紹介します。
(1)JDBC
1-1 JDBCとは
JDBC(Java DataBase Connectivity)とは、Javaからデータベースにアクセスする場合に用いられる共通インターフェースです。JDBCには、次のようなパッケージがあります。
- java.sql パッケージ データベースを操作する基本APIを提供。 java.sqlで提供されている主なクラス・インターフェースは、次のようなものがあります。
- javax.sql パッケージ データベースアクセス時のサーバ側での処理を行う場合に用いるAPIを提供。
java.sqlを実装したクラス
インターフェース / クラス名 | 機能 |
DriverManager クラス | JDBCドライバを管理する |
Connection インターフェース | データベースへの接続・切断を行う |
Statement インターフェース | 標準的なSQL文を実行する |
ResultSet インターフェース | データベースの結果セットを表すデータの表 |
JDBCを実装したクラスをJDBCドライバといいます。
このJDBCドライバがJavaプログラムとデータベースを結び付けています。
使用するデータベースに合わせてJDBCを利用してください。
各JDBCドライバは、DBMS(データベース管理システム:Database Manegement System)の開発元よりJARファイルとして、提供されています。
尚、プログラムを実行する場合は、CLASSPATH環境変数にJARファイルのパスを登録してください。
1-2 データベース環境
今回使用するデータベースの環境及びテーブルは以下の通りです。データベース環境
DBMS | MySQL Community Server 8.0.22 |
JDBC ドライバ | MySQL-Connector-J 8.0.22 |
JDBC ドライバタイプ | タイプ4 |
JARファイル | mysql-connector-java-8.0.22.jar |
データベース接続環境
ユーザ名 | root |
パスワード | forStudy |
ホスト名 | localhost |
ポート番号 | 3306 |
データベース名 | db_ex |
テーブル:商品一覧
列名 | データ型 | 制約 |
id | INT | NOT NULL , PRIMARY KEY |
name | VARCHAR(100) | - |
price | INT | - |
id INT |
name VARCHAR(100) |
price INT |
1 | ○○○小説 | 800 |
2 | ABC資格 参考書 | 2500 |
3 | ABC資格 問題集 | 2800 |
4 | △△△技術書 | 4200 |
5 | □□□漫画全巻 | 3200 |
(2)JDBC
一般的なデータベースに接続して処理する流れは、次の通りです。
//1)java.sql パッケージのインポート
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DatabaseEx {
public static void main(String[] args) {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
//2)接続するデータベースを指定
String url = "jdbc:mysql://localhost:3306/db_ex?"
+ "useUnicode=true&"
+ "useJDBCCompliantTimezoneShift=true&"
+ "useLegacyDatetimeCode=false&serverTimezone=UTC";
//3)データベースに接続
String user = "root";
String password = "forStudy";
con = DriverManager.getConnection(url, user, password);
//4)Statementの取得
stmt = con.createStatement();
//5)SQL文の実行
String sql = "SELECT * FROM 商品一覧";
rs = stmt.executeQuery(sql);
//6)結果の取得
while (rs.next()) {
System.out.println("id : " + rs.getInt(1));
System.out.println("name : " + rs.getString(2));
System.out.println("price : " + rs.getInt(3) + "¥n");
}
} catch (SQLException e1) {
e1.printStackTrace();
} finally {
//7)接続のクローズ
try {
if(rs != null) { rs.close();}
if(stmt != null) { stmt.close();}
if (con != null) { con.close(); }
} catch (SQLException e2) { e2.printStackTrace(); }
}
}
}
id : 1
name : ○○○小説
price : 800
id : 2
name : ABC資格 参考書
price : 2500
id : 3
name : ABC資格 問題集
price : 2800
id : 4
name : △△△技術書
price : 4200
id : 5
name : □□□漫画全巻
price : 3200
name : ○○○小説
price : 800
id : 2
name : ABC資格 参考書
price : 2500
id : 3
name : ABC資格 問題集
price : 2800
id : 4
name : △△△技術書
price : 4200
id : 5
name : □□□漫画全巻
price : 3200
2-1 データベース接続
1)java.sqlパッケージをのインポート
「import java.sql.*;」としても良いです。
また、「Connection con = null;」、「Statement stmt = null;」、「ResultSet rs = null;」で各インターフェースの変数宣言を行っています。
2)接続するデータベースを指定
通信先のデータベースをデータベースを特定するJDBC URLを文字列で指定します。 URLは使用するデータベースによって異なります。
URLの構文は次の通りです。
<subprotocol>:JDBC ドライバ独自のプロトコル名。ドライバで異なる。
<subname>:データベースを特定するための情報。ホスト名、ポート番号、データベース名 等
?<JDBC接続オプション>:文字化け防止やタイムゾーン設定といったオプションを指定する。
3)データベースに接続
データベースへの接続は、DriverManager クラスgetConnection()メソッドを用いてConnection オブジェクトを取得します。Connection オブジェクト取得できなかった場合は、SQLException 例外がスローされます。
また、getConnection()メソッドは、2種類用意されています。
「import java.sql.*;」としても良いです。
また、「Connection con = null;」、「Statement stmt = null;」、「ResultSet rs = null;」で各インターフェースの変数宣言を行っています。
2)接続するデータベースを指定
通信先のデータベースをデータベースを特定するJDBC URLを文字列で指定します。 URLは使用するデータベースによって異なります。
URLの構文は次の通りです。
jdbc:<subprotocol>://<subname>?<JDBC接続オプション>
jdbc:プロトコル。<subprotocol>:JDBC ドライバ独自のプロトコル名。ドライバで異なる。
<subname>:データベースを特定するための情報。ホスト名、ポート番号、データベース名 等
?<JDBC接続オプション>:文字化け防止やタイムゾーン設定といったオプションを指定する。
データベースへの接続は、DriverManager クラスgetConnection()メソッドを用いてConnection オブジェクトを取得します。Connection オブジェクト取得できなかった場合は、SQLException 例外がスローされます。
また、getConnection()メソッドは、2種類用意されています。
【getConnection()メソッド】
メソッド名 | 説明 |
static Connection getConnection(String url , String user , String password) throws SQLException |
指定されたデータベースURLに ユーザ名とパスワードを用いて接続する |
static Connection getConnection(String url) throws SQLException |
指定されたデータベースURLに接続する |
2-2 SQL送信
4)Statementの取得
SQL文を実行するために、Connection インターフェースのcreateStatement()メソッドを用いてStatement オブジェクトを取得します。
5)SQL文の実行
SQL文の実行は、Statement インターフェースのメソッドを用います。実行するSQL文は、文字列で用意します。
Statement インターフェースには、実行するSQL文の違いによっていくつかのメソッドが用意されています。
6)結果の取得
SELECT文を実施したので、検索結果がexecuteQuery()メソッドによりResultSetオブジェクトとして返されます。
以下の手順で行および列にアクセスします。
SQL文を実行するために、Connection インターフェースのcreateStatement()メソッドを用いてStatement オブジェクトを取得します。
5)SQL文の実行
SQL文の実行は、Statement インターフェースのメソッドを用います。実行するSQL文は、文字列で用意します。
Statement インターフェースには、実行するSQL文の違いによっていくつかのメソッドが用意されています。
【Statement インターフェースの主なメソッド】
メソッド名 | 戻り値 | 使用SQL文 | 説明 |
ResultSet executeQuery(String sql) throws SQLException |
単一のResultSetオブジェクト | SELECT文 | 指定されたSQL文を実行する |
int executeUpdate(String sql) throws SQLException |
INSERT文、UPDATE文、DELETE文→行数 DDL文(何も返さないSQL文)→0 |
INSERT文、UPDATE文、DELETE文、 SQL DDL文 |
指定されたSQL文を実行する |
6)結果の取得
SELECT文を実施したので、検索結果がexecuteQuery()メソッドによりResultSetオブジェクトとして返されます。
以下の手順で行および列にアクセスします。
- 行へのアクセス next()メソッドにより、1行ずつ行にアクセスします。next()メソッドは、次に行が存在する場合にtrueを返し、行が存在しない場合にfalseを返します。 尚、next()メソッドが1回も呼び出されずにデータの取得を試みるとSQLException 例外がスローされます。
- 列へのアクセス getterメソッドの引数に列番号 or 列名を指定することで、データを取得します。SQLのデータ型に合わせてgetterメソッドが用意されています。
列番号は、左から右に番号が振られ、最初の列番号は1です。
【主なgetterメソッド】
SQL型 | getterメソッド名 |
CHAR / VARCHAR | getString() |
INTEGER / INT | getInt() |
DOUBLE | getDouble() |
DATE | getDate() |
TIME | getTime() |
【行および列へのアクセス】
2-3 データベース切断
7)接続のクローズ
全ての処理が終了したら、close()メソッドを用いてリソースを解放します。
全ての処理が終了したら、close()メソッドを用いてリソースを解放します。
まとめ
「JDBC」についてご紹介しました。
お役に立てると幸いです。
↑