MySQL中,Blob是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。
插入Blob类型的数据必须使用PreparedStatement,因为Blob类型的数据无法使用字符串拼接写的。
MySQL的四种Blob类型(除了在存储的最大信息量上不同外,他们是等同的)。
类型 | 大小(单位:字节) |
TinyBlod | 最大255 |
Blod | 最大65K |
MediumBlob | 最大16M |
LongBlob | 最大4G |
实际使用中根据需要存入的数据大小定义不同的Blob类型。
如果在指定了相关的Blob类型以后,还报错:xxx too large,那么在mysql的安装目录下,找my.ini文件加上如下的配置参数:max_allowed_packet=16M。同时注意:修改了my.ini文件之后,需要重新启动mysql服务。
注意:如果存储的文件过大,数据库的性能会下降。
使用方法:
import util.JdbcUtil;
import java.io.*;
import java.sql.*;
/**
* @author wwkjk
* @date 2021-10-20 13:31:44
* @Description 测试Blob添加和读取
**/
public class StudentDao {
/**
* @param
* @return void
* @author wwkjk
* @date 2021-10-20 14:07:16
* @Description 存放Blob类型图片
**/
public void TestBlobAdd() throws FileNotFoundException {
String sql = "insert into student(student_id, student_name, student_age, student_photo) values (?, ?, ?, ?)";
FileInputStream fis = new FileInputStream(new File("K.jpg"));
JdbcDao.update(sql, 0, "wwk3", 18, fis);
}
/**
* @param
* @return void
* @author wwkjk
* @date 2021-10-20 14:07:40
* @Description 从数据库下载Blob类型的图片
**/
public void TestBlobDownload() {
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
InputStream is = null;
FileOutputStream fos = null;
try {
con = JdbcUtil.getConnection();
String sql = "select student_photo from student where student_id = ?";
ps = con.prepareStatement(sql);
ps.setInt(1, 2);
rs = ps.executeQuery();
if (rs.next()) {
//将Blob类型的字段以文件的形式下载到本地
Blob photo = rs.getBlob("student_photo");
is = photo.getBinaryStream();
fos = new FileOutputStream("test.jpg");
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
JdbcUtil.closeResource(con, ps, rs);
}
}
}