はじめに
今回はJavaでMySQLデータベースにファイルデータを格納する方法について勉強したことを記載していきたいと思います。
前提
前提として、データベースの接続を実施することができること。
以下記事を参考にしてみてください。
【Java】MySQLデータベースの接続方法について(接続からSQL発行まで) – SEもりのLog java
テーブルの用意
画像などのファイルデータをデータベースに格納するには、バイナリデータとして扱います。テーブルの絡むとしてはバイナリデータの型(BLOB型)などを用意します。
例
CREATE TABLE test_database.file_data (
ID INT PRIMARY KEY AUTO_INCREMENT,
FILE_NAME VARCHAR(255),
FILE_DATA BLOB
)
登録用のファイルを用意
登録用の画像ファイルを用意

ファイルの登録方法
バイナリデータのINSERT文の発行も通常と同様に「PreparedStatement」クラスを使用します。ただしデータのセット方法は「setblob」を使用します。
例
   public int testInsertBlob() {
      try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS)) {
         System.out.println("接続成功");
         // オートコミットをfalseに設定
         conn.setAutoCommit(false);
         String insertSQL = "INSERT INTO test_database.file_data(FILE_NAME, FILE_DATA) VALUES (?, ?)";
         try (PreparedStatement ps = conn.prepareStatement(insertSQL)) {
            ps.setString(1, "moriitem.png");
            ps.setBlob(2, new FileInputStream(".\\Test\\moriitem.png"));
            int result = ps.executeUpdate();
            // コミット
            conn.commit();
            return result;
         } catch(SQLException se) {
            // ロールバック
            conn.rollback();
            se.printStackTrace();
         } catch(Exception e) {
            // ロールバック
            conn.rollback();
            e.printStackTrace();
         }
      } catch(SQLException se) {
         se.printStackTrace();
      } catch(Exception e) {
         e.printStackTrace();
      } 
      return 0;
   }
ファイルの取り出し方法
バイナリデータのINSERT文の発行も通常と同様に「PreparedStatement」クラスを使用します。ただしデータのセット方法は「setBlob」を使用します。
例
   public void testSelect() {
      try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS)) {
         System.out.println("接続成功");
         String selectSQL = "SELECT ID, FILE_NAME, FILE_DATA FROM test_database.file_data WHERE ID = ?";
         try (PreparedStatement ps = conn.prepareStatement(selectSQL)) {
            ps.setString(1, "1");
            
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
               Blob filedata = rs.getBlob("FILE_DATA");
               byte[] imgData = filedata.getBytes(1, (int) filedata.length());
               
               System.out.println(imgData);
               // 出力ファイルを指定
               File file = new File(".\\Test\\test.png");
               DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));
               dos.write(imgData);
               dos.close();
            }
            rs.close();
         } catch(SQLException se) {
            se.printStackTrace();
         } catch(Exception e) {
            e.printStackTrace();
         }
      } catch(SQLException se) {
         se.printStackTrace();
      } catch(Exception e) {
         e.printStackTrace();
      } 
   }
出力確認
ファイルが出力できていることを確認する。

最後に
Javaの環境構築は、この記事を参照してみてください。
【開発環境構築】VS CodeでJavaを使用するための環境構築を実施する – SEもりのLog (selifemorizo.com)
以上、ログになります。
これからも継続していきましょう!!

 
  
  
  
  

コメント