处理Blob数据

一、Blob

Blob专门用于存放二进制数据,例如图片、视频等。

二、预先在数据库中创建表

DROP TABLE userblob;
CREATE TABLE userblob(
    id        INT            AUTO_INCREMENT     PRIMARY KEY,
    name      VARCHAR(30)    NOT NULL,
    photo     LONGBLOB
);

mysql中使用LONGBLOB保存BLOB数据内容。

三、代码示例

(1)将图片写入到数据表

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class BlobDemo01{
	//mysql数据库驱动程序
	public static final String DBDRIVER="com.mysql.cj.jdbc.Driver";
	//mysql数据库的连接地址
	public static final String DBURL="jdbc:mysql://localhost:3306/mldn?useSSL=false&serverTimezone=UTC";
	//mysql数据库的连接用户名
	public static final String DBUSER="root";
	//mysql数据库的连接密码
	public static final String DBPASS="root";

	public static void main(String[] args) throws Exception{
		//1、加载数据库驱动
		Class.forName(DBDRIVER);
		//2、获取数据库连接
		Connection conn=DriverManager.getConnection(DBURL,DBUSER,DBPASS);
		//3、实例化PreparedStatement对象并执行
		String sql="INSERT INTO userblob(name,photo) VALUES(?,?)";
		PreparedStatement pstmt=conn.prepareStatement(sql);
		pstmt.setString(1,"demo");
		File f=new File("E:"+File.separator+"demo.PNG");
		InputStream input=new FileInputStream(f);
		pstmt.setBinaryStream(2,input,(int)f.length());
		pstmt.executeUpdate();
		//4、关闭数据库连接
		pstmt.close();
		conn.close();
	}
}

步骤:

1.加载数据库驱动

Class.forName(DBDRIVER);

2.获取数据库连接

Connection conn=DriverManager.getConnection(DBURL,DBUSER,DBPASS);

3.实例化PreparedStatement对象并执行插入

PreparedStatement pstmt=conn.prepareStatement(sql);
pstmt.setBinaryStream(int index,InputStream input,int fileLength);

4.关闭数据库连接

pstmt.close();
conn.close();

其中的关键方法为:

pstmt.setBinaryStream(int index,InputStream input,int fileLength);

第一个参数为插入文件在数据表中的位置。

第二个参数为插入文件的InputStream。

第三个参数为插入文件长度。

(2)读取图片内容,并保存在E盘

由于存入的图片以二进制保存,通过ResultSet读取后无法直接显示,需要保存在E盘上。

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class BlobDemo02{
	//mysql数据库驱动程序
	public static final String DBDRIVER="com.mysql.cj.jdbc.Driver";
	//mysql数据库连接地址
	public static final String DBURL="jdbc:mysql://localhost:3306/mldn?useSSL=false&serverTimezone=UTC";
	//mysql数据库连接用户名
	public static final String DBUSER="root";
	//mysql数据库连接密码
	public static final String DBPASS="root";

	public static void main(String[] args) throws Exception{
		//1、加载数据库驱动
		Class.forName(DBDRIVER);
		//2、获取数据库连接
		Connection conn=DriverManager.getConnection(DBURL,DBUSER,DBPASS);
		//3、实例化PreparedStatement对象,并执行操作
		String sql="SELECT name,photo FROM userblob WHERE id=?";
		PreparedStatement pstmt=conn.prepareStatement(sql);
		pstmt.setInt(1,1);
		ResultSet rs=pstmt.executeQuery();
		if(rs.next()){
			String name=rs.getString(1);
			System.out.println("姓名:"+name);
			InputStream input=rs.getBinaryStream(2);
			FileOutputStream out=new FileOutputStream(new File("e:"+File.separator+"demo02.png"));
			int temp=0;
			while((temp=input.read())!=-1){
				out.write(temp);
			}
			input.close();
			out.close();
		}
		//4、关闭数据库连接
		pstmt.close();
		conn.close();
	}
}

步骤:

1、加载数据库驱动

2、获取数据库连接

3、实例化PreparedStatement对象,并操作

String sql="SELECT name,photo FROM userblob WHERE id=?";
PreparedStatement pstmt=conn.prepareStatement(sql);
pstmt.setInt(1,1);
ResultSet rs=pstmt.executeQuery();
if(rs.next()){
	String name=rs.getString(1);
	System.out.println("姓名:"+name);
	InputStream input=rs.getBinaryStream(2);
	FileOutputStream out=new FileOutputStream(new File("e:"+File.separator+"demo02.png"));
	int temp=0;
	while((temp=input.read())!=-1){
		out.write(temp);
	}
	input.close();
	out.close();
	}

关键步骤为:通过rs.getBinaryStream()获取输入流,然后进行边读边写。

4、关闭数据库连接

(3)使用Blob读取内容

import java.io.File;
import java.io.FileOutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class BlobDemo03{
	//mysql数据库驱动
	public static final String DBDRIVER="com.mysql.cj.jdbc.Driver";
	//mysql数据库连接地址
	public static final String DBURL="jdbc:mysql://localhost:3306/mldn?useSSL=false&serverTimezone=UTC";
	//mysql数据库连接用户名
	public static final String DBUSER="root";
	//mysql数据库连接密码
	public static final String DBPASS="root";

	public static void main(String[] args) throws Exception{
		//1、加载数据库驱动
		Class.forName(DBDRIVER);
		//2、获取数据库连接
		Connection conn=DriverManager.getConnection(DBURL,DBUSER,DBPASS);
		//3、实例化PreparedStatement对象,并执行操作
		String sql="SELECT name,photo FROM userblob WHERE id=?";
		PreparedStatement pstmt=conn.prepareStatement(sql);
		pstmt.setInt(1,1);
		ResultSet rs=pstmt.executeQuery();
		if(rs.next()){
			String name=rs.getString(1);
			System.out.println("姓名:"+name);
			Blob b=rs.getBlob(2);
			FileOutputStream out=new FileOutputStream(new File("e:"+File.separator+"demo03.png"));
			out.write(b.getBytes(1,(int)b.length()));
			out.close();
		}
                //4、关闭数据库连接
		pstmt.close();
		conn.close();
	}
}

步骤:

1、加载数据库驱动

2、获取数据库连接

3、实例化PreparedStatement对象,并执行操作

String sql="SELECT name,photo FROM userblob WHERE id=?";
PreparedStatement pstmt=conn.prepareStatement(sql);
pstmt.setInt(1,1);
ResultSet rs=pstmt.executeQuery();
if(rs.next()){
	String name=rs.getString(1);
	System.out.println("姓名:"+name);
	Blob b=rs.getBlob(2);
	FileOutputStream out=new FileOutputStream(new File("e:"+File.separator+"demo03.png"));
	out.write(b.getBytes(1,(int)b.length()));
	out.close();
}

关键步骤为:

Blob b=rs.getBlob(2);
FileOutputStream out=new FileOutputStream(new File("e:"+File.separator+"demo03.png"));
out.write(b.getBytes(1,(int)b.length()));

通过rs.getBlob()获得Blob对象,然后通过b.getBytes(long pos,int length)获取数据的数组对象,最后通过文件输出流进行输出。

4、关闭数据库连接

猜你喜欢

转载自blog.csdn.net/weixin_41027750/article/details/82768031