zoukankan      html  css  js  c++  java
  • JDBC入门(5)--- 时间类型、大数据

    一、时间类型

    数据库类型与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     @Test
    15     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              * 需要得到Blob
    27              * 1、我们有的是文件,目标是Blob
    28              * 2、先把文件变成byte[]
    29              * 3、再使用byte[]创建Blob
    30              */
    31             byte[] bytes = IOUtils.toByteArray(new FileInputStream("/Users/Shared/薛之谦-一半.mp3"));
    32             //使用byte[]创建Blob
    33             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      * 从数据库中读取map3
    52      */
    53     @Test
    54     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语句模板,创建pstmt
    63             String sql = "SELECT * FROM tab_bin";
    64             pstmt = con.prepareStatement(sql);
    65             //3、pstmt执行查询,得到ResultSet
    66             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服务器即可解决。

     

  • 相关阅读:
    Event bubbling
    input/change event practice
    Form event
    Event_Object
    DOM_this keyword
    Random color generator exercise
    DOM_events_addEventListener
    Spring值SpEL
    Spring之使用外部属性文件
    Spring之Bean的作用域
  • 原文地址:https://www.cnblogs.com/gdwkong/p/7632912.html
Copyright © 2011-2022 走看看