JDBC 处理Blob(10)

Mysql中,Blob是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据

MySQL 的四种Blob类型:(除了在存储的最大信息量上不同外,它们是等同的,如果存储的文件过大,数据库的性能会下降)

类型

大小(单位:字节)

TinyBlob

最大 255byte

Blob

最大 65k

MediumBlob

最大 16M

LongBlob

最大 4G

public class JDBCTest03 {
    // 插入图片,在数据库设置对应图片字段的Blob类型
    // 插入Blob类型的数据必须使用PreparedStatement,因为Blob类型的数据无法使用字符串拼写
    public void testInsertBlob() throws ClassNotFoundException, SQLException, FileNotFoundException {
        String sql = "INSERT INTO customers(name, email, birth, picture)"
                + "VALUES(?,?,?,?)";
        String driverClass = "com.mysql.jdbc.Driver";
        String jdbcurl = "";
        Class.forName(driverClass);
        Connection connection = DriverManager.getConnection(jdbcurl,"user","password");
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        InputStream inputStream = new FileInputStream("picture.jpg");
        preparedStatement.setBlob(4,inputStream);
        preparedStatement.executeUpdate();

        preparedStatement.close();
        connection.close();
    }

    // 读取图片
    // 读取blob数据:
    // 1. 使用getBlob方法读取到Blob对象
    // 2.调用Blob的getBinaryStream()方法得到输入流。再使用IO操作即可
    public void readBlob() throws ClassNotFoundException, SQLException, IOException {
        String sql = "SELECT id, name customerName, email, birth, picture "
                + "FROM customers WHERE id = 13";
        String driverClass = "com.mysql.jdbc.Driver";
        String jdbcurl = "";
        Class.forName(driverClass);
        Connection connection = DriverManager.getConnection(jdbcurl,"user","password");
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        ResultSet resultSet = preparedStatement.executeQuery();
        if(resultSet.next()){
            int id = resultSet.getInt(1);
            String name = resultSet.getString(2);
            String email = resultSet.getString(3);
            Blob picture = resultSet.getBlob(5);

            InputStream in = picture.getBinaryStream();

            OutputStream out = new FileOutputStream("newPicture.jpg");
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = in.read(buffer)) != -1){
                out.write(buffer,0,len);
            }
            in.close();
            out.close();
        }
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }    
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JDBC 获取插入记录的主键值(9)

    桑鱼
  • Java基础:五、this关键字、static含义(4)

    如果只有一个peel()方法,如何知道是被a还是b所调用的呢?因为编译器会把“所操作对象的引用”作为第一次参数传递给peel()。所以上述两个方法的调用就变成了...

    桑鱼
  • 【mac环境】查看JDK默认安装路径

    桑鱼
  • CSS选择器

    在模块定义不太稳定的阶段,浏览器会采用厂商前缀实现某个特性。它允许早起采纳者试用浏览器实现的新属性。

    奋飛
  • ssh技巧之socks代理

    在上一篇文章 ssh技巧之端口转发 中我们讨论了两种端口转发策略,分别是 local port forwarding 和 remote port forward...

    wangyuntao
  • flask bootstrap-flask 渲染表单(flask 35)

    from flask_bootstrap import Bootstrap app = Flask('sayhello') bootstrap = Boot...

    用户5760343
  • 4 步改进IT服务视角的CMDB数据质量

    从IT服务视角来看,CMDB中不准确的配置项(Configration Item,后续简称“CI”)数据可能会延缓事件解决效率并降低变更质量。I&O领导人必须解...

    boypoo
  • 正则表达式使用总结

    \xnn :匹配ASCII代码中十六进制代码为nn的字符, 4e00 - 9fa5 是中文编码

    solate
  • Hdfs的DN节点数据磁盘大小不均衡如何处理

    这是一篇历史文章,貌似16还在负责做集群的时候遇到并解决的一问题。之所以发出来是因为感觉比较实用,自从公众号迁移之后,历史文章不能搜索了,所以浪尖每隔一段时间,...

    Spark学习技巧
  • Django+xadmin打造在线教育平台(三)

    代码 github下载 五、用户注册 主要实现功能 用户输入邮箱、密码和验证码,点注册按钮 如果输入的不正确,提示错误信息 如果正确,发送激活邮件,用户...

    zhang_derek

扫码关注云+社区

领取腾讯云代金券