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パブリックアカウント認証を実装するための簡単な手順

推薦する

Linux でのファイル コンテンツの重複排除と交差と差異の実装

1. データ重複排除日常業務では、Hive や Impala を使用してクエリとエクスポートを行う際...

W3C チュートリアル (8): W3C XML スキーマのアクティビティ

XML スキーマは、DTD に代わる XML ベースのものです。 XML スキーマは、DTD に代わ...

Docker ベースの MySQL マスタースレーブレプリケーション環境を構築するための実装手順

1. はじめに以前のプログラム アーキテクチャは次の形式になります。プログラムのサイズが大きくなると...

rpm を使用して指定されたバージョンの docker (1.12.6) をインストールする詳細な手順

1. 理由システムが Centos7.3 の場合、yum install docker を使用して直...

Vue は better-scroll を使用して水平スクロール方法の例を実現します

1. スクロールの実装原理better-scroll のスクロール原理は、ブラウザのネイティブスクロ...

SQLと各種NoSQLデータベースの使用シナリオの説明

SQL はメイントランクです。なぜ私はこのように理解するのでしょうか。技術的な観点からリレーショナル...

CSS3 タブアニメーションの例 背景切り替えの動的効果

CSS 3 アニメーションの例 - タブの背景切り替えの動的効果、具体的なコードは次のとおりです。 ...

Vue プロジェクトを使用して複数のプロキシを構成する際の注意事項

Vue プロジェクトの開発プロセスでは、ローカル デバッグの利便性のため、通常、vue.config...

Vueが学生管理機能を実装

この記事では、学生管理を実装するためのVueの具体的なコードを例として紹介します。具体的な内容は次の...

JavaScript プロトタイプとプロトタイプチェーンの深い理解

目次1. プロトタイプとは何ですか? 2. プロトタイプ__プロト__ 4. コンストラクター5. ...

CSS scroll-snap スクロールイベント停止と要素位置検出の実装

1. スクロールスナップはフロントエンド開発者にとって必須のスキルですCSS スクロール スナップは...

HTML+CSS でハートビートの特殊効果を作成する

今日は、シンプルなハートビート効果を作成します。多くのコードは必要ありません。ボックスを追加し、CS...

Docker Consul コンテナ サービスの更新と見つかった問題の概要

目次1. コンテナサービスの更新とDockerコンサルの検出1. サービス登録と検出とは何ですか? ...

MySQLインスタンスを安全にシャットダウンする方法

この記事では、mysqld プロセスをシャットダウンするプロセスと、MySQL インスタンスを安全か...

Linuxシステムはポート3306、8080などを外部に開放します。ファイアウォール設定の詳しい説明

多くの場合、Linux システムに Web サービス アプリケーション (Tomcat、Apache...