jdbc—CLOB和BLOB
阿新 • • 發佈:2017-05-16
span pri logs 大對象 tac nal 操作 from dst
-CLOB(Character Large Object)
- 用於存儲大量的文本數據
- 大字段有些特殊,不同數據庫處理的方式不一樣,大字段的操作常常是以流的方式來處理的。而非一般的字段,一次即可讀出數據。
- Mysql中相關類型
- TINYTEXT最大長度為255(2^8-1)字符的TEXT列
- TEXT(M)最大長度為65535(2^16-1)字符的TEXT列
- MEDIUMTEXT最大長度為16777215(2^24 -1)字符的TEXT列
- LONGTEXT最大長度為4294967295或4GB(2^32 -1)字符的TEXT列
例子:
將大數據文件存儲到數據庫中,或者將程序中的字符串等存儲到CLOB的字段中,從DB中的CLOB字段裏取出值。
package com.yf.jdbc.test; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.sql.Clob; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;/** * 測試CLOB(文本大對象)的使用 * @author yangf * */ public class Demo09 { public static void main(String[] args) { Connection con = null; PreparedStatement ps1 = null; PreparedStatement ps2 = null; ResultSet rs = null; try { // 加載數據庫驅動 Class.forName("com.mysql.jdbc.Driver"); // 獲得connection對象 建立與數據庫連接 con = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "123456"); ps1 = con.prepareStatement("insert into t_user (username,myInfo) values (?,?)"); ps1.setString(1, "yangf"); ps1.setClob(2, new FileReader("d:a.txt")); // 或者將程序中的字符串登錄到DB中 ps1.setClob(2, new BufferedReader(new InputStreamReader(new ByteArrayInputStream("yangfyangf".getBytes())))); ps2 = con.prepareStatement("select * from t_user where id = ?"); ps2.setInt(1, 22009); rs = ps2.executeQuery(); while (rs.next()) { Clob c = rs.getClob("myInfo"); Reader r = c.getCharacterStream(); int len = 0; while (-1 != (len = r.read())) { System.out.print((char) r.read()); } } ps1.execute(); } catch (Exception e) { e.printStackTrace(); } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (ps1 != null) { try { ps1.close(); } catch (SQLException e) { e.printStackTrace(); } } if (con != null) { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
- BLOB(Binary Large Object)
- 用於存儲大量的二進制數據
- 大字段有些特殊,不同數據庫處理的方式不一樣。大字段的操作常常是以流的方式來處理進行的。而非一般的字段,可以一次性讀出數據。
- Mysql中相關類型
- TINYBLOB最大長度為255(2^8 - 1)字節的BLOB列。
- BLOB(M)最大長度為65535(2^16 - 1)字節的BLOB列。
- MEDIUMBLOB最大長度為16777215(2^24 - 1)字節的BLOB列。
- LONGBLOB最大長度為4294967295或4GB(2^32 - 1)字節的BLOB列。
例子:將大數據存儲到DB的BLOB字段中,從DB中取出BLOB字段的內容。
package com.yf.jdbc.test; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.sql.Blob; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * 測試CLOB(文本大對象)的使用 * @author yangf * */ public class Demo10 { public static void main(String[] args) { Connection con = null; PreparedStatement ps1 = null; PreparedStatement ps2 = null; ResultSet rs = null; try { // 加載數據庫驅動 Class.forName("com.mysql.jdbc.Driver"); // 獲得connection對象 建立與數據庫連接 con = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "123456"); ps1 = con.prepareStatement("insert into t_user (username,headImg) values (?,?)"); ps1.setString(1, "yangf123"); ps1.setBlob(2, new FileInputStream("d:/head.jpg")); ps1.execute(); // 取出數據庫的BLOB信息 ps2 =con.prepareStatement("select * from t_user where id = ?"); ps2.setInt(1, 22010); rs = ps2.executeQuery(); while (rs.next()) { Blob blob = rs.getBlob("headImg"); InputStream is = blob.getBinaryStream(); int len = 0; FileOutputStream os = new FileOutputStream("d:/yangf.jpg"); while ((len = is.read()) != -1) { os.write(len); } } } catch (Exception e) { e.printStackTrace(); } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (ps1 != null) { try { ps1.close(); } catch (SQLException e) { e.printStackTrace(); } } if (con != null) { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
jdbc—CLOB和BLOB