標籤:
LOB,Large Objects,是一種用於儲存大對象的資料類型,一般LOB又分為BLOB與CLOB。BLOB通常用於儲存位元據,比片、音頻、視頻等。CLOB通常用於儲存大文本,比如小說。
MySQL資料庫中沒有專門的CLOB資料類型,而如果要儲存大文本,MySQL採用的是TEXT類型。TEXT類型又有TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT之分。MySQL中的BLOB類型又可分為TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。
使用JDBC處理大文本
向MySQL中儲存大文本,可調用JDBC API中PreparedStatement的如下方法:
// 將指定參數設定為給定 Reader 對象
void setCharacterStream(int parameterIndex, Reader reader) throws SQLException
// 將給定參數設定為給定 Reader 對象,該對象具有給定字元數長度(int型)
void setCharacterStream(int parameterIndex, Reader reader, int length) throws SQLException
// 將指定參數設定為給定 Reader 對象,該對象具有給定字元數長度(long型)
void setCharacterStream(int parameterIndex, Reader reader, long length) throws SQLException
如果需要從MySQL資料庫中擷取大文本欄欄位值,則可以使用ResultSet的如下方法:
// 以 java.io.Reader 對象的形式擷取此 ResultSet 對象的當前行中指定列的值
Reader getCharacterStream(int columnIndex) throws SQLException Reader getCharacterStream(String columnLabel) throws SQLException
// 以 String 的形式擷取此 ResultSet 對象的當前行中指定列的值
String getString(int columnIndex) throws SQLException String getString(String columnLabel) throws SQLException
樣本:
代碼:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/** * 使用JDBC操作大文本
* * @author
* */
public class ClobTest {
/** * 使用JDBC向資料庫表中插入大文本資料
* * @throws SQLException
*/
public static void add() throws SQLException {
Connection conn = null;
PreparedStatement pstmt = null;
// 擷取資料庫會話對象
JdbcSession session = JdbcSessionFactory.getCurrentSession();
// 擷取資料庫連接
conn = session.getConnection();
// 建立SQL語句:向小說表中添加一條章節內容的記錄
String sql = "INSERT INTO novel(content) VALUES(?)";
// 建立PreparedStatement對象
pstmt = conn.prepareStatement(sql);
// 建立Reader對象
File file = new File(Thread.currentThread().getClass().getResource("/novel/1.txt").getPath());
Reader reader = null;
try {
reader = new FileReader(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 設定參數
pstmt.setCharacterStream(1, reader, (int) file.length());
// 執行SQL語句
int count = pstmt.executeUpdate();
// 處理結果
if (count > 0)
System.out.println("添加成功");
else
System.out.println("添加失敗");
// 釋放資源
JdbcResourceManager.close(pstmt);
JdbcResourceManager.close(conn);
JdbcSessionFactory.closeSession();
}
public static void read() throws SQLException {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
// 擷取資料庫會話對象
JdbcSession session = JdbcSessionFactory.getCurrentSession();
// 擷取資料庫連接
conn = session.getConnection();
// 建立SQL語句
String sql = "SELECT id, content FROM novel";
// 建立PreparedStatement對象
pstmt = conn.prepareStatement(sql);
// 執行SQL語句
rs = pstmt.executeQuery();
// 處理結果
while (rs.next()) {
// 讀取小說內容
Reader reader = rs.getCharacterStream("content");
int ch;
try {
while((ch = reader.read()) != -1){
System.out.print((char)ch);
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 釋放資源
JdbcResourceManager.close(rs);
JdbcResourceManager.close(pstmt);
JdbcResourceManager.close(conn);
JdbcSessionFactory.closeSession();
}
public static void main(String[] args) {
try {
add();
read();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
使用JDBC處理位元據
向MySQL中儲存位元據,可調用JDBC API中PreparedStatement的如下方法:
// 將指定參數設定為給定輸入資料流。
void setBinaryStream(int parameterIndex, InputStream x)
// 將指定參數設定為給定輸入資料流,該輸入資料流將具有給定位元組數(int型)。
void setBinaryStream(int parameterIndex, InputStream x, int length)
// 將指定參數設定為給定輸入資料流,該輸入資料流將具有指定位元組數(long型)。
void setBinaryStream(int parameterIndex, InputStream x, long length)
如果需要從MySQL資料庫中擷取二進位欄欄位值,則可以使用ResultSet的如下方法:
// 以未解釋位元組的流的形式擷取此 ResultSet 對象的當前行中指定列的值。
InputStream getBinaryStream(int columnIndex)
// 以未解釋的 byte 流的形式擷取此 ResultSet 對象的當前行中指定列的值。
InputStream getBinaryStream(String columnLabel)
// 以 Java 程式設計語言中 Blob 對象的形式擷取此 ResultSet 對象的當前行中指定列的值。
Blob getBlob(int columnIndex)
// 以 Java 程式設計語言中 Blob 對象的形式擷取此 ResultSet 對象的當前行中指定列的值。
Blob getBlob(String columnLabel)
擷取Blob對象後可以繼續調用getBinaryStream()方法擷取輸入資料流。
樣本:
代碼:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/** * 使用JDBC操作位元據
* * @author
* */
public class BlobTest {
/** * 插入位元據到資料庫
* * @throws Exception
*/
public static void add() throws Exception {
Connection conn = null;
PreparedStatement pstmt = null;
// 擷取資料庫會話對象
JdbcSession session = JdbcSessionFactory.getCurrentSession();
// 擷取資料庫連接
conn = session.getConnection();
// 插入音樂資料的SQL語句
String sql = "INSERT INTO music(content) VALUES(?)";
pstmt = conn.prepareStatement(sql);
// 建立PreparedStatement對象
pstmt = conn.prepareStatement(sql);
// 建立Reader對象
File file = new File(Thread.currentThread().getClass().getResource("/music/08.Along_in_the_night.mp3").getPath());
InputStream fis = new FileInputStream(file);
// 產生的流
pstmt.setBinaryStream(1, fis, file.length());
// 執行SQL語句
int count = pstmt.executeUpdate();
// 處理結果
if (count > 0)
System.out.println("添加成功");
else
System.out.println("添加失敗");
// 釋放資源
JdbcResourceManager.close(pstmt);
JdbcResourceManager.close(conn);
JdbcSessionFactory.closeSession();
}
/** * 從資料庫中讀位元據
* * @throws Exception
*/
public static void read() throws Exception {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
// 擷取資料庫會話對象
JdbcSession session = JdbcSessionFactory.getCurrentSession();
// 擷取資料庫連接
conn = session.getConnection();
// 建立SQL語句
String sql = "SELECT id, content FROM music WHERE id=?";
// 建立PreparedStatement對象
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 1);
// 執行SQL語句
rs = pstmt.executeQuery();
// 處理結果
if (rs.next()) {
InputStream in = rs.getBinaryStream("content");
// 擷取欄欄位InputStream對象
// 緩衝數組
byte buf[] = new byte[1024];
int len;
// 輸出資料流,將讀取到的音樂資料儲存到D盤
OutputStream out = new FileOutputStream("D:\\1.mp3");
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
// 釋放資源
JdbcResourceManager.close(rs);
JdbcResourceManager.close(pstmt);
JdbcResourceManager.close(conn);
JdbcSessionFactory.closeSession();
}
public static void main(String[] args) throws Exception {
add();
read();
}
}
使用JDBC處理MySQL大文本和大資料