標籤:png date lease output 建立 tchar err stream rip
大資料也稱之為LOB(Large Objects),LOB又分為:clob和blob,clob用於儲存大文本,blob用於儲存位元據,例像、聲音、二進位文等。
在實際開發中,有時是需要用程式把大文本或位元據直接儲存到資料庫中進行儲存的。
對MySQL而言只有blob,而沒有clob,mysql儲存大文本採用的是Text,Text和blob分別又分為:
TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT
TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB
一.工具類
public class JdbcUtils { private static String driver = null; private static String url = null; private static String username = null; private static String password = null; static{ try{ url = "jdbc:mysql://localhost:3306/test"; driver = "com.mysql.jdbc.Driver"; username = "root"; password = "root"; //載入資料庫驅動 Class.forName(driver); }catch (Exception e) { throw new ExceptionInInitializerError(e); } } /** * @return Connection資料庫連接對象 * @throws SQLException */ public static Connection getConnection() throws SQLException{ return DriverManager.getConnection(url, username,password); } /** * 要釋放的資源套件括Connection資料庫連接對象,負責執行SQL命令的Statement對象,儲存查詢結果的ResultSet對象 */ public static void release(Connection conn,Statement st,ResultSet rs){ if(rs!=null){ try{ //關閉儲存查詢結果的ResultSet對象 rs.close(); }catch (Exception e) { e.printStackTrace(); } rs = null; } if(st!=null){ try{ //關閉負責執行SQL命令的Statement對象 st.close(); }catch (Exception e) { e.printStackTrace(); } } if(conn!=null){ try{ //關閉Connection資料庫連接對象 conn.close(); }catch (Exception e) { e.printStackTrace(); } } }}
二.使用jdbc處理MySQL的大文本sql語句
CREATE TABLE `testclob` ( `id` int(11) NOT NULL AUTO_INCREMENT, `resume` text, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
在resource下建立一個data.txt
“百度知道”,是使用者自己根據具有針對性地提出問題,通過積分獎勵機制發動其他使用者,來解決該問題的搜尋模式。 同時,這些問題的答案又會進一步作為搜尋結果,提供給其他有類似疑問的使用者,達到分享知識的效果。百度知道的最大特點,就在於和搜尋引擎的完美結合,讓使用者所擁有的隱性知識轉化成顯性知識,使用者既是百度知道內容的使用者,同時又是百度知道的創造者,在這裡累積的知識資料可以反映到搜尋結果中。通過使用者和搜尋引擎的相互作用,實現搜尋引擎的社區化。百度知道也可以看作是對搜尋引擎功能的一種補充,讓使用者頭腦中的隱性知識變成顯性知識,通過對回答的沉澱和組織形成新的資訊庫,其中資訊可被使用者進一步檢索和利用。這意味著,使用者既是搜尋引擎的使用者,同時也是創造者。百度知道可以說是對過分依靠技術的搜尋引擎的一種人性化完善。
測試代碼如下:
public class JdbcOperaClob { /** * @Method: add * @Description:向資料庫中插入大文本資料 * @Anthor:孤傲蒼狼 * */ @Test public void add(){ Connection conn = null; PreparedStatement st = null; ResultSet rs = null; Reader reader = null; try{ conn = JdbcUtils.getConnection(); String sql = "insert into testclob(resume) values(?)"; st = conn.prepareStatement(sql); //相對路徑,web容器載入class檔案的時候,就是載入這個檔案夾下的class檔案. File file = new File("target/classes/data.txt"); reader = new FileReader(file); st.setCharacterStream(1, reader,(int) file.length()); int num = st.executeUpdate(); if(num>0){ System.out.println("插入成功!!"); } //關閉流 reader.close(); }catch (Exception e) { e.printStackTrace(); }finally{ // JdbcUtils.release(conn, st, rs); } } /** * @Method: read * @Description: 讀取資料庫中的大文本資料 */ @Test public void read(){ Connection conn = null; PreparedStatement st = null; ResultSet rs = null; try{ conn = JdbcUtils.getConnection(); String sql = "select resume from testclob where id=3"; st = conn.prepareStatement(sql); rs = st.executeQuery(); String contentStr =""; String content = ""; if(rs.next()){ //使用resultSet.getString("欄位名")擷取大文本資料的內容 content = rs.getString("resume"); //使用resultSet.getCharacterStream("欄位名")擷取大文本資料的內容 Reader reader = rs.getCharacterStream("resume"); char buffer[] = new char[1024]; int len = 0; FileWriter out = new FileWriter("D:\\1.txt"); while((len=reader.read(buffer))>0){ contentStr += new String(buffer); out.write(buffer, 0, len); } out.close(); reader.close(); } System.out.println(content); System.out.println("-----------------------------------------------"); System.out.println(contentStr); }catch (Exception e) { e.printStackTrace(); }finally{ JdbcUtils.release(conn, st, rs); } }}
三.使用jdbc處理MySQL的位元據sql語句
CREATE TABLE `testblobim` ( `id` int(11) NOT NULL AUTO_INCREMENT, `image` longblob, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
在resource放一張照片:迪麗熱巴.jpg
測試代碼:
public class JdbcOperaBloblmgs { /** * @Description:向資料庫中插入位元據 */ @Test public void add(){ Connection conn = null; PreparedStatement st = null; ResultSet rs = null; try{ conn = JdbcUtils.getConnection(); String sql = "insert into testblobim(image) values(?)"; st = conn.prepareStatement(sql); //相對路徑,class下的相對路徑 File file = new File("target/classes/迪麗熱巴.jpg"); FileInputStream fis = new FileInputStream(file);//產生的流 st.setBinaryStream(1, fis,(int) file.length()); int num = st.executeUpdate(); if(num>0){ System.out.println("插入成功!!"); } fis.close(); }catch (Exception e) { e.printStackTrace(); }finally{ JdbcUtils.release(conn, st, rs); } } /** * @Description: 讀取資料庫中的位元據 */ @Test public void read() { Connection conn = null; PreparedStatement st = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); String sql = "select image from testblobim where id=?"; st = conn.prepareStatement(sql); st.setInt(1, 1); rs = st.executeQuery(); if (rs.next()) { //InputStream in = rs.getBlob("image").getBinaryStream();//這種方法也可以 InputStream in = rs.getBinaryStream("image"); int len = 0; byte buffer[] = new byte[1024]; FileOutputStream out = new FileOutputStream("D:\\1.jpg"); while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } in.close(); out.close(); } } catch (Exception e) { e.printStackTrace(); } finally { JdbcUtils.release(conn, st, rs); } }}
JDBC處理mysql大資料