JDBC 向数据表中插入Blob类型数据
2019-12-15 本文已影响0人
一亩三分甜
向数据表customers中插入Blob类型的字段
public class BlobTest {
//向数据表customers中插入Blob类型的字段
@Test
public void testInsert() throws Exception{
Connection conn = JDBCUtils.getConnection();
String sql = "insert into customers(name,email,birth,photo)values(?,?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setObject(1,"鄢栋云");
ps.setObject(2,"cloud@163.com");
ps.setObject(3,"1990-08-10");
FileInputStream is = new FileInputStream(new File("1.png"));
ps.setBlob(4,is);
ps.execute();
JDBCUtils.closeResource(conn,ps);
}
}

查询数据表customers中Blob类型的字段
//查询数据表customers中Blob类型的字段
@Test
public void testQuery() {
Connection conn = null;
PreparedStatement ps = null;
InputStream is = null;
FileOutputStream fos = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
String sql = "select id,name,email,birth,photo from customers where id = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1,16);
rs = ps.executeQuery();
if (rs.next()){
//方式一:
//int id = rs.getInt(1);
//String name = rs.getString(2);
//String email = rs.getString(3);
//Date birth = rs.getDate(4);
//方式二:
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
Date birth = rs.getDate("birth");
Customer cust = new Customer(id,name,email,birth);
System.out.println(cust);
//将Blob类型的字段下载下来,以文件的方式保存在本地
Blob photo = rs.getBlob("photo");
is = photo.getBinaryStream();
fos = new FileOutputStream("cloud.png");
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();
}
JDBCUtils.closeResource(conn,ps,rs);
}
}
//输出
Customer{id=16, name='鄢栋云', email='cloud@163.com', birth=1990-08-10}

向MySql数据库中插入1M以上的图片时,会报错。
//向数据表customers中插入Blob类型1M以上的图片
@Test
public void testInsertUp1M() throws Exception{
Connection conn = JDBCUtils.getConnection();
String sql = "insert into customers(name,email,birth,photo)values(?,?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setObject(1,"鄢义");
ps.setObject(2,"yanyi@163.com");
ps.setObject(3,"1990-08-10");
FileInputStream is = new FileInputStream(new File("mountain.jpg"));
ps.setBlob(4,is);
ps.execute();
JDBCUtils.closeResource(conn,ps);
}
//报错
com.mysql.jdbc.PacketTooBigException: Packet for query is too large (4050729 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.
此时需要在mysql的安装目录下,找my.ini文件加上如下的配置参数:"max_allowed_packet=16M"。同时注意:修改了my.ini文件之后,需要重新启动mysql服务。或通过命令行设置,命令行设置后需要关闭终端重新进入,重启mysql服务。

查看目前配置
show VARIABLES like '%max_allowed_packet%';
修改配置
set global max_allowed_packet = 1024*1024*16;


重新运行程序,1M以上的图片插入到数据库中了。
