PreparedStatement对象可以使用输入和输出流来提供参数数据。这使您可以将整个文件放入可以保存大值的数据库列,例如Text和BLOB数据类型。
有以下方法可用于流式传输数据 -
-
setAsciiStream():此方法用于提供大的ASCII值。
-
setCharacterStream():此方法用于提供大型UNICODE值。(常用)
-
setBinaryStream():此方法用于提供较大的二进制值。(常用)
创建的存储大数据的表格中各个字段的属性类型如下:
若图片过大,还可使用mediumblob 类型格式
案例:向数据库中插入文本或者图片
public class Demo1 {
public static void main(String[] args) throws Exception{
Connection conn = DbUtils.getConnection();
String sql = "insert into bigdata(content,image) values(?,?);";
PreparedStatement pstat = conn.prepareStatement(sql);
pstat.setCharacterStream(1,new FileReader("src\\db.properties"));
pstat.setBinaryStream(2,new FileInputStream("src\\111.jpg"));
pstat.executeUpdate();
pstat.close();
conn.close();
System.out.println("执行完毕");
}
}
案例:将数据空中的文本和图片读出,并赋值在硬盘中
public class Demo {
public static void main(String[] args) {
Connection conn = DbUtils.getConnection();
String sql = "select content,image from bigdata where id = ?";
PreparedStatement pstat = null;
try {
pstat = conn.prepareStatement(sql);
//设置站位符的值(即问号的值)
pstat.setInt(1,2);
//得到查询结果集
ResultSet rs = pstat.executeQuery();
if(rs.next()){
//获得读取文本字符流
Reader reader = rs.getCharacterStream("content");
//获得读取图片字节流
InputStream is = rs.getBinaryStream("image");
//创建写入字符流
FileWriter fw = new FileWriter("src\\empcopy.xml");
//创建写入字节流
FileOutputStream fos = new FileOutputStream("src\\004.jpg");
//将文件写入到指定文件中
char[] chars = new char[1024];
int len=-1;
while((len=reader.read(chars))!=-1){
fw.write(chars,0,len);
fw.flush();
}
byte[] bytes = new byte[1024];
int len1=-1;
while ((len=is.read(bytes))!=-1){
fos.write(bytes);
fos.flush();
}
reader.close();
is.close();
fw.close();
fos.close();
System.out.println("从数据库中读出数据并复制成功!!!");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}