2022年6月9日木曜日

【Java】ファイルメーカーサーバーへJDBC接続しSQLを発行する方法

 


みなさまこんにちは、ムチャ@うつ病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ライフを(´∀`)ノ



0 件のコメント :
コメントを投稿

▼ブログを気に入っていただけたらRSS登録をお願いします!
▼ブログランキング参加中!応援よろしくお願いします。

▼スポンサーリンク