Jdbc中的大文本和二進制處理

我們常常在網頁中需要處理一些圖片或者其他的信息,而這些信息在數據庫中的存放,對程序員來說,怎麼存放可以不去理會,但我們從如何JDBCAPI層出發怎麼去處理它們纔是最重要的

 我們處理大文本文件需要處理的一個存,一個取。

存:需要用到(statement或者preparedStatement)st.setCharacterStream(1, reader,(int)file.length());//設置存放的參數

取:Clob clob = rs.getClob(1);//獲取Clob存儲的值
    reader = clob.getCharacterStream();//將他轉換爲字符流

具體實例:public class ClobTest {
    public static void main(String[] args) throws Exception {
        //create();
        read();
    }
    static void create() throws Exception{
        Connection conn = null;
        PreparedStatement st = null;
        try {
           
            conn=JdbcUtils.getConnection();
            String sql = "insert into user_test(big_text) values(?)";
            st=conn.prepareStatement(sql);
            File file=new File("src/cn/vickyi/jdbc/JdbcUtils.java");
            Reader reader = new BufferedReader(new FileReader(file));
            st.setCharacterStream(1, reader,(int)file.length());
            //st.setAsciiStream(1, reader,(int)file.length());
            int len=st.executeUpdate();
            reader.close();
            System.out.println(len);
        } finally {
            JdbcUtils.free(null, st, conn);
        }
    }
    static void read() throws Exception{
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        Date birthday=null;
        try {
            conn=JdbcUtils.getConnection();
            String sql = "select big_text from user_test";
            //conn = JdbcUtils.getConnection();
            st = conn.prepareStatement(sql);

            rs = st.executeQuery();
            Writer writer=null;
            Reader reader=null;
            while (rs.next()) {
                Clob clob = rs.getClob(1);
                reader = clob.getCharacterStream();
                File file=new File("JdbcUtils_bak.java");
                writer = new BufferedWriter(new FileWriter(file));
                char[] buf=new char[1024];
                int len;
                while((len=reader.read(buf))>0){
                    writer.write(buf,0,len);
                }
            }
            writer.close();
            reader.close();
        } finally {
            JdbcUtils.free(rs, st, conn);
        }
    }
}
 

二進制文本的處理:

   理論差不多,同樣的一個存,一個取,分別用到的函數是:InputStream in = new BufferedInputStream(new FileInputStream(file));//讀取流
     st.setBinaryStream(1, in,(int)file.length());//設置Statement的?值

取:有二種方法

a、通過轉換來取得:Blob blob = rs.getBlob(1);
                InputStream in = blob.getBinaryStream();
b、直接取得:in=rs.getBinaryStream(1);//這是直接就獲取,不需要取得Blob

具體實例:

package cn.vickyi.jdbc;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Writer;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Date;

public class Blobtest {

    /**  @param args
     * @throws Exception */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        //create();
        read();
    }
    static void create() throws Exception{
        Connection conn = null;
        PreparedStatement st = null;
        try {
           
            conn=JdbcUtils.getConnection();
            String sql = "insert into Blod_test(big_bit) values(?)";
            st=conn.prepareStatement(sql);
            File file=new File("src/cn/vickyi/jdbc/2.jpg");
       
            InputStream in = new BufferedInputStream(new FileInputStream(file));
            st.setBinaryStream(1, in,(int)file.length());
           
            int len=st.executeUpdate();
            System.out.println(len);
            in.close();
        } finally {
            JdbcUtils.free(null, st, conn);
        }
    }
    static void read() throws Exception{
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        Date birthday=null;
        try {
            conn=JdbcUtils.getConnection();
            String sql = "select big_bit from Blod_test";
            //conn = JdbcUtils.getConnection();
            st = conn.prepareStatement(sql);
            rs = st.executeQuery();
            //一般都要把列名寫出來
            while (rs.next()) {
                Blob blob = rs.getBlob(1);
                InputStream in = blob.getBinaryStream();
                in=rs.getBinaryStream(1);//這是直接就獲取,不需要取得Blob
               
                File file=new File("1.jpg");
                OutputStream out = new BufferedOutputStream(new FileOutputStream(file));
                byte[] buf=new byte[1024];
                int len;
                while((len=in.read(buf))!=-1){
                    out.write(buf,0,len);
                }
            }

        } finally {
            JdbcUtils.free(rs, st, conn);
        }
    }
}
 

 

javabean:

  javabean中的對應的屬性值和JSP中設置的屬性值的名稱一定要對稱

Javabean具有良好的跨平臺,通用性,易於不懂Java的程序員來讀程序,簡寫代碼

用來替代繁瑣的servlet程序中的表達示值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章