jdbc的使用(三)--时间类型的问题、视频(字节数据)的存储

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

而且,我们在操作结果集合预编译的时候还会涉及到如下两个问题:

  1. ResultSet#getDate()返回的是java.sql.Date
  2. 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中提供了如下类型来保存字节的数据类型:

类型长度
tinyblob2^8–1B(256B)
blob2^16-1B(64K)
mediumblob2^24-1B(16M)
longblob2^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);
        }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值