【Java + PostgreSQL】DAO, DTO, PreparedStatementを使用して主要なデータ型でのテーブル操作をしてみる
JDBC接続、DAO, DTOでのサンプルプログラムはネット上にたくさんありますが、データ型パターンのサンプルがあまりないように感じられます。
なので今回はデータ型で主要な文字、数値、日付、日付時刻型でのデータベース操作 ( INSERT, UPDATE, DELETE, SELECT ) を実施していきます。
DAO, DTO, PreparedStatementを使用して主要なデータ型でのテーブル操作
今回使用した環境
インターネット接続可能のオンラインの環境
64 ビット オペレーティング システム
Windows 10 22H2
Java 17
PostgreSQL 14.4
ソースコード
テーブルは以下を使います。文字型、数値型、日付型、日付時刻型を項目として持っています。
CREATE TABLE test_table
(
test_code character varying(5) NOT NULL,
test_name character varying(20),
test_number integer,
test_date date,
test_time timestamp without time zone,
CONSTRAINT test_table_pkey PRIMARY KEY (test_code)
)
次にJavaのDTOクラスです。テーブルの項目に対応したフィールド変数を定義しています。
package jdbctest;
import java.sql.Date;
import java.sql.Timestamp;
public class TestTableDto {
private String testCode;
private String testName;
private Integer testNumber;
private Date testDate;
private Timestamp testTime;
public String getTestCode() {
return testCode;
}
public void setTestCode(String testCode) {
this.testCode = testCode;
}
public String getTestName() {
return testName;
}
public void setTestName(String testName) {
this.testName = testName;
}
public Integer getTestNumber() {
return testNumber;
}
public void setTestNumber(Integer testNumber) {
this.testNumber = testNumber;
}
public Date getTestDate() {
return testDate;
}
public void setTestDate(Date testDate) {
this.testDate = testDate;
}
public Timestamp getTestTime() {
return testTime;
}
public void setTestTime(Timestamp testTime) {
this.testTime = testTime;
}
@Override
public String toString() {
return "testCode: " + testCode +
", testName: " + testName +
", testNumber: " + String.valueOf(testNumber) +
", testDate: " + testDate.toString() +
", testTime: " + testTime.toString();
}
}
JavaのDAOクラスです。プリペアドステートメント ( PreparedStatement ) を使用してのINSERT, UPDATE, DELETE, SELECTを行っています。
package jdbctest;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class TestTableDao {
// DB接続情報
private static final String URL = "jdbc:postgresql://localhost:5432/sampledb";
private static final String USER = "testuser";
private static final String PASS = "xxxxxxxx";
private StringBuilder sb = new StringBuilder();
// データ追加
public void insert(TestTableDto testTableRow) throws SQLException {
sb.delete(0, sb.length());
sb.append("INSERT INTO test_table(");
sb.append(" test_code, test_name, test_number, test_date, test_time)");
sb.append(" VALUES (?, ?, ?, ?, ?);");
try (Connection conn = DriverManager.getConnection(URL, USER, PASS);
PreparedStatement ps = conn.prepareStatement(sb.toString())) {
// パラメータを設定
ps.setString(1, testTableRow.getTestCode());
ps.setString(2, testTableRow.getTestName());
ps.setInt(3, testTableRow.getTestNumber());
ps.setDate(4, testTableRow.getTestDate());
ps.setTimestamp(5, testTableRow.getTestTime());
// SQL実行
ps.executeUpdate();
}
}
// データ更新
public void update(TestTableDto testTableRow) throws SQLException {
sb.delete(0, sb.length());
sb.append("UPDATE test_table");
sb.append(" SET test_name = ?, test_number = ?, test_date = ?, test_time = ?");
sb.append(" WHERE test_code = ?;");
try (Connection conn = DriverManager.getConnection(URL, USER, PASS);
PreparedStatement ps = conn.prepareStatement(sb.toString())) {
// パラメータを設定
ps.setString(1, testTableRow.getTestName());
ps.setInt(2, testTableRow.getTestNumber());
ps.setDate(3, testTableRow.getTestDate());
ps.setTimestamp(4, testTableRow.getTestTime());
ps.setString(5, testTableRow.getTestCode());
// SQL実行
ps.executeUpdate();
}
}
// データ削除
public void delete(String testCode) throws SQLException {
sb.delete(0, sb.length());
sb.append("DELETE FROM public.test_table");
sb.append(" WHERE test_code = ?;");
try (Connection conn = DriverManager.getConnection(URL, USER, PASS);
PreparedStatement ps = conn.prepareStatement(sb.toString())) {
// パラメータを設定
ps.setString(1, testCode);
// SQL実行
ps.executeUpdate();
}
}
// データ検索
public ArrayList<TestTableDto> select(String testName) throws SQLException {
sb.delete(0, sb.length());
sb.append("SELECT test_code, test_name, test_number, test_date, test_time");
sb.append(" FROM test_table");
sb.append(" WHERE test_name like ?;");
try (Connection conn = DriverManager.getConnection(URL, USER, PASS);
PreparedStatement ps = conn.prepareStatement(sb.toString())) {
// パラメータを設定
ps.setString(1, testName);
// SQL実行
ResultSet rs = ps.executeQuery();
// リストにSQL実行結果を格納
ArrayList<TestTableDto> testTableList = new ArrayList<TestTableDto>();
while (rs.next()) {
TestTableDto testTableRow = new TestTableDto();
testTableRow.setTestCode(rs.getString("test_code"));
testTableRow.setTestName(rs.getString("test_name"));
testTableRow.setTestNumber(rs.getInt("test_number"));
testTableRow.setTestDate(rs.getDate("test_date"));
testTableRow.setTestTime(rs.getTimestamp("test_time"));
testTableList.add(testTableRow);
}
return testTableList;
}
}
}
最後に実行するためのmainメソッドを定義しているクラスです。データベースに対し、INSERT, UPDATE, DELETE, SELECTを一連の流れで行っています。
package jdbctest;
import java.sql.Date;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
public class JdbcTest {
public static void main(String[] args) {
try {
TestTableDao dao = new TestTableDao();
// テーブルにデータ追加
TestTableDto insertRow = new TestTableDto();
insertRow.setTestCode("00004");
insertRow.setTestName("ブルーベリー");
insertRow.setTestNumber(123);
insertRow.setTestDate(new Date(System.currentTimeMillis()));
insertRow.setTestTime(new Timestamp(System.currentTimeMillis()));
dao.insert(insertRow);
// テーブルのデータ更新
TestTableDto updateRow = new TestTableDto();
updateRow.setTestCode("00002");
updateRow.setTestName("マスカット");
updateRow.setTestNumber(456);
updateRow.setTestDate(Date.valueOf("2023-01-01"));
updateRow.setTestTime(Timestamp.valueOf("2023-01-01 02:03:04.555"));
dao.update(updateRow);
// テーブルのデータ削除
String deleteTestCode = "00001";
dao.delete(deleteTestCode);
// テーブルのデータ検索
String selectTestName = "%ベリー%";
ArrayList<TestTableDto> testTableList = dao.select(selectTestName);
for (TestTableDto testTableRow : testTableList) {
System.out.println(testTableRow);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
動作確認
まずテーブルの初期データです。
上記テーブルに、
①コード “00004" で 「ブルーベリー」を追加
②コード “00002" の名前を「マスカット」に更新
③コード “00001" のデータを削除
④名前「ベリー」を含むデータを部分一致で検索
を行います。
実行してみた結果がこちらです。INSERT, UPDATE, DELETE の動きは確認できました。
SELECT の動きはコンソールにて確認しました。「ベリー」の名前を含むデータが2件取得できていますね。
以上となります。
ここまでお読みいただきありがとうございました。