JDBC:数据库操作:BLOB数据处理

CLOB主要保存海量文字,而BLOB是专门保存二进制数据:包括,图片,音乐,影片。等。

在MYSQL中,BLOB类型使用LONGBLOB声明,最高可存储4G内容。

创建一个表:

create table userblob
(
    id int(4) primary key not null auto_increment,
    name varchar(30),
    photo longblob
);

代码:

package 类集;
import java.sql.Connection ;
import java.sql.DriverManager ;
import java.sql.SQLException ;
import java.sql.PreparedStatement ;
import java.io.File ;
import java.io.FileInputStream ;
import java.io.InputStream ;
public class BlobDemo01{
    // 定义MySQL的数据库驱动程序
    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
    // 定义MySQL数据库的连接地址
    public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ;
    // MySQL数据库的连接用户名
    public static final String DBUSER = "root" ;
    // MySQL数据库的连接密码
    public static final String DBPASS = "aaaaaa" ;
    public static void main(String args[]) throws Exception{    // 所有异常抛出
        Connection conn = null ;        // 数据库连接
        PreparedStatement pstmt = null ;
        String name = "小华" ;
        String sql = "INSERT INTO userblob(name,photo) VALUES (?,?) " ;
        Class.forName(DBDRIVER) ;    // 加载驱动程序
        conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;
        pstmt = conn.prepareStatement(sql) ;
        File f = new File("d:" + File.separator + "图片1.JPG") ;    // 图片文件
        InputStream input = null ;
        input = new FileInputStream(f) ;
        pstmt.setString(1,name) ;    // 设置第一个“?”的内容
        pstmt.setBinaryStream(2,input,(int)f.length()) ;    // 设置输入流
        pstmt.executeUpdate() ;    // 更新数据库
        pstmt.close() ;
        conn.close() ;            // 数据库关闭
    }
};

查询执行结果:

图片肯定是无法查询出来的,所以应该将图片读取出来,另存一个其他文件。

package 类集;
import java.sql.Connection ;
import java.sql.DriverManager ;
import java.sql.PreparedStatement ;
import java.io.File ;
import java.io.FileOutputStream ;
import java.sql.ResultSet ;
import java.io.InputStream ;
import java.io.OutputStream ;
public class BlobDemo01{
    // 定义MySQL的数据库驱动程序
    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
    // 定义MySQL数据库的连接地址
    public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ;
    // MySQL数据库的连接用户名
    public static final String DBUSER = "root" ;
    // MySQL数据库的连接密码
    public static final String DBPASS = "aaaaaa" ;
    public static void main(String args[]) throws Exception{    // 所有异常抛出
        Connection conn = null ;        // 数据库连接
        PreparedStatement pstmt = null ;
        ResultSet rs = null ;
        int id = 1 ;
        String sql = "SELECT name,photo FROM userblob WHERE id=?" ;
        Class.forName(DBDRIVER) ;    // 加载驱动程序
        conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;
        pstmt = conn.prepareStatement(sql) ;
        pstmt.setInt(1,id) ;
        rs = pstmt.executeQuery() ;    // 执行查询
        if(rs.next()){
            String name = rs.getString(1) ;
            System.out.println("姓名:" + name) ;
            InputStream input = rs.getBinaryStream(2) ;
            File f = new File("d:" + File.separator + "load图片1.gif") ;    // 图片文件
            OutputStream out = null ;
 out = new FileOutputStream(f) ;
int temp = 0 ;
            while((temp=input.read())!=-1){    // 边读边写
                out.write(temp) ;
            }
            input.close() ;
            out.close() ;
        }
        pstmt.close() ;
        conn.close() ;            // 数据库关闭
    }
};

处理后,在D文件夹中发现文件,表示,读取成功。

以上程序是通过IO的操作流读取的

为了方便读取,JAVA专门的提供了BLOB类进行二进制文件的读取操作。

BLOB类

BLOB类提供了以下方法:

操作范例代码如下:

package 类集;
import java.sql.Connection ;
import java.sql.DriverManager ;
import java.sql.SQLException ;
import java.sql.PreparedStatement ;
import java.sql.Blob ;
import java.sql.ResultSet ;
import java.io.File ;
import java.io.FileOutputStream ;
import java.io.InputStream ;
import java.io.OutputStream ;

public class BlobDemo01{
    // 定义MySQL的数据库驱动程序
    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
    // 定义MySQL数据库的连接地址
    public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ;
    // MySQL数据库的连接用户名
    public static final String DBUSER = "root" ;
    // MySQL数据库的连接密码
    public static final String DBPASS = "aaaaaa" ;
    public static void main(String args[]) throws Exception{    // 所有异常抛出
        Connection conn = null ;        // 数据库连接
        PreparedStatement pstmt = null ;
        ResultSet rs = null ;
        int id = 1 ;
        String sql = "SELECT name,photo FROM userblob WHERE id=?" ;
        Class.forName(DBDRIVER) ;    // 加载驱动程序
        conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;
        pstmt = conn.prepareStatement(sql) ;
        pstmt.setInt(1,id) ;
        rs = pstmt.executeQuery() ;    // 执行查询
        if(rs.next()){
            String name = rs.getString(1) ;
            System.out.println("姓名:" + name) ;
            Blob b = rs.getBlob(2) ;
          File f = new File("d:" + File.separator + "load图片2.gif") ;    // 图片文件
 OutputStream out = null ;
 out = new FileOutputStream(f) ;
           out.write(b.getBytes(1,(int)b.length())) ;
           out.close() ;
        }
        pstmt.close() ;
        conn.close() ;            // 数据库关闭
    }
};

操作结果:

发现成功读取并创建了文件。

使用BLOB会比较简单一些,但是从实际角度,把大文件存在数据库中是很不明智行为。往往采用映射路径方式完成。

原文地址:https://www.cnblogs.com/alsf/p/6731216.html