sql2o を使って、データベースに接続して SQL を実行する方法を書いていきます。
sql2o について
sql2o の特徴は以下の通りです。
バージョン
ブログ執筆時の製品バージョンは以下の通りです。
- Java 17
- Maven 3.8.6
- PostgreSQL 15.1
- sql2o 1.6.0
- pgJDBC 42.5.1(JDBC Driver)
- Lombok 1.18.24
1. ビルドファイルの作成
プロジェクトのフォルダの下に、ビルドファイルを作成します。
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.sample</groupId>
<artifactId>sql2o-postgresql</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.sql2o</groupId>
<artifactId>sql2o</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.5.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
JDBC ドライバーは必須で、Getter や Setter などを省略するために Lombok を追加しています。
2. モデルの作成
以下の POJO クラスを作成します。
src/main/java/org/sample/model/Task.java
package org.sample.model; import lombok.Getter; import lombok.Setter; import lombok.ToString; import java.util.Date; @Getter @Setter @ToString public class Task { private Long id; private String title; private Boolean isImportant; private Date dueDate; }
3. SELECT文の実行方法
以下の Javaプログラムを作成します。
src/main/java/org/sample/Select.java
package org.sample; import org.sample.model.Task; import org.sql2o.Connection; import org.sql2o.Sql2o; import java.util.List; public class Select { public static void main(String[] args) { // localhost の 5432 ポート、test データベースに、 // ユーザー usr、パスワード pass で接続 Sql2o sql2o = new Sql2o( "jdbc:postgresql://localhost:5432/test", "usr", "pass" ); // 重要なタスクを取得して表示 List<Task> tasks = getTasks(sql2o, true); for (Task task: tasks) { System.out.println(task); } // ID が 1 のタスクを取得して表示 Task task = getTask(sql2o, 1); System.out.println(); System.out.println(task); } // SQL のエイリアス(AS)で、 // テーブルの列名をモデルのプロパティ名に変更 private static final String SELECT_IMPORTANT = "SELECT " + "id, title, is_important AS isImportant, due_date AS dueDate " + "FROM tasks WHERE is_important = :isImportant"; private static List<Task> getTasks(Sql2o sql2o, boolean isImportant) { try (Connection con = sql2o.open()) { return con.createQuery(SELECT_IMPORTANT) .addParameter("isImportant", isImportant) .executeAndFetch(Task.class); } } // sql2o の addColumnMapping(String, String) で、 // テーブルの列名とモデルのプロパティ名のマッピングを追加 private static final String SELECT_ID = "SELECT " + "id, title, is_important, due_date " + "FROM tasks WHERE id = :id"; private static Task getTask(Sql2o sql2o, long id) { try (Connection con = sql2o.open()) { return con.createQuery(SELECT_ID) .addParameter("id", id) .addColumnMapping("is_important", "isImportant") .addColumnMapping("due_date", "dueDate") .executeAndFetchFirst(Task.class); } } }
3.1. マッピングについて
テーブルの列名とモデルのプロパティ名が違う場合は、上のプログラムのように、以下の対応が必要になります。
マッピング定義は、Map を使って追加することもできます。詳細は以下のリンク先を参照して頂ければと思います。
4. UPDATE文の実行方法
以下のソースコードを作成します。
src/main/java/org/sample/Update.java
package org.sample; import org.sql2o.Connection; import org.sql2o.Sql2o; public class Update { private static final String UPDATE_TITLE = "UPDATE tasks SET title = :title WHERE id = :id"; public static void main(String[] args) { // localhost の 5432 ポート、test データベースに、 // ユーザー usr、パスワード pass で接続 Sql2o sql2o = new Sql2o( "jdbc:postgresql://localhost:5432/test", "usr", "pass" ); // ID が 2 のタスクを更新 try (Connection con = sql2o.beginTransaction()) { con.createQuery(UPDATE_TITLE) .addParameter("title", "箸置きを買う") .addParameter("id", 2) .executeUpdate(); // トランザクションのコミット // コミットしない場合はロールバック(デフォルト) con.commit(); } } }
4.1. トランザクションについて
トランザクションは、commit() か rollback() が実行されないと、自動的にロールバックされます。
5. 動作確認
5.1. テーブルの作成
PostgreSQL に接続して、以下の SQL を実行します。
CREATE TABLE tasks ( id bigserial PRIMARY KEY, title varchar(100) NOT NULL, is_important boolean NOT NULL DEFAULT false, due_date date NOT NULL DEFAULT current_date );
5.2. データの登録
以下の SQL を実行して、データを投入します。
INSERT INTO tasks
(title, is_important, due_date)
VALUES
('お米を買う', true, '2022-12-10'),
('お茶碗を買う', false, '2022-12-11'),
('メモリを増設する', true, '2022-12-12'),
('ストレージを増設する', false, '2022-12-13');
5.3. SELECT文の実行
クラス SELECT を実行すると、SQL で取得したデータが表示されます。
5.4. UPDATE文の実行
クラス UPDATE を実行して、以下の SQL を実行します。
SELECT * FROM tasks WHERE id = 2;
実行すると、更新されたデータを確認できます。