Bolb存储照片

Posted 非凡起航

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bolb存储照片相关的知识,希望对你有一定的参考价值。

import java.io.File;   
import java.io.FileInputStream;   
import java.io.FileOutputStream;   
import java.io.IOException;   
import java.io.InputStream;   
import java.io.OutputStream;   
import java.sql.*;   
  
  
public class BlobTest {   
    public static void main(String args[]){   
        Connection conn = null;   
        Statement stmt = null;   
        PreparedStatement ps = null;   
        ResultSet rs = null;   
           
        try {   
            Class.forName("oracle.jdbc.driver.OracleDriver");                      
            //获取数据库对象   
            conn =  DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","用户名","密码"); 
            conn.setAutoCommit(false);  
            
            //表存在则删除它   
            String sql = "DROP TABLE IF EXISTS blobtest";//mysql
        
            sql = "declare num number; begin"+
            " select count(1) into num from user_tables where table_name = upper(‘blobtest‘);"+
            " if num > 0 then execute immediate ‘drop table blobtest‘ ; end if;"+
            " end;";//Orcl
            
            stmt = conn.createStatement();   
            System.out.println(sql);   
            stmt.executeUpdate(sql);   
            //创建表   
            sql = "CREATE TABLE blobtest(" +    
            "b_id INT NOT NULL ,"+   
            "b_title VARCHAR(50),"+   
            "b_text Blob"  +
            ")";   
                
            System.out.println(sql);   
            stmt.executeUpdate(sql);   
            System.out.println("创建数据表成功!");   
               
            sql="INSERT INTO blobtest(B_ID,b_title,b_text)VALUES(?,?,?)";   
            ps = conn.prepareStatement(sql);   
            //插入图片  
            File file = new File("d://1.JPG");   
            InputStream inputStream = new FileInputStream(file);
               
            //以前的时候直接使用setBinaryStream就可以保存图片,但   
            //数据库的字符集换成 gbk后就不能用了,一直提示参数类型不匹配,在网上查了一下,   
            //直接向数据库中存byte可解决   
            //ps.setString(1, file.getName());   
            //ps.setBinaryStream(2,inputStream,file.length());   
            //ps.executeUpdate();   
            try {
                ps.setString(1, "1");   
                ps.setString(2, file.getName());   
                //新建一byte数组   
                byte[] buf=new byte[inputStream.available()];   
                //将文件读入到byte[]中   
                inputStream.read(buf);   
                ps.setBytes(3, buf);   
                ps.executeUpdate();   
                System.out.println("插入成功!");   
            } catch (IOException e1) {   
                System.out.println("保存图片到数据库成功!");   
                e1.printStackTrace();   
            }   
            conn.commit();  
               
               
            //读取数据   
            sql = "SELECT b_title,b_text FROM blobtest";   
            ps = conn.prepareStatement(sql);   
            rs = ps.executeQuery();   
            while(rs.next()){   
                System.out.println("图片名: "+rs.getString("b_title"));   
                Blob blob = rs.getBlob("b_text");   
                File file2 = new File("d://2.jpg");   
                OutputStream outputStream = new FileOutputStream(file2);   
                try {   
                    outputStream.write(blob.getBytes(1,(int)blob.length()));   
                } catch (IOException e) {   
                    e.printStackTrace();   
                }   
                //打印出来的为对象   
                System.out.println("图片内容: "+ blob.getBinaryStream());   
                   
            }   
        } catch (Exception e) {   
            e.printStackTrace();     
        }finally{   
            
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }   
        }   
           
    }   
  
} 

 

 

 

第二种:

import java.sql.*;  
import oracle.sql.*;  
import java.io.*;  

import oracle.jdbc.driver.OracleResultSet;  

public class WriteBlob {  
    public static void main(String[] args) {  
        try {  
            // 连接数据库
            Class.forName("oracle.jdbc.driver.OracleDriver");                      
            Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","用户名","密码");  
            conn.setAutoCommit(false);  
            
            //获取源照片数据  
            BLOB blob = null;  
            String fileName = "d://wenpaiyi//1.JPG";  
            File f = new File(fileName);  
            
            //先插入一条记录,用于后面获得一个Blob对象  
            PreparedStatement pstmt = conn.prepareStatement("insert into blobtest(b_id,b_text) values(?,empty_blob())");  
            pstmt.setString(1,"1");  
            pstmt.executeUpdate();  
            pstmt.close();  
            
            // 获得Blob对象(由于Blob是接口,不能实例化,所以只好用这种曲折方法获得)  
            pstmt = conn.prepareStatement("SELECT b_text FROM blobtest WHERE trim(b_id)=? ");  
            pstmt.setString(1,"1");  
            ResultSet rset = pstmt.executeQuery();  
            if (rset.next()){ 
                blob = (BLOB)rset.getBlob(1);  
            }
            pstmt.close();  
            if (blob == null){  
                System.out.println("blob is null");  
                conn.close();  
                return ;  
            }  
            
            // 填充Blob值,用于提交到数据库  
            FileInputStream fin = new FileInputStream(f);  
            System.out.println("file size = " + fin.available());  
            OutputStream out = blob.getBinaryOutputStream();  
            byte[] data = new byte[(int)fin.available()];  
            // 获取  
            fin.read(data);  
            out.write(data);  
            // 关闭资源    
            fin.close();  
            out.close(); 
            
            // 插入数据库  
            pstmt = conn.prepareStatement("update blobtest set b_text=? where b_id=?");  
            pstmt.setBlob(1,blob);  
            pstmt.setString(2,"1");  
            pstmt.executeUpdate();  
            pstmt.close();  
            // 提交  
            conn.commit(); 
            
            //---------------------------------------------------读取-------------------------------------
            String readSql = "SELECT b_text FROM blobtest WHERE trim(b_id)=? ";  
            PreparedStatement ps = conn.prepareStatement(readSql);  
            ps.setString(1, "1");  
            ResultSet rs = ps.executeQuery();  
            while (rs.next()) {  
                Blob image = rs.getBlob("b_text");  
                DataOutputStream dos =   
                    // 在FileOutputStream中指定文件输出路径  
                    new DataOutputStream(new FileOutputStream(new File("d://wenpaiyi//2.JPG")));  
                InputStream fis = image.getBinaryStream();  
                int out1;  
                byte[] outByte = new byte [100];  
                // 将blob对象输入流写入本地输出流中  
                while ((out1 = fis.read(outByte)) != -1) {  
                    dos.write(outByte);  
                }  
                fis.close();  
                dos.flush();  
                dos.close();  
            }  
            rs.close();  
            ps.close();  
            
            //---------------------------------------------------读取------------------------------------- 
            pstmt = conn.prepareStatement("SELECT b_text FROM blobtest WHERE trim(b_id)=? ");  
            pstmt.setString(1,"1");  
            rset = pstmt.executeQuery();  
            if (rset.next()){
                blob = (BLOB)((OracleResultSet)rset).getBLOB(1);  
            }
            pstmt.close();  
            if (blob == null){  
                System.out.println("blob2 is null");  
                conn.close();  
                return ;  
            }  
            // 输出到磁盘  
            // 获得  
            FileOutputStream fout = new FileOutputStream(new File("d://wenpaiyi//3.JPG"));  
            InputStream in = blob.getBinaryStream();  //asciiStreamValue()
            
            int out2 ;
            byte [] outbyte = new byte [100];
            
            while((out2 = in.read(outbyte)) != -1){
                fout.write(outbyte);
            }
            in.close();
            fout.flush();
            fout.close();
            
            conn.close();  
            // 打开  
            //Process pro = Runtime.getRuntime().exec("cmd /c start D:\\2.jpg");  
        }catch   (SQLException   e)   {  
            System.err.println(e.getMessage());  
            e.printStackTrace();  
        }catch(IOException   e)   {  
            System.err.println(e.getMessage());  
        }catch(ClassNotFoundException   e){  
            e.printStackTrace();  
        }  
    }  
}

 

以上是关于Bolb存储照片的主要内容,如果未能解决你的问题,请参考以下文章

JDBC-Bolb数据类型存储和查询(练习)

MySql MediumBlob——MySql的Bolb四种类型

mysql bolb对应java啥类型

BOLB转word文件,和word文件转换BOLB

Bolb

从图库中选择照片(onActivityResult()问题 - 我想是这样) - 片段Android