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中提供了如下类型来保存大数据类型:

类型长度
tinyblob28-1B(256B)
blob216-1B(64K)
mediumblob224-1B(16M)
longblob232-1B(4G)
tinyclob28-1B(256B)
clob216-1B(64K)
mediumclob224-1B(16M)
longclob232-1B(4G)

 

 

 

 

 

 

 

 

 

但是,在mysql中没有提供tinyclob、clob、mediumclob、longclob四种类型,而是使用如下四种类型来处理文本大数据:

类型长度
tinytext28-1B(256B)
text216-1B(64K)
mediumtext224-1B(16M)
longtext232-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服务器即可解决。

 

转载于:https://www.cnblogs.com/gdwkong/p/7632912.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值