前準備
第六章のJDBCについて実装してみるに辺り、ローカルでDBサーバを起動する必要がある。今回はpostgreを使うことにした。環境構築に際しては下記記事を参考にしている。 www.flyenginer.com 参考どころか、そのまま上記記事と同じことをしているので皆さんも是非。 また、作成したDBに対して下記SQLを流してテーブルを作成し、動作確認で利用している。SQLの動作には、A5M2を利用している。
CREATE TABLE person ( id varchar(12) NOT NULL, name varchar(30) NOT NULL, sex varchar(1) NOT NULL, job varchar(12), PRIMARY KEY (id) ); INSERT INTO person (id, name, sex, job) VALUES ('000000000000' ,'test' ,'0' , 'tester');
DB操作実装してみる
SQLには下記3種類の操作言語が用意されている。前準備で利用してテーブル作成に利用したCREATEがDDLに当たる。同様に前準備にて新規データを挿入に利用したINSERTはDMLに当たる。DCLはデータベース操作する権限の付与などを行う際に利用する(今回は利用しない)。
- DDL(Data Definition Language)…データ定義言語
- DML(Data Manipulation Language)…データ操作言語
- DCL(Data Control Language)…データ制御言語
JDBCを使うことで、Javaを使ってSQLを実行することができるようになるはずなので、今回はDMLを使ってINSERT、DELETE、SELECTを実装してみる。
DB操作してみる
前準備で作成してテーブル person を操作する。
public class Main { public static void main(String[] args) throws IOException { Connection con = null; try { con = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "postgres", "test"); con.beginRequest(); var sql_delete = "DELETE FROM person WHERE id = ?;"; var sql_insert = "INSERT INTO person (id, name, sex, job) VALUES (? ,?, ?, ?);"; var sql_select = "SELECT * FROM person WHERE id = ?;"; PreparedStatement ps_delete = con.prepareStatement(sql_delete); ps_delete.setString(1,"000000000000"); PreparedStatement ps_insert = con.prepareStatement(sql_insert); ps_insert.setString(1,"000000000000"); ps_insert.setString(2,"test"); ps_insert.setString(3,"1"); ps_insert.setString(4,"tester"); PreparedStatement ps_select = con.prepareStatement(sql_select); ps_select.setString(1,"000000000000"); System.out.println("DELETE実行結果:" + ps_delete.executeUpdate()); System.out.println("INSERT実行結果:" + ps_insert.executeUpdate()); ResultSet rs = ps_select.executeQuery(); rs.next(); System.out.println("SELECT実行結果:"); System.out.println("id :" + rs.getString(1)); System.out.println("name:" + rs.getString(2)); System.out.println("sex :" + rs.getString(3)); System.out.println("job :" + rs.getString(4)); } catch (Exception e) { System.out.println("エラー発生:" + e.getMessage()); } finally { if (Objects.nonNull(con)) con.close(); } } }
実行結果
DELETE実行結果:1
INSERT実行結果:1
SELECT実行結果:
id :000000000000
name:test
sex :1
job :tester
まとめ
実行結果を管理するResultSetクラスは、扱い方には癖があるように思う。リレーショナルデータベースのデータが得られるselectの結果は、nextメソッドを使って1つずつ確認するような手順が必要になるようだ。また、SQLの値に変数を設定する際には、string型やint型によって利用するメソッドを変える必要があるなど面倒な手順がそれなりに必要となってくる。その辺りのポイントをおdのように抑えていくべきかを整理していきたい。