JDBC(五)——处理大数据对象CLOB和BLOB

大数据对象主要有CLOB(character large object)和BLOB(binary large object)两种类型的字段。在CLOB中可以存储大字符数据对象,比如长篇小说;在BLOB中可存储二进制大数据对象,比如图片、电影、音乐。

处理CLOB

如何将一个txt文本插入到数据库中,数据库新建属性content,类型longtext,java中txt文本对应于File类型。

获取指定内容的文件流

File context = book.getContext();

获取文件流的输入流

InputStream inputStream = new FileInputStream(context);

为输入流设置指定参数

pstat.setAsciiStream(1, InputStream, context.length());

要输出某一个大文本的内容

1
2
3
ResultSet rs = pstat.executeQuery();
Clob c = rs.getClob(“context”); // Retrieves the value of the designated column in the current row of this ResultSet object as a Clob object
String context = c.getSubString(1, (int)c.length()); // Retrieves a copy of the specified substring in the CLOB value designated by this Clob object
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
package com.java.jdbc.chap06.sec01;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List;

import com.java.jdbc.model.Book;
import com.java.jdbc.util.DbUtil;

public class Demo1 {
private static DbUtil dbUtil = new DbUtil();
private static int addBook(Book book) throws Exception{
Connection con = dbUtil.getCon();
String sql = "INSERT INTO t_book VALUES (?, ?, ?, ?, ?, ?);";
PreparedStatement pstat = con.prepareStatement(sql);
pstat.setInt(1, book.getId());
pstat.setString(2, book.getBookName());
pstat.setString(3, book.getAuthor());
pstat.setFloat(4, book.getPrice());
pstat.setString(5, book.getBookTypeId());
File context = book.getContext(); //获取文件
InputStream inputStream = new FileInputStream(context); //获取文件输入流
pstat.setAsciiStream(6, inputStream, context.length());
int rst = pstat.executeUpdate();
dbUtil.close(pstat, con);
return rst;
}
public static void main(String[] args) throws Exception {
File context = new File("F:\\eclipsework\\JDBCPro\\src\\com\\java\\jdbc\\chap06\\Longtext insert.txt"); //或者F:/eclipsework/JDBCPro/src/com/java/jdbc/chap06/Longtext insert.txt
Book book = new Book(8, "物理", "longtext", 90, "4", context);
int rst = addBook(book);
if (rst == 1){
System.out.println("添加成功!");
} else {
System.out.println("添加失败!");
}
}
}

while循环语句,可以执行多次,只要条件为真,就执行循环语句,直到条件为假;
if是条件语句,单词执行,满足条件表达式则执行语句。
输出id=?行的数据:

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.java.jdbc.model.Book;
import com.java.jdbc.util.DbUtil;

public class Demo1 {
private static DbUtil dbUtil = new DbUtil();
/**
* 添加数据,包含CLOB(大文本)文件
* @param book
* @return
* @throws Exception
*/
private static int addBook(Book book) throws Exception{
Connection con = dbUtil.getCon();
String sql = "INSERT INTO t_book VALUES (?, ?, ?, ?, ?, ?)";
PreparedStatement pstat = con.prepareStatement(sql);
pstat.setInt(1, book.getId());
pstat.setString(2, book.getBookName());
pstat.setString(3, book.getAuthor());
pstat.setFloat(4, book.getPrice());
pstat.setString(5, book.getBookTypeId());
File context = book.getContext(); //获取文件
InputStream inputStream = new FileInputStream(context); //获取文件输入流
pstat.setAsciiStream(6, inputStream, context.length());
int rst = pstat.executeUpdate();
dbUtil.close(pstat, con);
return rst;
}
/**
* 读取id=?行的数据
* @param id
* @throws Exception
*/
public static void getBook(int id) throws Exception {
Connection con = dbUtil.getCon();
String sql = "SELECT * FROM t_book WHERE id = ?";
PreparedStatement pstat = con.prepareStatement(sql);
pstat.setInt(1, id);
ResultSet rs = pstat.executeQuery();
if (rs.next()) { //由于是输出id=?的单行,所以只输出一次
String bookName = rs.getString("bookName");
String author = rs.getString("author");
float price = rs.getFloat("price");
String bookTypeId = rs.getString("bookTypeId");
//输出大文本
Clob c = rs.getClob("context");
String context = c.getSubString(1, (int) c.length());
System.out.println("图书编号:" + id + ",名称:" + bookName
+ ",作者:" + author + ",价格:" + price + ",类型:"
+ bookTypeId + ",内容" + context);
}
dbUtil.close(pstat, con);
}
public static void main(String[] args) throws Exception {
/* File context = new File("F:\\eclipsework\\JDBCPro\\src\\com\\java\\jdbc\\chap06\\Longtext insert.txt");
Book book = new Book(8, "物理", "longtext", 90, "4", context);
int rst = addBook(book);
if (rst == 1){
System.out.println("添加成功!");
} else {
System.out.println("添加失败!");
}*/
getBook(8);
}
}

处理BLOB

获取指定内容的文件流

File pic = book.getPic();

获取图片文件流的输入流

InputStream inputStream2 = new FileInputStream(pic);

为输入流设置指定参数

pstat.setBinaryStream(1, InputStream2, pic.length()); //二进制的

要输出某一个打文本的内容

1
2
3
4
5
6
ResultSet rs = pstat.executeQuery();
Blob b = rs.getBlob(“pic”);
//图片没法显示到eclipse,一般把它存到另一个地方去,如F盘
FileOutputStream fos = new FileOutputStream(new File(“f:/pic2.jpg”)); //定义一个输出流
out.write(b.getBytes(1, (int)b.length())); //直接写
out.close();