如何在数据库中存储大的数据文件

1. 什么是大的数据?

所谓大的数据,就是大的字节数据,或大的字符数据。标准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)

其中上面的四种blob是存储大的字节数据,下面四种clob是存储大的字符数据。

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

类型长度
tinytext28–1B(256B)
text216-1B(64K)
mediumtext224-1B(16M)
longtext232-1B(4G)

接下来我们做一个演示。
在此之前,我们先修改一下mysql的配置文件,把最大的包文件大小设置为10M。
在my.ini中添加如下配置:max_allowed_packet=10485760

代码:

  1. 首先我们需要创建一张表,表中要有一个mediumblob(16M)类型的字段。
    CREATE TABLE tab_bin(
    	id INT PRIMARY KEY AUTO_INCREMENT,
    	filename VARCHAR(100),
    	data MEDIUMBLOB
    );
    
  2. 存储数据代码:
    /**
     * 把 MP3保存到数据库中。
     */
    public static void fun1() throws ClassNotFoundException, SQLException, IOException {
    
        String url = "jdbc:mysql://localhost:3306/test";
        String username = "root";
        String password = "0000";
    
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection(url, username, password);
        String sql = "insert into tab_bin values(?,?,?)";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1, 1);
        preparedStatement.setString(2, "xxx.mp3");
        /**
         * 我们需要得到一个Blob
         * 先把文件变成 byte[],这里我们使用一个工具类的方法,这个工具类,大家可以在资源下载里下载。
         * 再使用byte[]创建Blob
         */
        //把文件变成byte[]
        byte[] bytes = IOUtils.toByteArray(new FileInputStream("F://xxx.mp3"));
        Blob blob = new SerialBlob(bytes);
        preparedStatement.setBlob(3, blob);
        preparedStatement.execute();
    }
    
  3. 取出数据代码:
    /**
     * 从数据库中读取 MP3。
     */
    public void fun2() throws ClassNotFoundException, SQLException, IOException {
        String url = "jdbc:mysql://localhost:3306/test";
        String username = "root";
        String password = "0000";
    
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection(url, username, password);
        String sql = "select * from tab_bin";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        ResultSet resultSet = preparedStatement.executeQuery(sql);
        // 获取resultSet中列为data的数据
        if (resultSet.next()) {
            Blob blob = resultSet.getBlob("data");
            // 把blob变成硬盘上的文件
            // 通过blob得到输入流对象
            // 自己创建输出流对象
            // 把输入流数据写入到输出流中
            InputStream inputStream = blob.getBinaryStream();
            OutputStream out = new FileOutputStream("F://yyy.mp3");
            IOUtils.copy(inputStream,out);
        }
    }
    
  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值