javaweb學習總結——使用JDBC處理MySQL大資料_java

來源:互聯網
上載者:User

BLOB (binary large object),二進位大對象,是一個可以儲存二進位檔案的容器。在電腦中,BLOB常常是資料庫中用來儲存二進位檔案的欄位類型,BLOB是一個大檔案,典型的BLOB是一張圖片或一個音效檔,由於它們的尺寸,必須使用特殊的方式來處理(例如:上傳、下載或者存放到一個資料庫)。

一、基本概念

在實際開發中,有時是需要用程式把大文本或位元據直接儲存到資料庫中進行儲存的。

對MySQL而言只有blob,而沒有clob,mysql儲存大文本採用的是Text,Text和blob分別又分為:

TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT

TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB

二、搭建測試環境

2.1、搭建的測試專案架構

如圖:

2.2、編寫db.properties設定檔

driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/jdbcStudyusername=rootpassword=XDP

2.3、編寫JdbcUtils工具類

package me.gacl.utils;import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;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{      //讀取db.properties檔案中的資料庫連接資訊      InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");      Properties prop = new Properties();      prop.load(in);            //擷取資料庫連接驅動      driver = prop.getProperty("driver");      //擷取資料庫連接URL地址      url = prop.getProperty("url");      //擷取資料庫連接使用者名稱      username = prop.getProperty("username");      //擷取資料庫連接密碼      password = prop.getProperty("password");            //載入資料庫驅動      Class.forName(driver);          }catch (Exception e) {      throw new ExceptionInInitializerError(e);    }  }    /**  * @Method: getConnection  * @Description: 擷取資料庫連接對象  * @Anthor:孤傲蒼狼  *  * @return Connection資料庫連接對象  * @throws SQLException  */   public static Connection getConnection() throws SQLException{    return DriverManager.getConnection(url, username,password);  }    /**  * @Method: release  * @Description: 釋放資源,  *   要釋放的資源套件括Connection資料庫連接對象,負責執行SQL命令的Statement對象,儲存查詢結果的ResultSet對象  * @Anthor:孤傲蒼狼  *  * @param conn  * @param st  * @param rs  */   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的大文本

對於MySQL中的Text類型,可調用如下方法設定

PreparedStatement.setCharacterStream(index, reader, length);//注意length長度須設定,並且設定為int型

對MySQL中的Text類型,可調用如下方法擷取

reader = resultSet. getCharacterStream(String columnLabel);2 string s = resultSet.getString(String columnLabel);

3.1、 測試範例

1、編寫SQL測試指令碼

create database jdbcstudy;use jdbcstudy;create table testclob(     id int primary key auto_increment,     resume text);

2、編寫測試代碼如下:

package me.gacl.demo;import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.Reader;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import me.gacl.utils.JdbcUtils;import org.junit.Test;/*** @ClassName: JdbcOperaClob* @Description: 使用JDBC操作MySQL的大文本* @author: 孤傲蒼狼* @date: 2014-9-19 下午10:10:04**/ 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);      //這種方式擷取的路徑,其中的空格會被使用“%20”代替      String path = JdbcOperaClob.class.getClassLoader().getResource("data.txt").getPath();      //將“%20”替換回空格      path = path.replaceAll("%20", " ");      File file = new File(path);      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: 讀取資料庫中的大文本資料  * @Anthor:孤傲蒼狼  *  */   @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=2";      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的位元據

對於MySQL中的BLOB類型,可調用如下方法設定:

PreparedStatement. setBinaryStream(i, inputStream, length);

對MySQL中的BLOB類型,可調用如下方法擷取:

InputStream in = resultSet.getBinaryStream(String columnLabel);InputStream in = resultSet.getBlob(String columnLabel).getBinaryStream(); 

4.1、 測試範例

1、編寫SQL測試指令碼

create table testblob(   id int primary key auto_increment,   image longblob );

2、編寫測試代碼如下:

package me.gacl.demo;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import me.gacl.utils.JdbcUtils;import org.junit.Test;/*** @ClassName: JdbcOperaClob* @Description: 使用JDBC操作MySQL的位元據(例如映像、聲音、二進位文)* @author: 孤傲蒼狼* @date: 2014-9-19 下午10:10:04**/ public class JdbcOperaBlob {  /**  * @Method: add  * @Description:向資料庫中插入位元據  * @Anthor:孤傲蒼狼  *  */   @Test  public void add(){    Connection conn = null;    PreparedStatement st = null;    ResultSet rs = null;    try{      conn = JdbcUtils.getConnection();      String sql = "insert into testblob(image) values(?)";      st = conn.prepareStatement(sql);      //這種方式擷取的路徑,其中的空格會被使用“%20”代替      String path = JdbcOperaBlob.class.getClassLoader().getResource("01.jpg").getPath();      //將“%20”替換會空格      path = path.replaceAll("%20", " ");      File file = new File(path);      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);    }  }    /**  * @Method: read  * @Description: 讀取資料庫中的位元據  * @Anthor:孤傲蒼狼  *  */   @Test  public void read() {    Connection conn = null;    PreparedStatement st = null;    ResultSet rs = null;    try {      conn = JdbcUtils.getConnection();      String sql = "select image from testblob 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);    }  }}

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.