目录
2.使用PreparedStatement向数据表中插入Blob类型字段
1.Blob介绍
Blob是一种二进制数据文件,分为TinyBlob,Blob,MediumBlob,LongBlob四种类型。每种类型之间的差距是存储的内容大小不同。需要注意的是,向数据库中插入大量的Blob数据会导致性能下降。
2.使用PreparedStatement向数据表中插入Blob类型字段
步骤
①获取连接。
②编写SQL语句。
③预编译SQL语句。
④填充占位符。(在填写Blob类型数据时,使用setBlob(int index,InputStream in)来填写)
⑤执行SQL语句。
示例:创建数据表,具有两个字段分别是name和photo,向其中插入name=“小张”和添加照片。
package lib;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;
public class Test1 {
public static void main(String[] args) {
InputStream is=null;
Connection connection=null;
InputStream iStream=null;
try {
//加载配置文件
is=Test1.class.getClassLoader().getResourceAsStream("test.properties");
Properties properties=new Properties();
properties.load(is);
String user=properties.getProperty("user");
String password=properties.getProperty("password");
String url=properties.getProperty("url");
String driver=properties.getProperty("driver");
//加载驱动
Class.forName(driver);
//获取连接
connection=DriverManager.getConnection(url, user, password);
//删除旧表
String sql="drop table test";
PreparedStatement ps=connection.prepareStatement(sql);
ps.execute();
//创建新表
sql="create table test (`name` varchar(10),photo Blob default null)";
ps=connection.prepareStatement(sql);
ps.execute();
//插入数据
sql="update test set photo=? where `name`=?";
ps=connection.prepareStatement(sql);
//使用setBlob()插入图片数据
iStream=new FileInputStream("头像.jpeg");
ps.setBlob(1, iStream);
ps.setObject(2, "小张");
ps.execute();
} catch (Exception e) {
e.printStackTrace();
}finally {
//关闭资源
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
iStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3.从数据表中读取Blob类型数据
步骤
①获取连接。
②编写SQL语句。
③预编译SQL语句,获取ResultSet对象。
④获取数据。(对于Blob类型数据,使用getBlob()方法获取一个Blob对象)。
⑤调用Blob对象的getBinaryStream()方法获取一个输入流。
⑥使用输出流将数据进行保存。
示例:将上面添加的小张数据的头像保存到桌面。
package lib;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import com.mysql.cj.jdbc.Blob;
public class Test1 {
public static void main(String[] args) {
InputStream is=null;
Connection connection=null;
FileOutputStream os=null;
ResultSet rs=null;
try {
//加载配置文件
is=Test1.class.getClassLoader().getResourceAsStream("test.properties");
Properties properties=new Properties();
properties.load(is);
String user=properties.getProperty("user");
String password=properties.getProperty("password");
String url=properties.getProperty("url");
String driver=properties.getProperty("driver");
//加载驱动
Class.forName(driver);
//获取连接
connection=DriverManager.getConnection(url, user, password);
//获取数据
String sql="select photo from test where `name`=?";
PreparedStatement ps=connection.prepareStatement(sql);
ps.setObject(1, "小张");
rs=ps.executeQuery();
if(rs.next()) {
Blob blob=(Blob) rs.getBlob(1);
//获取Blob对象的输入流
is=blob.getBinaryStream();
//创建指向桌面文件的流
os=new FileOutputStream("C:\\Users\\13329\\Desktop\\头像.jpeg");
//输出到桌面
byte []data=new byte[1024];
int len;
int i=0;
while((len=is.read(data))!=-1) {
i++;
os.write(data, 0, len);
}
}
} catch (Exception e) {
e.printStackTrace();
}finally {
//关闭资源
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
4.特殊情况说明
插入指定的Blob类型数据后,可能会出现xxx too large的错误,此时需要在MySQL的安装目录下找到my.ini文件,加上如下配置参数:max_allowed_packet=16M。并且在修改后重启MySQL服务。(如果修改了还不能添加成功,请查看你插入的数据大小是否超过了你指定的数据类型的最大存储范围。)