文章目录
1. 时间类型的问题
1.1 java中的类型和数据库中的类型的对应关系
首先讨论一个问题,就是java中的类型和数据库中的类型的对应关系!
数据库中的整数型(int相关的类型)对应于java中的int类型 (不需要转换)
数据库中的浮点型(double/float类型)对应于java中的double和float(不需要转换)
数据库中的字符串(char/varchar)对应于java中的String(不需要转换)
数据库中时间/日期相关的类型与java中时间/日期类型的对应关系:
DATE -> java.sql.Date
TIME -> java.sql.Time
TIMESTAMP -> java.sql.Timestamp
可以发现数据库中的时间/日期类型对应的都是java.sql包下的时间日期类型,而不是java.util包下的!Date
而且,我们在操作结果集合预编译的时候还会涉及到如下两个问题:
- ResultSet#getDate()返回的是java.sql.Date
- PreparedStatement#setDate(int, Date),其中第二个参数也是java.sql.Date
上面的这些是在操作数据库的时候,需要用到的时间/日期类型。而我们在其他地方用到的时间日期类型都是java.util包下的。所有就涉及到数据库和java中的时间日期类型的转换问题!
1.2 时间类型的转换:
java中到数据库的转换
java.util.Date -> java.sql.Date、Time、Timestamp
把util的Date转换成毫秒值
使用毫秒值创建sql的Date、Time、Timestamp对象
java.util.Date d = new java.util.Date();
java.sql.Date sql_d = new java.sql.Date(d.getTime());
数据库到java的转换
java.sql.Date、Time、Timestamp -> java.util.Date
java.sql.Date、Time、Timestamp是java.util.Date的子类,所以可以直接复制
java.util.Date d = new java.sql.Date();
java.util.Date d = new java.sql.Time ();
java.util.Date d = new java.sql. Timestamp ();
2.视频(字节数据)的存储
2.1 标准SQL中提供了如下类型来保存字节的数据类型:
类型 | 长度 |
---|---|
tinyblob | 2^8–1B(256B) |
blob | 2^16-1B(64K) |
mediumblob | 2^24-1B(16M) |
longblob | 2^32-1B(4G) |
2.2 把视频(字节数据)存到数据库表中去
出现最大通过数据问题解决方案:
my.ini中添加配置:max_allowed_packet=10485760
public void method() throws Exception {
//输入流
FileInputStream fis = new FileInputStream("test.mp4");
//从工具类获取数据库连接
Connection con = JdbcUtils03.getConnection();
PreparedStatement pstmt = con.prepareStatement("insert into tab_mp4 value(?,?,?)");
pstmt.setInt(1,2); //id
pstmt.setString(2,"copy.mp4"); //名称
pstmt.setBinaryStream(3,fis); //字节数据
pstmt.executeUpdate();
fis.close();
pstmt.close();
con.close();
}
2.3 把视频(字节数据)存到数据库表中去的第二种实现方案
public void method3() throws Exception {
FileInputStream fis = new FileInputStream("24常量的种类.mp4");
Connection con = JdbcUtils03.getConnection();
PreparedStatement pstmt = con.prepareStatement("insert into tab_mp4 value(?,?,?)");
pstmt.setInt(1,3);
pstmt.setString(2,"copy.mp4");
//这里不一样
// pstmt.setBinaryStream(3,fis);
//把fis转换成字节数组
//用commons-io
//IOUtils
byte[] bytes = IOUtils.toByteArray(fis);
Blob blob = new SerialBlob(bytes); //参数时一个字节数组
pstmt.setBlob(3,blob);
pstmt.executeUpdate();
fis.close();
pstmt.close();
con.close();
}
2.3 把数据库中的mp4(字节数据)取出来
public void method2() throws Exception {
//从数据库中取二进制文件
//把数据库中的二进制文件复制到本地
//先查出来
Connection connection = JdbcUtils03.getConnection();
PreparedStatement pstmt = connection.prepareStatement("select * from tab_mp4");
ResultSet rst = pstmt.executeQuery();
rst.next();
int id = rst.getInt(1);
String name = rst.getString(2);
InputStream is = rst.getBinaryStream(3);//输入流
FileOutputStream fos = new FileOutputStream("c.mp4");//输出流
int data;
//is.read() 其实时一个字节 byte 1个字节 返回值 int
// int=byte
// -1:文件末尾的标志
while((data=is.read())!=-1){
fos.write(data);
}