zoukankan      html  css  js  c++  java
  • 大数据-将MP3保存到数据库并读取出来《黑马程序员_超全面的JavaWeb视频教程vedio》day17

    黑马程序员_超全面的JavaWeb视频教程vedio黑马程序员_超全面的JavaWeb教程-源码笔记JavaWeb视频教程_day17-资料源码day17_codeday17_1

    大数据

    目标:把mp3保存到数据库中!

    my.ini中添加如下配置!

    max_allowed_packet=10485760

    1 什么是大数据

    所谓大数据,就是大的字节数据,或大的字符数据。标准SQL中提供了如下类型来保存大数据类型:

    类型

    长度

    tinyblob

    28--1B256B

    blob

    216-1B64K

    mediumblob

    224-1B16M

    longblob

    232-1B4G

    tinyclob

    28--1B256B

    clob

    216-1B64K

    mediumclob

    224-1B16M

    longclob

    232-1B4G

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

    类型

    长度

    tinytext

    28--1B256B

    text

    216-1B64K

    mediumtext

    224-1B16M

    longtext

    232-1B4G

    首先我们需要创建一张表,表中要有一个mediumblob16M)类型的字段。

     

    CREATE TABLE tab_bin(
    
    id INT PRIMARY KEY AUTO_INCREMENT,
    
    filenameVARCHAR(100),
    
    data MEDIUMBLOB
    
    );

     向数据库插入二进制数据需要使用PreparedStatement为原setBinaryStream(int, InputSteam)方法来完成。

    con = JdbcUtils.getConnection();

    String sql = "insert into tab_bin(filename,data) values(?, ?)";

    pstmt = con.prepareStatement(sql);

    pstmt.setString(1, "a.jpg");

    InputStream in = new FileInputStream("f:\a.jpg");

    pstmt.setBinaryStream(2, in);

    pstmt.executeUpdate();

     读取二进制数据,需要在查询后使用ResultSet类的getBinaryStream()方法来获取输入流对象。也就是说,PreparedStatementsetXXX(),那么ResultSet就有getXXX()

    con = JdbcUtils.getConnection();

    String sql = "select filename,data from tab_bin where id=?";

    pstmt = con.prepareStatement(sql);

    pstmt.setInt(1, 1);

    rs = pstmt.executeQuery();

    rs.next();

    String filename = rs.getString("filename");

    OutputStream out = new FileOutputStream("F:\" + filename);

    InputStream in = rs.getBinaryStream("data");

    IOUtils.copy(in, out);

    out.close();

       还有一种方法,就是把要存储的数据包装成Blob类型,然后调用PreparedStatementsetBlob()方法来设置数据

    con = JdbcUtils.getConnection();

    String sql = "insert into tab_bin(filename,data) values(?, ?)";

    pstmt = con.prepareStatement(sql);

    pstmt.setString(1, "a.jpg");

    File file = new File("f:\a.jpg");

    byte[] datas = FileUtils.getBytes(file);//获取文件中的数据

    Blob blob = new SerialBlob(datas);//创建Blob对象

    pstmt.setBlob(2, blob);//设置Blob类型的参数

    pstmt.executeUpdate();

    con = JdbcUtils.getConnection();

    String sql = "select filename,data from tab_bin where id=?";

    pstmt = con.prepareStatement(sql);

    pstmt.setInt(1, 1);

    rs = pstmt.executeQuery();

    rs.next();

    String filename = rs.getString("filename");

    File file = new File("F:\" + filename) ;

    Blob blob = rs.getBlob("data");

    byte[] datas = blob.getBytes(0, (int)file.length());

    FileUtils.writeByteArrayToFile(file, datas);

    上课老师敲的代码:

    package cn.itcast.demo4;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.sql.Blob;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    import javax.sql.rowset.serial.SerialBlob;
    
    import org.apache.commons.io.IOUtils;
    import org.junit.Test;
    
    import cn.itcast.demo3.JdbcUtils;
    
    /**
     * 大数据
     * @author cxf
     *
     */
    public class Demo4 {
        /**
         * 把mp3保存到数据库中。
         * @throws SQLException 
         * @throws IOException 
         * @throws FileNotFoundException 
         */
        @Test
        public void fun1() throws Exception {
            /*
             * 1. 得到Connection
             * 2. 给出sql模板,创建pstmt
             * 3. 设置sql模板中的参数
             * 4. 调用pstmt的executeUpdate()执行
             */
            Connection con = JdbcUtils.getConnection();
            String sql = "insert into tab_bin values(?,?,?)";
            PreparedStatement pstmt = con.prepareStatement(sql);
            
            pstmt.setInt(1, 1);
            pstmt.setString(2, "流光飞舞.mp3");
            /**
             * 需要得到Blob
             * 1. 我们有的是文件,目标是Blob
             * 2. 先把文件变成byte[]
             * 3. 再使用byte[]创建Blob
             */
            // 把文件转换成byte[]
            byte[] bytes = IOUtils.toByteArray(new FileInputStream("F:/流光飞舞.mp3"));
            // 使用byte[]创建Blob
            Blob blob = new SerialBlob(bytes);
            // 设置参数
            pstmt.setBlob(3, blob);
            
            pstmt.executeUpdate();
        }
        
        /**
         * 从数据库读取mp3
         * @throws SQLException 
         */
        @Test
        public void fun2() throws Exception {
            /*
             * 1. 创建Connection
             */
            Connection con = JdbcUtils.getConnection();
            /*
             * 2. 给出select语句模板,创建pstmt
             */
            String sql = "select * from tab_bin";
            PreparedStatement pstmt = con.prepareStatement(sql);
            
            /*
             * 3. pstmt执行查询,得到ResultSet
             */
            ResultSet rs = pstmt.executeQuery();
            
            /*
             * 4. 获取rs中名为data的列数据
             */
            if(rs.next()) {
                Blob blob = rs.getBlob("data");
                /*
                 * 把Blob变成硬盘上的文件!
                 */
                /*
                 * 1. 通过Blob得到输入流对象
                 * 2. 自己创建输出流对象
                 * 3. 把输入流的数据写入到输出流中
                 */
                InputStream in = blob.getBinaryStream();
                OutputStream out = new FileOutputStream("c:/lgfw.mp3");
                IOUtils.copy(in, out);
            }
        }
    }
  • 相关阅读:
    Shell高级编程学习笔记(基础篇)
    基于Python的机器学习实战:Apriori
    基于Python的机器学习实战:AadBoost
    Theano教程:Python的内存管理
    基于theano的降噪自动编码器(Denoising Autoencoders--DA)
    基于theano的深度卷积神经网络
    推荐系统之矩阵分解及C++实现
    推荐系统之协同过滤的原理及C++实现
    一步一步详解ID3和C4.5的C++实现
    Principal components analysis(PCA):主元分析
  • 原文地址:https://www.cnblogs.com/rogge7/p/7008124.html
Copyright © 2011-2022 走看看