clob-資料庫存取大文字檔案、二進位制圖片
阿新 • • 發佈:2018-11-17
將檔案中所有資料(即大文字)作為資料庫表某一列值存入:
程式碼涉及到IO及SQL的相關包:
import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;
資料庫儲存大文字物件(clob-來自檔案)
/** * 讀檔案並儲存到資料庫(reader輸入流:檔案——資料庫) */ static void read() { String url = "jdbc:mysql://192.168.1.45:3306/employ"; String uerName = "root"; String password = "[email protected]"; try {// 載入mysql資料庫驅動 Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } /** * 要讀的大文字 **/ File file = new File("E:\\data\\logs\\udd-config-admin.log"); if (!file.exists()) { return; } FileReader reader = null;// 輸入流reader try { reader = new FileReader(file); } catch (FileNotFoundException e1) { e1.printStackTrace(); } Connection conn = null; PreparedStatement pstmt = null; try {// 獲取資料庫連線物件 conn = DriverManager.getConnection(url, uerName, password); String sql = "insert into clob(clob_col) values(?)"; // 獲取預處理物件(標準sql儲存起來) pstmt = conn.prepareStatement(sql); pstmt.setCharacterStream(1, reader, file.length());// file大文字內容讀到資料庫 pstmt.executeUpdate();// 執行資料庫更新 } catch (SQLException e) { e.printStackTrace(); } finally { try { if (pstmt != null) { pstmt.close(); pstmt = null; } if (conn != null) { conn.close(); conn = null; } } catch (SQLException e) { e.printStackTrace(); } } }
將資料庫中大文字欄位讀出並寫入檔案方法:
void writer() { String url = "jdbc:mysql://192.168.1.45:3306/employ"; String uerName = "root"; String password = "[email protected]"; try {// 載入mysql資料庫驅動 Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } /** * 待寫入資料的檔案 **/ File file = new File("D:\\data\\test.log"); FileWriter writer = null;// 輸出流writer try { if (!file.exists()) {// 檔案不存在,建立空檔案 file.createNewFile(); } writer = new FileWriter(file); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try {// 獲取資料庫連線物件 conn = DriverManager.getConnection(url, uerName, password); String sql = "select * from clob "; // 獲取預處理物件(標準sql儲存起來) pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery();// 去資料庫查詢 while (rs.next()) { // 從結果集中讀出大文字資料 Reader rd = rs.getCharacterStream(2); char[] buf = new char[1024]; int len = rd.read(buf); while (len != -1) { writer.write(buf, 0, len); len = rd.read(buf); } } writer.close(); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if (pstmt != null) { pstmt.close(); pstmt = null; } if (conn != null) { conn.close(); conn = null; } } catch (SQLException e) { e.printStackTrace(); } } }
程式碼中涉及到的表:
CLOB和BLOB的區別
CLOB使用CHAR來儲存資料。 如:儲存XML文件、檔案等
BLOB就是使用二進位制儲存資料。 如:儲存點陣圖、圖片、視訊等
用blob存取圖片安全性更高
因blob與clob資料存取操作類似,下面僅僅貼出blob相關主要程式碼及資料庫樣式:
/**
* 要儲存的圖片檔案
**/
File file = new File("E:\\flower.jpg");
if (!file.exists()) {
return;
}
FileInputStream fis = null;// 輸入流
BufferedInputStream bis = null;// 過濾流,加速
try {
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
Connection conn = null;
PreparedStatement pstmt = null;
try {// 獲取資料庫連線物件
conn = DriverManager.getConnection(url, uerName, password);
String sql = "insert into clob(blob_col) values(?)";
// 獲取預處理物件(標準sql儲存起來)
pstmt = conn.prepareStatement(sql);
pstmt.setBinaryStream(1, bis, file.length());// 圖片對應二進位制讀到資料庫
pstmt.executeUpdate();// 執行資料庫更新
} catch (SQLException e) {
e.printStackTrace();
}
讀出資料庫中二進位制圖片:
/**
* 圖片顯示位置
**/
File file = new File("D:\\data\\tt.jpg");
FileOutputStream fos = null;// 輸出流
BufferedOutputStream bos = null;
try {
if (!file.exists()) {// 檔案不存在,建立空檔案
file.createNewFile();
}
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {// 獲取資料庫連線物件
conn = DriverManager.getConnection(url, uerName, password);
String sql = "select * from clob ";
// 獲取預處理物件(標準sql儲存起來)
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();// 去資料庫查詢
while (rs.next()) {
// 從結果集中讀出大文字資料
InputStream is = rs.getBinaryStream(2);
byte[] buf = new byte[1024];
int len = is.read(buf);
while (len != -1) {
bos.write(buf, 0, len);
len = is.read(buf);
}
}
bos.close();
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
表: