1 MySQL BLOB类型
-
MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。
-
插入BLOB类型的数据必须使用PreparedStatement,因为BLOB类型的数据无法使用字符串拼接写的。
-
MySQL的四种BLOB类型(除了在存储的最大信息量上不同外,他们是等同的)
- 实际使用中根据需要存入的数据大小定义不同的BLOB类型。
- 需要注意的是:如果存储的文件过大,数据库的性能会下降。
- 如果在指定了相关的Blob类型以后,还报错:
xxx too large
,那么在mysql的安装目录下,找my.ini
文件加上如下的配置参数:max_allowed_packet=16M
。同时注意:修改了my.ini
文件之后,需要重新启动mysql服务。
/*
* 向数据库中插入BLOB类型的数据
*/
public static void test01() {
Connection conn = null;
InputStream inputStream = null;
try {
conn = JDBCTools.getConn();
String sql = "insert into customers values (?,?,?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, 19);
ps.setString(2, "测试");
ps.setString(3, "abc@163.com");
SimpleDateFormat sp = new SimpleDateFormat("yyyyMMdd");
long time = sp.parse("19961122").getTime();
ps.setDate(4, new Date(time));
// 获取输入流
String pathname = "D:\\Workspace\\JavaBaseStu\\Notes\\99 Pic\\Collection函数库.jpg";
File file = new File(pathname);
inputStream = new FileInputStream(file);
// 传入数据库中
ps.setBlob(5, inputStream);
ps.execute();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.close(conn, inputStream);
}
}
/*
* 从数据库中读取BLOB类型的数据到文件
*/
public static void test02() {
Connection conn = null;
InputStream binaryStream = null;
FileOutputStream fileoutput = null;
try {
conn = JDBCTools.getConn();
String sql = "select photo from customers where id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, 19);
ResultSet result = ps.executeQuery();
Blob blob = null;
if(result.next()) {
// 获取BLOB类型的数据
blob = result.getBlob(1);
}
File file = new File("D:\\1.jpg");
// 将BLOB类型的数据转换成输入流
binaryStream = blob.getBinaryStream();
// 从输入流程读取数据并写入文件中
fileoutput = new FileOutputStream(file);
int len = 0;
byte[] ch = new byte[100];
while ((len = binaryStream.read(ch)) != -1) {
fileoutput.write(ch, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.close(conn,binaryStream,fileoutput);
}
}