MYSQL 之 JDBC(十二): 处理Blob

  • LOB,即Large Objects(大对象),是用来存储大量的二进制和文本数据的一种数据类型

  • LOB分为两种内省:内部LOB和外部LOB

    内部LOB将数据以字节流的形式存储在数据库的内部。因而内部LOB的许多操作都可以参与事务,也可以像处理普通数据一样对其进行备份和恢复操作。

    Oracle支持三种类型的内部LOB:

      BLOB:二进制数据

      CLOB:单字节字符数据

      NCLOB:多字节字符数据

    CLOB和NCLOB类型适用于存储超长的文本数据,BLOB字段适用于存储大量的二进制数据,如图像、视频、音频、文件等。

  MySQL四种BLOB类型(除了在存储的最大信息量上不同之外,他们是等同的)

    TinyBlob:最大255字节

    Blob:最大65K

扫描二维码关注公众号,回复: 11379255 查看本文章

    MediumBlob:最大16M

    LongBlob:最大4G

  • 如果存储的文件过大,数据库的性能会下降。

  • 插入Blob数据

package com.litian.jdbc;

import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.*;

/**
 * @author: Li Tian
 * @contact: [email protected]
 * @software: IntelliJ IDEA
 * @file: InsertBlob.java
 * @time: 2020/3/31 14:40
 * @desc: |插入Blob类型的数据必须使用PreparedStatement,因为BLOB类型的数据是无法使用字符串拼写的
 *          调用setBlob方法插入BLOB
 */

public class InsertBlob {
    public static void main(String[] args){
        Connection conn = null;
        PreparedStatement ps = null;

        try {
            conn = JDBCTools.getConnection();
            String sql = "insert into t_user(username, pwd, pic) values(?,?,?)";
            ps = conn.prepareStatement(sql);
            ps.setString(1, "picture");
            ps.setString(2, "123456");
            InputStream is = new FileInputStream("C:\\Users\\Administrator\\Desktop\\参考投稿进程.jpg");
            ps.setBlob(3, is);

            ps.executeUpdate();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCTools.release(null, ps, conn);
        }
    }
}

读取Blob数据

package com.litian.jdbc;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * @author: Li Tian
 * @contact: [email protected]
 * @software: IntelliJ IDEA
 * @file: ReadBlob.java
 * @time: 2020/3/31 14:47
 * @desc: |读取Blob数据
 *      1. 使用getBlob方法读取到Blob对象
 *      2. 调用Blob的getBinaryStream()方法得到输入流。再使用IO操作即可。
 */

public class ReadBlob {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            conn = JDBCTools.getConnection();
            String sql = "select id, username 姓名, pwd, pic from t_user where id=21028";
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();

            if (rs.next()) {
                int id = rs.getInt(1);
                String name = rs.getString(2);
                String pwd = rs.getString(3);
                System.out.println(id + "->" + name + "->" + pwd);
                Blob pic = rs.getBlob(4);
                InputStream in = pic.getBinaryStream();
                OutputStream out = new FileOutputStream("info.jpg");
                byte[] buffer = new byte[1024];
                int len = 0;
                while((len=in.read(buffer)) != -1){
                    out.write(buffer, 0, len);
                }
                out.close();
                in.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCTools.release(rs, ps, conn);
        }
    }
}

————————————————
版权声明:本文为CSDN博主「李英俊小朋友」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_21579045/article/details/105386353

猜你喜欢

转载自www.cnblogs.com/qiu-hua/p/13199674.html
今日推荐