一、时间类型
数据库类型与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服务器即可解决。