0%

【JDBC】操作BLOB类型字段

使用java在数据库中存储BLOB类型字段

一、介绍

  • (1)BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,可以容纳不容大小的数据
  • (2)BLOB数据必须使用PreparedStatement来操作
  • (3)BLOB的不同类型
类型 大小(单位:字节)
TinyBlob 最大255
Blob 最大65K
MediumBlob 最大16M
LongBlob 最大4G
  • (4)注意:存储数据过大,数据库性能会下降
  • (5)如果修改了数据类型,仍然出现数据过大,需要寻找my.ini配置文件,添加参数max_alllowed_paket=16M,并重启mysql服务器

二、操作方法

1.存入BLOB数据

  • (1)创建一个文件输入流

  • (2)利用PreparedStatement对象的void setBlob(int parameterIndex, InputStream inputStream)填充占位符

  • (3)执行sql语句

  • JDBCUtils是自定义类,具体封装的方法,请看“【JDBC】使用PreparedStatement实现CRUD操作”

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    @Test
    public void addTest() throws Exception {
    //1.连接数据库
    Connection conn = JDBCUtils.getConnection();

    //2.创建PreparedStatement对象
    String sql = "insert into customers(name, email, birth, photo) values(?, ?, ?, ?)";
    PreparedStatement ps = conn.prepareStatement(sql);

    //3.填充占位符'?'
    ps.setObject(1, "艾米莉亚");
    ps.setObject(2,"emi@qq.com");
    ps.setObject(3,"1999-09-09");

    //4.BLOB数据填充占位符
    FileInputStream fis = new FileInputStream(".\\src\\艾米莉亚.jpg");
    ps.setBlob(4, fis);

    //5.执行sql语句
    ps.execute();

    //6.资源关闭,连接关闭
    fis.close();
    JDBCUtils.close(conn, ps);

    //7.try-catch处理异常(省略)
    }

2.取出BLOB数据

  • 利用Blob getBlob(String columnLabel)读取BOLB数据
  • BLOB对象使用java.io.InputStream getBinaryStream ()来获取输入流
  • 利用IO流操作,保存到本地
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
@Test
public void queryTest() throws Exception {
//1.连接数据库
Connection conn = JDBCUtils.getConnection();

//2.创建PreparedStatement对象
String sql = "select * from customers where id = ?";
PreparedStatement ps = conn.prepareStatement(sql);

//3.填充占位符
ps.setObject(1, 23);

//4.执行查询语句
ResultSet rs = ps.executeQuery();

//5.读取查询结果,保存到类中,BLOB数据保存到本地
InputStream is = null;
FileOutputStream fos = null;
if (rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
Date birth = rs.getDate("birth");
Customer emi = new Customer(id, name, email, birth);
System.out.println(emi);

//(1)获取blob数据
Blob photo = rs.getBlob("photo");
//(2)获取该数据的输入流
is = photo.getBinaryStream();
//(3)创建输出流
fos = new FileOutputStream(".\\src\\emi.jpg");
//(4)读取二进制数据,保存到本地
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1){
fos.write(buffer, 0, len);
}
}

//6.资源关闭
fos.close();
is.close();
JDBCUtils.close(conn, ps, rs);

//7try-catch处理异常(省略)
}