JDBC入門(5)--- 時間類型、大資料

來源:互聯網
上載者:User

標籤:red   資料庫   關閉   一半   輸出   main   my.cnf   string   medium   

一、時間類型

資料庫類型與Java中類型的對應關係:

DATE->java.sql.Date:表示日期,只有年月日,沒有時分秒,會丟失時間。

TIME->java.sql.Time:表示時間,只有時分秒,沒有年月日,會丟失日期。

TIMESTAMP->java.sql.Timestamp:表示時間戳記,有年月日時分秒,以及毫秒。

  • 領域對象(domain)中的所有屬性不能出現java.sql包下的對象,即不能使用java.sql.Date
  • ResultSet#getDate()返回的是java.sql.Date()
  • PreparedStatement#setDate(int,Date),其中第二個參數也是java.sql.Date

時間類型的轉換:

  • java.util.Date ->java.sql.Date、Time、Timestamp
    • 把util的Date轉換成毫秒值
    • 使用毫秒值建立sql的Date、Time、Timestamp
  • java.sql.Date、Time、Timestamp->java.util.Date 
    • 這一不不需要處理了:因為java.sql.Date是java.util.Date的子類。  

java.util.Date date = new java.util.Date();

long l = date.getTime();

java.sql.Date sqlDate = new java.sql.Date(l);

二、大資料

所謂大資料,就是大的位元組資料,或大的字元資料。標準SQL中提供了如下類型來儲存大資料類型:

類型 長度
tinyblob 28-1B(256B)
blob 216-1B(64K)
mediumblob 224-1B(16M)
longblob 232-1B(4G)
tinyclob 28-1B(256B)
clob 216-1B(64K)
mediumclob 224-1B(16M)
longclob 232-1B(4G)

 

 

 

 

 

 

 

但是,在mysql中沒有提供tinyclob、clob、mediumclob、longclob四種類型,而是使用如下四種類型來處理文本大資料:

類型 長度
tinytext 28-1B(256B)
text 216-1B(64K)
mediumtext 224-1B(16M)
longtext 232-1B(4G)

 

 

 

 

執行個體:

 1 package demo4; 2  3 import demo3.JdbcUtils; 4 import org.apache.commons.io.IOUtils; 5 import org.junit.Test; 6 import javax.sql.rowset.serial.SerialBlob; 7 import java.io.*; 8 import java.sql.*; 9 10 public class Demo4 {11     /**12      * 把map3儲存到資料庫中、JdbcUtils為自建類13      */14     @Test15     public void fun1() {16         Connection con = null;17         PreparedStatement pstmt = null;18         Blob blob;19         try {20             con = JdbcUtils.getConnection();21             String sql = "INSERT INTO tab_bin VALUES (?,?,?)";22             pstmt = con.prepareStatement(sql);23             pstmt.setInt(1,1);24             pstmt.setString(2,"薛之謙-一半.mp3");25             /**26              * 需要得到Blob27              * 1、我們有的是檔案,目標是Blob28              * 2、先把檔案變成byte[]29              * 3、再使用byte[]建立Blob30              */31             byte[] bytes = IOUtils.toByteArray(new FileInputStream("/Users/Shared/薛之謙-一半.mp3"));32             //使用byte[]建立Blob33             blob = new SerialBlob(bytes);34             //設定參數35             pstmt.setBlob(3,blob);36             pstmt.executeUpdate();37         } catch (SQLException e) {38             e.printStackTrace();39         } catch (IOException e) {40             e.printStackTrace();41         } finally {42             try {43                 if (pstmt != null) pstmt.close();44                 if (con != null) con.close();45             } catch (SQLException e) {46                 e.printStackTrace();47             }48         }49     }50     /**51      * 從資料庫中讀取map352      */53     @Test54     public void fun2() {55         Connection con = null;56         PreparedStatement pstmt = null;57         ResultSet rs = null;58         Blob blob;59         //1、得到串連60         try {61             con = JdbcUtils.getConnection();62             //2、給出select語句模板,建立pstmt63             String sql = "SELECT * FROM tab_bin";64             pstmt = con.prepareStatement(sql);65             //3、pstmt執行查詢,得到ResultSet66             rs = pstmt.executeQuery();67             //擷取名為DATA列的資料68             if (rs.next()) {69                 blob = rs.getBlob("DATA");70                 //把Blob變成硬碟上的檔案71                     /*72                     * 1、通過Blob得到輸入資料流對象73                     * 2、自己建立輸出資料流對象74                     * 3、把輸入資料流的資料寫到輸出資料流中75                     * */76                 InputStream in = blob.getBinaryStream();77                 OutputStream out = new FileOutputStream("/Users/Mac/Downloads/薛之謙-一半2.mp3");78                 IOUtils.copy(in, out);79             }80         } catch (SQLException e) {81             e.printStackTrace();82         } catch (IOException e) {83             e.printStackTrace();84         } finally {85             try {86                 if (rs != null) rs.close();87                 if (pstmt != null) pstmt.close();88                 if (con != null) con.close();89             } catch (SQLException e) {90                 e.printStackTrace();91             }92         }93     }94 }

當儲存資料大於設定值時會報如下異常:

com.mysql.jdbc.PacketTooBigException: Packet for query is too large (4188642 > 1048576). You can change this value on the server by setting the max_allowed_packet‘ variable.

需要對mysql設定檔(Mac中 /etc/my.cnf)相應位置進行添加修改:

儲存關閉,重啟MySQL伺服器即可解決。

 

JDBC入門(5)--- 時間類型、大資料

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.