【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件取得できていますね。

以上となります。

ここまでお読みいただきありがとうございました。

Java

Posted by だゆう