最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

往MySQL中存儲圖片的方法

 更新時(shí)間:2019年09月02日 11:23:36   作者:hope2jiang  
這篇文章主要介紹了往MySQL中存儲圖片的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1 介紹

在設(shè)計(jì)到數(shù)據(jù)庫的開發(fā)中,難免要將圖片或音頻文件插入到數(shù)據(jù)庫中的情況。一般來說,我們可以同過插入圖片文件相應(yīng)的存儲位置,而不是文件本身,來避免直接向數(shù)據(jù)庫里插入的麻煩。但有些時(shí)候,向MySQL中插入圖片更加容易管理。那么在MySQL中該怎么存儲呢?

參考資料[1]中有個(gè)相當(dāng)清晰的例子,不過是基于MySQL圖形界面的查詢工具Query Brower的,你的機(jī)子上沒有安裝的話,可能得不到很好的理解。我在這里不在贅述,更詳細(xì)的資料請看給出的鏈接吧。

還有,[1]中的例子其實(shí)只是向我們說明了Query Brower的易用和強(qiáng)大,對我們在開發(fā)中實(shí)際應(yīng)用不是很大。所以下面就讓我們用JAVA寫一個(gè)向MySQL中存儲的簡單實(shí)例。

2 建表

首先,先要在數(shù)據(jù)庫中建表。我在名為test的數(shù)據(jù)庫下建立了一個(gè)叫pic的表。該表包括3列,idpic, caption和img。其中idpic是主鍵,caption是對圖片的表述,img是圖像文件本身。建表的SQL語句如下:

DROP TABLE IF EXISTS `test`.`pic`;
CREATE TABLE `test`.`pic` (
 `idpic` int(11) NOT NULL auto_increment,
 `caption` varchar(45) NOT NULL default '',
 `img` longblob NOT NULL,
 PRIMARY KEY (`idpic`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

將上面的語句輸入到命令行中(如果安裝了Query Brower, 你可以按照參考[1]中的指示來建表,那樣會更加方便。),執(zhí)行,表建立成功。

3 實(shí)現(xiàn)圖像存儲類

表完成后,我們就開始寫個(gè)Java類,來完成向數(shù)據(jù)庫中插入圖片的操作。我們知道,Java與數(shù)據(jù)庫連接是通過JDBC driver來實(shí)現(xiàn)的。我用的是MySQL網(wǎng)站上提供的MySQL Connector/J,如果你用的是其他類型的driver, 在下面的實(shí)現(xiàn)過程中可能會有些許差別。

3.1 裝載JDBC驅(qū)動,建立連接

JDK中提供的DriverManager接口用來管理Java Application 和 JDBC Driver之間的連接。在使用這個(gè)接口之前, DriverManager需要知道要連接的JDBC 驅(qū)動。最簡單的方法就是用Class.forName()來向DriverManager注冊實(shí)現(xiàn)了java.sql.Driver 的接口類。對MySQL Connector/J來說,這個(gè)類的名字叫com.mysql.jdbc.Driver。

下面這個(gè)簡單的示例說明了怎樣來注冊Connector/J Driver。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
 
public class LoadDriver {
  public static void main(String[] args) {
    try {
      // The newInstance() call is a work around for some
      // broken Java implementations
      Class.forName("com.mysql.jdbc.Driver").newInstance();
      
      // Connection con = DriverManager.getConnection(……)
      // ……
    } catch (Exception ex) {
      // handle the error
    }
}

向DriverManager注冊了驅(qū)動后,我們就可以通過調(diào)用 DriverManager.getConnection()方法來獲得和數(shù)據(jù)庫的連接。其實(shí)在上面的例子中就有這條語句,只不過被注釋掉了。在后面的實(shí)現(xiàn)中會有完整的例子。

3.2 PreparedStatement

完成上面的步驟后,我們就可以同過建立的連接創(chuàng)建Statement接口類,來執(zhí)行一些SQL語句了。在下面的例子,我用的是PreparedStatement,還有CallableStatement,它可以執(zhí)行一些存儲過程和函數(shù),這里不多講了。下面的代碼片斷是向pic表中插入一條記錄。其中(1)處Connection接口的對象con通過調(diào)用prepareStatement 方法得到預(yù)編譯的SQL 語句(precompiled SQL statement);(2)處是為該insert語句的第一個(gè)問號賦值,(3)為第二個(gè)賦值,(4)為第三個(gè),這步也是最該一提的,用的方法是setBinaryStream(),第一個(gè)參數(shù)3是指第三個(gè)問號,fis是一個(gè)二進(jìn)制文件流,第三個(gè)參數(shù)是該文件流的長度。

PreparedStatement ps;
…
ps = con.prepareStatement("insert into PIC values (?,?,?)"); // (1)
ps.setInt(1, id); //(2)
ps.setString(2, file.getName()); (3)
ps.setBinaryStream(3, fis, (int)file.length()); (4)
ps.executeUpdate();
…

3.3 完整代碼

上面列出了完整的代碼。

package com.forrest.storepic;
 import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
 
/**
 * This class describes how to store picture file into MySQL.
 * @author Yanjiang Qian
 * @version 1.0 Jan-02-2006
 */
public class StorePictures {
  
  private String dbDriver;
  private String dbURL;
  private String dbUser;
  private String dbPassword;
  private Connection con;
  private PreparedStatement ps; 
 
  public StorePictures() {
    dbDriver = "com.mysql.jdbc.Driver";
    dbURL = "jdbc:mysql://localhost:3306/test";
    dbUser = "root";
    dbPassword = "admin";
    initDB();
  }
  
  public StorePictures(String strDriver, String strURL,
      String strUser, String strPwd) {
    dbDriver = strDriver;
    dbURL = strURL;
    dbUser = strUser;
    dbPassword = strPwd;
    initDB();
  }
 
  public void initDB() {
    try {
      // Load Driver
      Class.forName(dbDriver).newInstance();
      // Get connection
      con = DriverManager.getConnection(dbURL,
          dbUser, dbPassword);      
    } catch(ClassNotFoundException e) {
      System.out.println(e.getMessage());
    } catch(SQLException ex) {
      // handle any errors
      System.out.println("SQLException: " + ex.getMessage());
      System.out.println("SQLState: " + ex.getSQLState());
      System.out.println("VendorError: " + ex.getErrorCode());
 
    } catch (Exception e) {
      System.out.println(e.getMessage());
    }
  }
 
  public boolean storeImg(String strFile) throws Exception {
    boolean written = false;
    if (con == null)
      written = false;
    else {
      int id = 0;
      File file = new File(strFile);
      FileInputStream fis = new FileInputStream(file);
      
      try {       
        ps = con.prepareStatement("SELECT MAX(idpic) FROM PIC");
        ResultSet rs = ps.executeQuery();
        
        if(rs != null) {
          while(rs.next()) {
            id = rs.getInt(1)+1;
          }
        } else {    
          return written;
        }
        
        ps = con.prepareStatement("insert "
            + "into PIC values (?,?,?)");
        ps.setInt(1, id);
        ps.setString(2, file.getName());
        ps.setBinaryStream(3, fis, (int) file.length());
        ps.executeUpdate();
        
        written = true;
      } catch (SQLException e) {
        written = false;
        System.out.println("SQLException: "
            + e.getMessage());
        System.out.println("SQLState: "
            + e.getSQLState());
        System.out.println("VendorError: "
            + e.getErrorCode());
        e.printStackTrace();
      } finally {       
        ps.close();
        fis.close();
        // close db con
        con.close();
      }
    }
    return written;
  }
  
  /**
   * Start point of the program
   * @param args CMD line
   */
  public static void main(String[] args) {
    if(args.length != 1) {
      System.err.println("java StorePictures filename");
      System.exit(1);
    }
    boolean flag = false;
    StorePictures sp = new StorePictures();
    try {
      flag = sp.storeImg(args[0]);
    } catch (Exception e) {
      e.printStackTrace();
    }
    if(flag) {
      System.out.println("Picture uploading is successful.");
    } else {
      System.out.println("Picture uploading is failed.");
    }
  }
}

4 總結(jié)

到此,我們就介紹完了使用往MySQL保存圖片的全過程。這個(gè)例子是個(gè)最簡單的實(shí)例,讀者可以根據(jù)自己的實(shí)際需要加入其它的一些功能,比如讀取文件,刪除等,使整個(gè)程序更加完善。在寫這篇文章的時(shí)候主要參考了參考[2],在此謝過。參考[3]中是一個(gè)相當(dāng)漂亮的例子,不僅有保存還有讀取,而且是有非常直觀的圖形界面,感興趣的可以深入研究。

以上所述是小編給大家介紹的往MySQL中存儲圖片的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • 千萬級記錄的Discuz論壇導(dǎo)致MySQL CPU 100%的優(yōu)化筆記

    千萬級記錄的Discuz論壇導(dǎo)致MySQL CPU 100%的優(yōu)化筆記

    談到自己在解決一個(gè)擁有 60 萬條記錄的 MySQL 數(shù)據(jù)庫訪問時(shí),導(dǎo)致 MySQL CPU 占用 100% 的經(jīng)過。在解決問題完成優(yōu)化(optimize)之后,我發(fā)現(xiàn) Discuz 論壇也存在這個(gè)問題,當(dāng)時(shí)稍微提了一下
    2010-12-12
  • MySQL使用集合函數(shù)進(jìn)行查詢操作實(shí)例詳解

    MySQL使用集合函數(shù)進(jìn)行查詢操作實(shí)例詳解

    這篇文章主要介紹了MySQL使用集合函數(shù)進(jìn)行查詢操作,結(jié)合實(shí)例形式詳細(xì)分析了MySQL使用集合函數(shù)進(jìn)行的運(yùn)算與查詢操作使用技巧,需要的朋友可以參考下
    2018-06-06
  • MySQL客戶端軟件(DBeaver)連接報(bào)錯(cuò)解決方案

    MySQL客戶端軟件(DBeaver)連接報(bào)錯(cuò)解決方案

    DBeaver是一個(gè)開源的通用數(shù)據(jù)庫管理工具,可以連接多種不同類型的數(shù)據(jù)庫,本文主要介紹了MySQL客戶端軟件(DBeaver)連接報(bào)錯(cuò)解決方案,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04
  • MYSQL中COMPACT行格式的具體使用

    MYSQL中COMPACT行格式的具體使用

    compact行格式是mysql中InnoDB存儲引擎存儲數(shù)據(jù)使用的一種行格式,本文主要介紹了MYSQL中COMPACT行格式的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08
  • 在Mysql數(shù)據(jù)庫里通過存儲過程實(shí)現(xiàn)樹形的遍歷

    在Mysql數(shù)據(jù)庫里通過存儲過程實(shí)現(xiàn)樹形的遍歷

    關(guān)于多級別菜單欄或者權(quán)限系統(tǒng)中部門上下級的樹形遍歷,oracle中有connect by來實(shí)現(xiàn),mysql沒有這樣的便捷途徑,所以MySQL遍歷數(shù)據(jù)表是我們經(jīng)常會遇到的頭痛問題,下面給大家介紹在Mysql數(shù)據(jù)庫里通過存儲過程實(shí)現(xiàn)樹形的遍歷,一起看看吧
    2016-11-11
  • 一文詳解MySQL中數(shù)據(jù)表的外連接

    一文詳解MySQL中數(shù)據(jù)表的外連接

    因?yàn)?nbsp;MySQL 是關(guān)系型數(shù)據(jù)庫,數(shù)據(jù)是拆分重組在多個(gè)數(shù)據(jù)表里面的。所以我們勢必要從多個(gè)數(shù)據(jù)表中提取數(shù)據(jù),通過 SQL 語句的內(nèi)連接與外連接就能夠?qū)崿F(xiàn)多表查詢了,本文就來講講MySQL的外連接
    2022-08-08
  • mysql數(shù)據(jù)庫連接池配置教程

    mysql數(shù)據(jù)庫連接池配置教程

    在與數(shù)據(jù)庫進(jìn)行連接的時(shí)候,會牽扯到數(shù)據(jù)庫連接池的配置,本文將詳細(xì)介紹mysql數(shù)據(jù)庫連接池配置,需要了解跟多的朋友可以參考下
    2012-11-11
  • MYSQL更新優(yōu)化實(shí)錄

    MYSQL更新優(yōu)化實(shí)錄

    本文給大家分享的是個(gè)人在對mysql數(shù)據(jù)進(jìn)行刷新的時(shí)候遇到的一個(gè)效率非常低下的問題的解決全過程,主要是針對sql語句來進(jìn)行優(yōu)化,有查找問題的方法,有解決方法,非常的詳細(xì),小伙伴可以參考下。
    2015-08-08
  • MySQL中的運(yùn)算符使用實(shí)例展示

    MySQL中的運(yùn)算符使用實(shí)例展示

    請問,什么是最好的參考文檔,我的答案是:真實(shí)可行的樣例語句。
    2010-12-12
  • 一文搞懂Mysql中的共享鎖、排他鎖、悲觀鎖、樂觀鎖及使用場景

    一文搞懂Mysql中的共享鎖、排他鎖、悲觀鎖、樂觀鎖及使用場景

    剛開始學(xué)習(xí)MySQL中鎖的時(shí)候,網(wǎng)上一查出來一堆,什么表鎖、行鎖、讀鎖、寫鎖、悲觀鎖、樂觀鎖等等等,直接整個(gè)人就懵了,下面這篇文章主要給大家介紹了關(guān)于Mysql中共享鎖、排他鎖、悲觀鎖、樂觀鎖及使用場景的相關(guān)資料,需要的朋友可以參考下
    2022-07-07

最新評論

永和县| 绵阳市| 滨海县| 泽库县| 涿鹿县| 大兴区| 洛南县| 兖州市| 忻州市| 安多县| 拉萨市| 金秀| 永川市| 衡水市| 八宿县| 济宁市| 中宁县| 靖远县| 阿巴嘎旗| 喀什市| 得荣县| 阿坝| 始兴县| 五峰| 苗栗县| 新民市| 西乌| 泗洪县| 外汇| 犍为县| 通城县| 获嘉县| 五指山市| 手机| 西平县| 庆元县| 资中县| 永城市| 得荣县| 丰原市| 青冈县|