一、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、关闭数据库连接