zoukankan      html  css  js  c++  java
  • 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

        MediumBlob:最大16M

        LongBlob:最大4G

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

    • 插入Blob数据

    复制代码

    package com.litian.jdbc;
    
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.sql.*;
    
    /**
     * @author: Li Tian
     * @contact: litian_cup@163.com
     * @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: litian_cup@163.com
     * @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);
            }
        }
    }
  • 相关阅读:
    vue-学习笔记-事件处理
    微博api接口登陆,获取信息,分享微博
    ad批量上传
    jieba分词及词频统计小项目
    Python内置函数复习
    爬虫哈希破解密码
    pipenv 管理虚拟环境
    python工程化最佳实践
    matplotlib绘图难题解决
    pandas 实现rfm模型
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13308987.html
Copyright © 2011-2022 走看看