MySQLに画像を保存する方法

MySQLに画像を保存する方法

1 はじめに

データベースを設計する場合、画像や音声ファイルをデータベースに挿入することは避けられません。一般的に言えば、ファイル自体ではなく、画像ファイルの対応する保存場所を挿入することで、データベースに直接挿入する手間を回避できます。しかし、場合によっては、MySQL に画像を挿入する方が管理しやすいこともあります。では、MySQL にどのように保存するのでしょうか?

参考文献[1]にはかなり明確な例が含まれていますが、これはMySQLのグラフィカルクエリツールQuery Browerに基づいています。マシンにインストールされていない場合は、よく理解できない可能性があります。ここでは詳細には触れませんので、詳しい情報については提供されているリンクを参照してください。

さらに、[1]の例はQuery Browerの使いやすさとパワーを示しているだけであり、私たちの開発ではあまり実用的ではありません。それでは、JAVA を使用して MySQL にデータを保存する簡単な例を書いてみましょう。

2 テーブルを作成する

まず、データベースにテーブルを作成する必要があります。 test というデータベースに pic というテーブルを作成しました。表には、idpic、caption、img の 3 つの列が含まれます。このうち、idpic は主キー、caption は画像の説明、img は画像ファイルそのものです。テーブルを作成するための SQL ステートメントは次のとおりです。

`test`.`pic` が存在する場合はテーブルを削除します。
テーブル `test`.`pic` を作成します (
 `idpic` int(11) NOT NULL auto_increment,
 `caption` varchar(45) NOT NULL デフォルト ''
 `img` longblob NULLではありません、
 主キー (`idpic`)
)ENGINE=InnoDB デフォルト文字セット=utf8;

上記のステートメントをコマンドラインに入力し(クエリブラウザがインストールされている場合は、参考文献[1]の指示に従ってテーブルを作成すると便利です)、実行すると、テーブルが正常に作成されます。

3 画像ストレージクラスの実装

テーブルが完成したら、データベースに画像を挿入する操作を完了するための Java クラスの作成を開始します。 Java とデータベースの接続は、JDBC ドライバーを通じて実現されることがわかっています。 MySQL の Web サイトで提供されている MySQL Connector/J を使用します。別の種類のドライバーを使用する場合は、以下の実装に若干の違いがある可能性があります。

3.1 JDBCドライバをロードして接続を確立する

JDK で提供される DriverManager インターフェイスは、Java アプリケーションと JDBC ドライバー間の接続を管理するために使用されます。このインターフェースを使用する前に、DriverManager は接続する JDBC ドライバーを認識している必要があります。最も簡単な方法は、Class.forName() を使用して、java.sql.Driver を実装するインターフェース クラスを DriverManager に登録することです。 MySQL Connector/J の場合、クラス名は com.mysql.jdbc.Driver です。

次の簡単な例は、Connector/J ドライバーを登録する方法を示しています。

java.sql.Connection をインポートします。
java.sql.DriverManager をインポートします。
java.sql.SQLException をインポートします。
 
パブリッククラス LoadDriver {
  パブリック静的voidメイン(String[] args) {
    試す {
      // newInstance() 呼び出しは、いくつかの回避策です
      // 壊れた Java 実装
      クラス.forName("com.mysql.jdbc.Driver").newInstance();
      
      // 接続 con = DriverManager.getConnection(……)
      // ...
    } catch (例外例) {
      // エラーを処理する
    }
}

ドライバーを DriverManager に登録した後、 DriverManager.getConnection()メソッドを呼び出してデータベースへの接続を取得できます。実際、このステートメントは上記の例に存在しますが、コメントアウトされています。次の実装に完全な例があります。

3.2 準備されたステートメント

上記の手順を完了すると、確立された接続を介して Statement インターフェイス クラスを作成し、いくつかの SQL ステートメントを実行できます。次の例では、いくつかのストアド プロシージャと関数を実行できる PreparedStatement と CallableStatement を使用していますが、ここではそれらについては説明しません。次のコード スニペットは、pic テーブルにレコードを挿入します。ここで、(1) Connection インターフェースのオブジェクト con は、prepareStatement メソッドを呼び出して、プリコンパイルされた SQL ステートメントを取得します。(2) 挿入ステートメントの最初の疑問符に値を割り当て、(3) 2 番目に値を割り当て、(4) 3 番目に値を割り当てます。このステップは最も注目に値します。使用されるメソッドは setBinaryStream() です。最初のパラメータ 3 は 3 番目の疑問符を参照し、fis はバイナリ ファイル ストリーム、3 番目のパラメータはファイル ストリームの長さです。

準備されたステートメント ps;
…
ps = con.prepareStatement("PIC値に挿入する (?,?,?)"); // (1)
ps.setInt(1, id); //(2)
ps.setString(2, file.getName()); (3)
ps.setBinaryStream(3, fis, (int)file.length()); (4)
ps.executeUpdate();
…

3.3 完全なコード

完全なコードは上記に記載されています。

パッケージ com.forrest.storepic;
 java.io.File をインポートします。
java.io.FileInputStream をインポートします。
java.sql.Connection をインポートします。
java.sql.DriverManager をインポートします。
java.sql.PreparedStatement をインポートします。
java.sql.ResultSet をインポートします。
java.sql.SQLException をインポートします。
 
/**
 * このクラスでは、画像ファイルを MySQL に保存する方法について説明します。
 * @author ヤンジャン・チェン
 * @バージョン 1.0 2006 年 1 月 2 日
 */
パブリッククラスStorePictures {
  
  プライベート文字列 dbDriver;
  プライベート文字列 dbURL;
  プライベート文字列 dbUser;
  プライベート文字列 dbPassword;
  プライベート接続con;
  プライベート PreparedStatement ps; 
 
  パブリックStorePictures() {
    dbDriver = "com.mysql.jdbc.Driver";
    dbURL = "jdbc:mysql://localhost:3306/test";
    dbUser = "root";
    dbPassword = "admin";
    初期化DB();
  }
  
  パブリックStorePictures(文字列strDriver、文字列strURL、
      文字列 strUser、文字列 strPwd) {
    dbDriver = strDriver;
    dbURL = strURL;
    dbUser = strUser;
    dbPassword = strPwd;
    初期化DB();
  }
 
  パブリックボイドinitDB() {
    試す {
      // ドライバーをロード
      クラス.forName(dbDriver).newInstance();
      // 接続を取得
      con = DriverManager.getConnection(dbURL,
          dbUser、dbPassword);      
    } キャッチ(ClassNotFoundException e) {
      System.out.println(e.getMessage());
    } キャッチ(SQLException ex) {
      // エラーを処理する
      System.out.println("SQLException: " + ex.getMessage());
      System.out.println("SQLState: " + ex.getSQLState());
      System.out.println("ベンダーエラー: " + ex.getErrorCode());
 
    } キャッチ (例外 e) {
      System.out.println(e.getMessage());
    }
  }
 
  パブリックブールストアImg(String strFile)は例外をスローします{
    ブール値が false と書かれています。
    (con == null)の場合
      記述 = false;
    それ以外 {
      整数ID = 0;
      ファイル file = new File(strFile);
      FileInputStream fis = 新しい FileInputStream(file);
      
      試す {       
        ps = con.prepareStatement("PICからMAX(idpic)を選択");
        結果セット rs = ps.executeQuery();
        
        if(rs != null) {
          while(rs.next()) {
            id = rs.getInt(1)+1;
          }
        } それ以外 {    
          書面で返却する。
        }
        
        ps = con.prepareStatement("挿入"
            + "PIC値(?、?、?)に");
        ps.setInt(1, ID);
        ps.setString(2, file.getName());
        ps.setBinaryStream(3, fis, (int) ファイル.length());
        ps.executeUpdate();
        
        記述 = true;
      } キャッチ (SQLException e) {
        記述 = false;
        System.out.println("SQLException: "
            + e.getMessage();
        System.out.println("SQLState: "
            + e.getSQLState();
        System.out.println("ベンダーエラー: "
            + e.getErrorCode());
        e.printStackTrace();
      ついに       
        ps.close();
        fis.close();
        // DB接続を閉じる
        con.close();
      }
    }
    書面で返却する。
  }
  
  /**
   * プログラムの開始点
   * @param args CMD 行
   */
  パブリック静的voidメイン(String[] args) {
    引数の長さが 1 ではない場合
      System.err.println("java StorePictures ファイル名");
      システム終了(1);
    }
    ブールフラグ = false;
    ストアピクチャ sp = 新しいストアピクチャ();
    試す {
      フラグ = sp.storeImg(args[0]);
    } キャッチ (例外 e) {
      e.printStackTrace();
    }
    if(フラグ) {
      System.out.println("画像のアップロードが成功しました。");
    } それ以外 {
      System.out.println("画像のアップロードに失敗しました。");
    }
  }
}

4 結論

ここまでで、MySQL に画像を保存するプロセス全体を紹介しました。この例は最も単純なものです。読者は実際のニーズに応じて、ファイルの読み取り、削除などの他の機能を追加して、プログラム全体をより完璧にすることができます。本稿執筆にあたり、主に文献[2]を参考にさせていただきました。ここに感謝申し上げます。参考文献[3]は非常に美しい例であり、保存だけでなく読み取りも可能で、非常に直感的なグラフィカルインターフェイスを備えています。興味のある方は、詳しく研究することができます。

以上が、私がご紹介したMySQLで写真を保存する方法です。お役に立てれば幸いです。ご質問があれば、メッセージを残していただければ、すぐに返信させていただきます。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。
この記事が役に立ったと思われた方は、ぜひ転載していただき、出典を明記してください。ありがとうございます!

以下もご興味があるかもしれません:
  • MySQL にテキストと画像を保存する方法
  • PHP を使用して MySQL の BLOB フィールドを操作する方法の例 [テキストと画像の保存]
  • Express は、フロントエンドとバックエンドの通信を実現し、写真をアップロードして愚か者のためにデータベース (mysql) に保存します (パート 2)
  • Express は、フロントエンドとバックエンドの通信を実現し、写真をアップロードしてデータベース (mysql) に保存します (愚か者向け) (I)
  • 画像の保存と閲覧の例 (Linux+Apache+PHP+MySQL)
  • MYSQL ストアドプロシージャと関数の簡単な記述

<<:  Hyper-V の紹介とインストールと使用 (詳細な図解)

>>:  H5 WeChatパブリックアカウント認証を実装するための簡単な手順

推薦する

vmware16 仮想マシンに共有フォルダを設定する方法

1. 仮想マシンに共有フォルダを設定します。 1. 処理する仮想マシンを選択し、右クリックして設定...

スクロールバーを非表示にしながらもスクロール効果を維持する純粋な CSS (モバイルと PC)

携帯モバイル ページは Chrome および Safari とのみ互換性があればよいため、カスタム ...

Dockerコンテナのログ処理の詳細な説明

Docker には多くのログ プラグインがあります。デフォルトでは json-file を使用します...

docker pruneコマンドは、あまり使用されないデータを定期的にクリーンアップするために使用できます。

目次docker システム df docker システム プルーンNoneオブジェクトをクリーンアッ...

ページ要素の絶対位置と相対位置に関するある程度の理解

今日から、定期的にちょっとした豆知識を整理していきます。簡単なものもあるかもしれませんが、どれも役に...

相同性とクロスドメイン、jsonp(関数カプセル化)、CORS原則の詳細な分析

目次同一起源ポリシーAjax リクエストの制限: Ajaxは自身のサーバーにのみリクエストを送信でき...

実用的な MySQL + PostgreSQL バッチ挿入更新 insertOrUpdate

目次1. 百度百科事典1. MySQL 2. PostgreSQL 3. MySQL に対する Po...

WeChatアプレットAmapマルチポイントルート計画プロセス例の詳細な説明

電話Amap API を呼び出す方法は? Amap が https://lbs.amap.com/a...

Vue のプラグインとコンポーネントの違いと使い方のまとめ

このチュートリアルの動作環境: Windows 7 システム、vue 2.9.6 バージョン、DEL...

vscodeでnpmを使用してbabelをインストールする方法

序文前回の記事ではNode.jsのインストールと設定を紹介しました。今回はVScodeでbableを...

MySQL フラッシュリストとダーティページフラッシュメカニズム

1. レビューMySQL の起動後にバッファ プールが初期化されます。バッファ プールは N 個の空...

HTMLページ間でパラメータを渡すフロントエンド方式の詳細な説明

プロジェクトでよくある状況として、案件リストなどのリストが存在することがあります。リスト内の項目をク...

Dockerコンテナでyumを呼び出すときのエラーの解決方法

dockerfile またはコンテナ内で yum を実行すると、エラーが報告され、ソースが見つかりま...

Vue の動的メニュー、動的ルートの読み込みと更新の落とし穴

目次必要:アイデア:レッスン:テキストを共有する:要約する必要:インターフェイスからサブメニュー デ...

vuex での Getter の使用法の詳細な説明

序文Vuex を使用すると、ストア内に「ゲッター」を定義できます (これはストアの計算されたプロパテ...