みなさまこんにちは、ムチャ@うつ病SE(@mutoj_rdm821)です。
今回は、ファイルメーカーサーバーに対してJDBC接続するお話です。
あまり需要はないと思いますが、情報もほとんどなかったのでまとめておきたいと思います。
※ファイルメーカークラウドはJDBC接続に対応していません。
JDBC接続を許可する
ファイルメーカーサーバーの管理コンソールにログインし、「コネクタ」から「ODBC/JDBC」を選択し、「ODBC/JDBC接続」を有効にします。
ドライバをダウンロードする
以下のURLからJDBCドライバをダウンロードします。
JDBC接続を行う
Spring Data JPAを使おうと思ったのですが、ドライバが対応していない云々のメッセージが出てくるので諦めました。
一般的な、
DriverManager
を使ったJDBC接続を行います。URLは以下の形式です。
jdbc:filemaker://[ホスト名]/[データベース名]
接続自体は何度も見た以下のコードで取得します。
Connection con = DriverManager.getConnection(url, username, password);
SQLを記述する
テーブル名やカラム名に日本語やスペースを含む場合、ダブルクォートでくくる必要があります。
これは普通に文字列で書こうとするとエスケープが大変ですが、Java15で追加された「テキストブロック」を使えばきれいに記述できます。
String sql = """ select "主キー" as pk, "作成時刻" as "date", "カテゴリ" as category, "ファイルパス" as Name from "添付ファイル" where "案件ID" = ? """;
ダブルクォート3つで囲んだ部分が1つの文字列になります。改行やインデントも含みます。この中ではダブルクォートもエスケープせずに記述できます。
作成したSQL文字列から
PreparedStatement
を生成して、後は通常のSQL実行と同じです。バイナリファイルを取得する
データベースにバイナリファイルを格納していて、それを取得するには
GetAs
関数を使います。String sql = """ select "主キー" as pk, "作成時刻" as "date", "カテゴリ" as category, "ファイル名" as Name, GetAs("ファイル本体",DEFAULT) as file, "案件ID" as applicationId from "添付ファイル" where "主キー" = ? """;
関数の第2引数は
DEFAULT
で大丈夫です。SQLを実行後、バイナリデータを取得するには以下のコードでできました。try (Connection con = manager.createConnection(); PreparedStatement ps = con.prepareStatement(sql);) { ps.setString(1, pk); try (ResultSet rs = ps.executeQuery()) { if (rs.next()) { InputStream in = rs.getBlob("file").getBinaryStream(); byte[] contents = in.readAllBytes(); :
まとめ
ファイルメーカーサーバーに対してJDBC接続をし、SQLを発行する手順についてまとめました。
ファイルメーカーのJDBCドライバはエラーメッセージが短くて分かりづらいので、この記事がお役に立てば幸いです。
それではみなさまよきJavaライフを(´∀`)ノ