处理BLOB数据
BLOB类型的操作与CLOB类似,只是BLOB专门用于存放二进制数据,如图片、电影等。为了大家更好地学习BLOB数据的处理方式,接下来,在D盘下保存一个itcast.jpg图片,通过一个具体的案例来演示图片的存储和读取,具体步骤如下:
(1)首先在数据库chapter01中,创建一个数据表testblob,创建表的SQL语句如下所示:
create table testblob(
id int primary key auto_increment,
img blob
);
(2)在工程chapter01中,新建一个类BLOBDemo01,该类用于将图片写入表testblob中,BLOBDemo01的具体实现代码如例1所示。
例1 BLOBDemo01.java
1 package cn.itcast.jdbc.example;
2 import java.io.*;
3 import java.sql.Connection;
4 import java.sql.PreparedStatement ;
5 import cn.itcast.jdbc.example.utils.JDBCUtils;
6 public class BLOBDemo01 {
7 public static void main(String[] args) {
8 Connection conn = null;
9 PreparedStatement prestmt = null;
10 try {
11 conn = JDBCUtils.getConnection();
12 String sql = "insert into testblob values(?,?)";
13 prestmt = conn.prepareStatement(sql);
14 prestmt.setInt(1, 1);
15 File file = new File("D:\\itcast.jpg");
16 InputStream in = new FileInputStream(file);
17 prestmt.setBinaryStream(2, in, (int) file.length());
18 prestmt.executeUpdate();
19 } catch (Exception e) {
20 e.printStackTrace();
21 } finally {
22 // 释放资源
23 JDBCUtils.release(null, prestmt, conn);
24 }
25 }
26 }
程序执行后,图片的信息就以二进制的形式保存到表testblob中了,如果直接使用SELECT语句查看表testblob中的数据,则只能显示一些二进制数据,图片是无法显示的。
(3)在工程chapter01中,新建一个类BLOBDemo02,该类用于从数据库中读取要获取的图片,BLOBDemo02的具体实现方式如例2所示。
例2 BLOBDemo02.java
1 package cn.itcast.jdbc.example;
2 import java.io.*;
3 import java.sql.Connection;
4 import java.sql.PreparedStatement ;
5 import java.sql.ResultSet;
6 import cn.itcast.jdbc.example.utils.JDBCUtils;
7 public class BLOBDemo02 {
8 public static void main(String[] args) {
9 Connection conn = null;
10 PreparedStatement stmt = null;
11 ResultSet rs = null;
12 try {
13 conn = JDBCUtils.getConnection();
14 String sql = "select * from testblob where id = 1";
15 stmt = conn.prepareStatement(sql);
16 rs = stmt.executeQuery();
17 if (rs.next()) {
18 InputStream in = new BufferedInputStream(
19 rs.getBinaryStream("img"));
20 OutputStream out = new BufferedOutputStream(
21 new FileOutputStream("img.jpg"));
22 int temp;
23 while ((temp = in.read()) != -1) {
24 out.write(temp);
25 }
26 out.close();
27 in.close();
28 }
29 } catch (Exception e) {
30 e.printStackTrace();
31 } finally {
32 JDBCUtils.release(rs, stmt, conn);
33 }
34 }
35 }
在例2中,使用PreparedStatement对象读取数据库中所存储的图片,由于读取出来的图片无法显示,因此,我们将读取出来的图片保存到img.jpg中。程序执行完毕后,可以直接在工程chapter01的根目录下发现img.jpg图片。