Java SQL Blob

时间:2020-02-23 14:36:52  来源:igfitidea点击:

接口Blob是java.sql软件包的一部分。
Blob是SQL blob数据类型的Java表示形式。
Blob用于保存和检索数据库中的二进制数据。
ResultSet,PreparedStatement和CallableStatement支持Blob。

Java SQL Blob的方法

  • long length():此方法返回Blob对象的大小。

  • byte [] getBytes(long pos,int length):此方法从指定位置开始,使用指定的长度返回blob对象的字节数组。

  • InputStream getBinaryStream():此方法返回当前Blob对象的InputStream。

  • InputStream getBinaryStream(long pos,long length):此方法返回指定长度并从给定位置开始的当前Blob Object的InputStream。

  • void free():此方法释放blob对象并释放Blob对象使用的资源。

  • OutputStream setBinaryStream(long pos):此方法返回OutputStream,可用于设置Blob数据。

  • int setBytes(long pos,byte [] bytes):此方法从指定位置开始将指定的字节数组写入当前Blob对象,并返回写入的字节数。

  • void truncate(long len):此方法使用指定的长度截断Blob对象的值。

Java SQL Blob示例

我们将看到Blob的两个不同示例。
我们将使用MySQL数据库来演示Blob的用法。
在Java项目的pom.xml中使用以下maven依赖项。

<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.49</version>
</dependency>

在第一个示例中,我们将文件的内容保存在DB中,在第二个示例中,我们将使用序列化将自定义Java类的对象保存到DB中。

1.在数据库中保存并获取文件

使用以下数据库脚本创建数据库和表。

create database blobdb;
use blobdb;
create table tblfile(
	fileid int,
 	filevalue blob
);

让我们看下面的示例程序,将数据保存到Blob列中。

package com.theitroad.example;

/**
 * Java example program to read and write blob object using file
 * 
 * @author hyman
 * 
 */

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

public class BlobFileDemo {
	
	public static void main(String[] args) throws Exception {
		Connection connection = null;
		try {
			File file = new File("/home/demo/blob.txt");
			//Initialize the file object using text file location as above
			Class.forName("com.mysql.jdbc.Driver");
			connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/blobdb?useSSL=false", "root",
					"root");
			writeObject(file, connection);
			readObject(connection);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			connection.close();
		}
	}

	public static void writeObject(File file, Connection connection) throws Exception {
		PreparedStatement pStmt = null;
		ByteArrayOutputStream bAout = new ByteArrayOutputStream();
		try {
			pStmt = connection.prepareStatement("insert into tblfile(fileid, filevalue) values(?, ?)");
			pStmt.setInt(1, 1);
			pStmt.setBlob(2, new FileInputStream(file));
			//Set FileInputStream object as blob
			pStmt.execute();
		} finally {
			bAout.close();
			pStmt.close();
		}
	}

	public static void readObject(Connection connection) throws Exception {
		Statement statement = null;
		ResultSet resultSet = null;
		try {
			statement = connection.createStatement();
			resultSet = statement.executeQuery("select fileid,filevalue from tblfile where fileid=1");
			if (resultSet.next()) {
				int fildId = resultSet.getInt("fileid");
				Blob blob = resultSet.getBlob("filevalue");
				//getBlob method of ResultSet is used to get Blob from database.
				//Now we can use Blob to save data to file or transfer data to other place.
				System.out.println("FileId:" + fildId);
				System.out.println("Blob:" + blob);
				int length = (int) blob.length();
				//length() method will return size of Blob Object.
				System.out.println("length:" + length);
				System.out.println(new String(blob.getBytes(1L, length)));
				//I have used text file so that It can be displayed on console.
			}
		} finally {
			statement.close();
		}
	}
}

输出:

FileId:1
Blob:com.mysql.jdbc.Blob@41906a77
length:40
This is an example file for blob object

数据库值:

值将取决于您使用的文件的内容。

MariaDB [blobdb]> select * from tblfile where fileid=1;
+--------+------------------------------------------+
| fileid | filevalue                                |
+--------+------------------------------------------+
|      1 | This is an example file for blob object
 |
+--------+------------------------------------------+

2.在数据库中保存并获取自定义Java对象

使用下面的数据库脚本创建表。

create table tblstudent( 	
 	studentObj blob
);

让我们看下面的示例程序。

package com.theitroad.example;

/**
 * Java example program to read and write blob object
 * 
 * @author hyman
 * 
 */

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class BlobDemo {

	public static void main(String[] args) throws Exception {
		Connection connection = null;
		try {
			Student student = new Student("hyman", "[email protected]");
			Class.forName("com.mysql.jdbc.Driver");
			connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/blobdb?useSSL=false", "root",
					"root");
			writeObject(student, connection);
			Student dbStudent = readObject(connection);
			System.out.println(dbStudent);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			connection.close();
		}
	}

	public static void writeObject(Student student, Connection connection) throws Exception {
		PreparedStatement pStmt = null;
		ByteArrayOutputStream bAout = new ByteArrayOutputStream();
		ObjectOutputStream objOut = new ObjectOutputStream(bAout);
		try {
			objOut.writeObject(student);
			objOut.flush();
			pStmt = connection.prepareStatement("insert into tblstudent(studentObj) values(?)");
			pStmt.setBlob(1, new ByteArrayInputStream(bAout.toByteArray()));
			pStmt.execute();
		} finally {
			objOut.close();
			bAout.close();
			pStmt.close();
		}
	}

	public static Student readObject(Connection connection) throws Exception {
		Student student = null;
		ObjectInputStream objIn = null;
		ByteArrayInputStream bIn = null;
		Statement statement = null;
		ResultSet resultSet = null;
		try {
			statement = connection.createStatement();
			resultSet = statement.executeQuery("select studentObj from tblstudent");
			if (resultSet.next()) {
				Blob studBlob = resultSet.getBlob("studentObj");
				bIn = new ByteArrayInputStream(studBlob.getBytes(1, (int) studBlob.length()));
				objIn = new ObjectInputStream(bIn);
				student = (Student) objIn.readObject();
			}
		} finally {
			objIn.close();
			bIn.close();
			statement.close();
		}
		return student;
	}
}

class Student implements Serializable {
	private static final long serialVersionUID = 1L;
	private String name;
	private String email;

	public Student(String name, String email) {
		super();
		this.name = name;
		this.email = email;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", email=" + email + "]";
	}

}

注意:Class Student实现了Serializable接口。
ObjectOutputStream和ObjectInputStream用于将Student对象转换为二进制形式,反之亦然。

3.在数据库中保存并获取图像文件对象

package com.theitroad.example;

/**
 * Java example program to read and write blob object using image file
 * 
 * @author hyman
 * 
 */

import java.io.*;
import java.sql.*;
import java.util.Base64;

public class BlobImageDemo {
	
	public static void main(String[] args) throws Exception {
		Connection connection = null;
		try {
			File file = new File("/home/demo/img.jpg");
			//Initialize the file object using image file location as above
			Class.forName("com.mysql.jdbc.Driver");
			connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/blobdb?useSSL=false", "root",
					"root");
			writeObject(file, connection);
			readObject(connection);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			connection.close();
		}
	}

	public static void writeObject(File file, Connection connection) throws Exception {
		PreparedStatement pStmt = null;
		ByteArrayOutputStream bAout = new ByteArrayOutputStream();
		try {
			pStmt = connection.prepareStatement("insert into tblfile(fileid, filevalue) values(?, ?)");
			pStmt.setInt(1, 1);
			pStmt.setBlob(2, new FileInputStream(file));
			//Set FileInputStream object as blob
			pStmt.execute();
		} finally {
			bAout.close();
			pStmt.close();
		}
	}

	public static void readObject(Connection connection) throws Exception {
		Statement statement = null;
		ResultSet resultSet = null;
		try {
			statement = connection.createStatement();
			resultSet = statement.executeQuery("select fileid,filevalue from tblfile where fileid=1");
			if (resultSet.next()) {
				int fildId = resultSet.getInt("fileid");
				Blob blob = resultSet.getBlob("filevalue");
				//getBlob method of ResultSet is used to get Blob from database.
				//Now we can use Blob to save data to file or transfer data to other place.
				System.out.println("FileId:" + fildId);
				System.out.println("Blob:" + blob);
				int length = (int) blob.length();
				//length() method will return size of Blob Object.
				System.out.println("length:" + length);
				String base64Image = Base64.getEncoder().encodeToString(blob.getBytes(1L, length));
				//Encode image byte array into base64
				//System.out.println("Base64 Image data: "+base64Image);
				//Remove above comments to print image data
			}
		} finally {
			statement.close();
		}
	}
}

输出:

FileId:1
Blob:com.mysql.jdbc.Blob@4b85612c
length:11397