Java將文件導(dǎo)入到Oracle的BLOB字段

雖然說現(xiàn)在大部分公司都把文件存放在一個單獨的文件服務(wù)器上吃靠,在數(shù)據(jù)庫中存的是圖片的地址剥懒,但是還有一些比較落后的公司直接把圖片放在數(shù)據(jù)庫中,這種方式比較占用數(shù)據(jù)庫容量捺萌,而且不方便檢索鹿寨,前臺也不好處理新博,但是我就遇到了這樣一個需求薪夕,將本地文件導(dǎo)入到Oracle數(shù)據(jù)庫中脚草。

1、添加依賴

<dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.22</version>
        </dependency>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.2.0.2.0</version>
        </dependency>
    </dependencies>

我創(chuàng)建的是一個普通的maven項目原献。由于只需要和數(shù)據(jù)庫交互馏慨,所以只用添加數(shù)據(jù)庫驅(qū)動就可以了,我們開發(fā)用的是Oracle數(shù)據(jù)庫姑隅,所以用的是Oracle驅(qū)動写隶,如果是MySQL數(shù)據(jù)庫就需要使用MYSQL驅(qū)動。我還添加了druid的依賴讲仰,其實是沒有必要的慕趴。

2、配置文件

jdbc.properties

driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@192.168.6.222:1521:sid
userName=test
password=test

這個配置文件保存jdbc連接的配置信息鄙陡,放在resources目錄下冕房。

3、工具類

import com.alibaba.druid.pool.DruidDataSource;

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JDBCUtils {
    private static DruidDataSource dataSource = new DruidDataSource();
    static{
        try {
            //從本地文件中讀取配置信息
            Properties properties = new Properties();
            //獲取當(dāng)前類的根路徑 , 讀取配置文件
            InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
            properties.load(is);
            dataSource.setDriverClassName(properties.getProperty("driver"));
            dataSource.setUrl(properties.getProperty("url"));
            dataSource.setUsername(properties.getProperty("userName"));
            dataSource.setPassword(properties.getProperty("password"));
            dataSource.setMaxActive(150);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() {
        Connection cn = null;
        try {
            cn = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return cn;
    }
    public static void close(Statement st, Connection cn){

       close(null,st,cn);
    }
    public static void close(ResultSet rs, Statement st, Connection cn){
        //關(guān)閉連接
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(st!=null){
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(cn!=null){
            try {
                cn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

JDBCUtils工具類用于讀取配置文件趁矾、獲取連接耙册、關(guān)閉連接。

4毫捣、主類

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.PrintStream;
import java.sql.*;

/**
 * @author huwen
 */
public class ImportImage {

    private Connection conn;
    /**
     * 向表中插入圖片
     *
     * @param path 圖片所在的路徑
     * @return 整形 判斷成功或失敗
     */
    public int insertImage(File path) throws Exception {
        int i = 0;
        Statement st = null;
        ResultSet rs = null;
        conn=JDBCUtils.getConnection();
        //設(shè)置數(shù)據(jù)庫為不自動提交详拙,必須的一步
        conn.setAutoCommit(false);
        //先插入一個空對象,這里我調(diào)用了Empty_BLOB()函數(shù)
        st = conn.createStatement();
        //先插入一個空對象蔓同,這里我調(diào)用了Empty_BLOB()函數(shù)
        String paperNo = path.getName().split("\\.")[0];
        String insertSql = "insert into TF_F_CARDPARKPHOTO_SZ_TMP (parpno,picture,operatetime) values ('"+paperNo+"',Empty_BLOB(),sysdate)";
        i = st.executeUpdate(insertSql);
        //以行的方式鎖定
        String selectSql =  "select picture from TF_F_CARDPARKPHOTO_SZ_TMP where parpno= '"+paperNo+"' for update";
        rs = st
                .executeQuery(selectSql);

        if (rs.next()) {
            //得到流
            oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob(1);
            //從得到的低級流構(gòu)造一個高級流
            if(blob==null){
                System.out.println(paperNo);
            }
            PrintStream ps = new PrintStream(blob.getBinaryOutputStream());
            BufferedInputStream bis = new BufferedInputStream(
                    new FileInputStream(path));
            byte[] buff = new byte[1024];
            int n = 0;
            //從輸入到輸出
            while ((n = bis.read(buff)) != -1) {
                ps.write(buff, 0, n);
            }
            //清空流的緩存
            ps.flush();
            //關(guān)閉流饶辙,注意一定要關(guān)
            ps.close();
            bis.close();
        }
        conn.commit();
        JDBCUtils.close(rs,st,conn);
        return i;
    }

    public static void main(String[] args) throws Exception {
        ImportImage test=new ImportImage();
        File file = new File("C:\\Users\\huwen\\Documents\\1109");
        for (File f : file.listFiles()) {
            test.insertImage(f);
        }
        System.out.println("OK");

    }
}

首先要保證表中沒有數(shù)據(jù),并且有一個字段數(shù)據(jù)類型為BLOB斑粱。這種做法的原理是先向表中插入一個Empty_Blob()函數(shù)創(chuàng)建的數(shù)據(jù)弃揽,然后以行的方式鎖定讀取該字段信息,從磁盤中讀取文件寫入。中間一定要注意關(guān)閉自動提交蹋宦,執(zhí)行完后進(jìn)行手動提交披粟。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市冷冗,隨后出現(xiàn)的幾起案子守屉,更是在濱河造成了極大的恐慌,老刑警劉巖蒿辙,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拇泛,死亡現(xiàn)場離奇詭異,居然都是意外死亡思灌,警方通過查閱死者的電腦和手機俺叭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泰偿,“玉大人熄守,你說我怎么就攤上這事『孽耍” “怎么了裕照?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長调塌。 經(jīng)常有香客問我晋南,道長,這世上最難降的妖魔是什么羔砾? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任负间,我火速辦了婚禮,結(jié)果婚禮上姜凄,老公的妹妹穿的比我還像新娘政溃。我一直安慰自己,他們只是感情好檀葛,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布玩祟。 她就那樣靜靜地躺著,像睡著了一般屿聋。 火紅的嫁衣襯著肌膚如雪空扎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天润讥,我揣著相機與錄音转锈,去河邊找鬼。 笑死楚殿,一個胖子當(dāng)著我的面吹牛撮慨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼砌溺,長吁一口氣:“原來是場噩夢啊……” “哼影涉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起规伐,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤蟹倾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后猖闪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鲜棠,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年培慌,在試婚紗的時候發(fā)現(xiàn)自己被綠了豁陆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡吵护,死狀恐怖盒音,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情何址,我是刑警寧澤里逆,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布进胯,位于F島的核電站用爪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏胁镐。R本人自食惡果不足惜偎血,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盯漂。 院中可真熱鬧颇玷,春花似錦、人聲如沸就缆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽竭宰。三九已至空郊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間切揭,已是汗流浹背狞甚。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留廓旬,地道東北人哼审。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涩盾。 傳聞我的和親對象是個殘疾皇子十气,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344