1. 程式人生 > >JDBC處理mysql大數據

JDBC處理mysql大數據

tro script next() code method long final read inno

  大數據也稱之為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大數據