我是靠谱客的博主 幸福蜻蜓,最近开发中收集的这篇文章主要介绍Java - 【JDBC】操作Blob类型数据,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Blob测试

  • Blob类型数据的四种类型
  • 创建一张测试表
  • 向其中添加1000000条数据
  • 测试添加Blob字段数据
  • 复习BufferedInputStream的API
  • 测试获取Blob字段,下载到本地


一:Blob类型数据的四种类型

TINYBLOB (255B)

BLOB (65KB)

MEDIUMBLOB (16MB)

LONGBLOB (4GB)

二:创建一张测试表

# 创建一个User表
CREATE TABLE USER(
	uid INT(11) PRIMARY KEY,
	uname VARCHAR(25),
	uphoto MEDIUMBLOB 
)
CHARSET=utf8
ENGINE=INNODB

三:向其中添加1000000条数据

→ URL应该配置如下参数:rewriteBatchedStatements=true
import org.junit.Test;
import xyz.xx.jdbc.utils.JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * 测试批量插入语句的高效操作
 */
public class T09_BatchInsert {
    @Test
    public void testBatchInsert() throws SQLException {
        long start = System.currentTimeMillis();

        Connection conn = JDBCUtils.getConnection();
        conn.setAutoCommit(false);
        PreparedStatement ps = conn.prepareStatement("INSERT INTO user(uid,uname) VALUES(?,?)");
        for(int i=1;i<=1000000;i++){
            ps.setObject(1,i);
            ps.setObject(2,"name_"+i);
            ps.addBatch();
            if(i % 500 == 0) {
                ps.executeBatch();
                ps.clearBatch();
            }
        }
        conn.commit();
        JDBCUtils.closeResource(conn,ps);

        long end = System.currentTimeMillis();
        System.out.println("消耗时间:"+(end-start)+"ms");
    }
}

四:测试添加Blob字段数据

注意:MySQL8.0默认对Blob字段有限制为4M,可在配置文件中重新配置
在这里插入图片描述

import org.junit.Test;
import xyz.xx.jdbc.utils.JDBCUtils;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;

/**
 * 测试数据库存入和读取Blob类型数据
 */
public class T08_TestBlob {
    @Test
    public void testBlob() throws Exception {
        // 1.获取Connection连接
        Connection conn = JDBCUtils.getConnection();

        // 2.预编译SQL语句
        String sql = "INSERT INTO USER VALUES(?,?,?)";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setObject(1,1);
        ps.setObject(2,"小明");

        InputStream is = new BufferedInputStream(new FileInputStream("src/main/resources/img/img1.png"));
        ps.setBlob(3,is);

        // 3.执行
        ps.execute();

        // 4.关闭
        JDBCUtils.closeResource(conn,ps);
    }
}
  • 注意:FileInputStream底层调用的是File创建一个File对象,再对其进行操作,这里File使用的相对路径并不是以实际输出路径为准。

五:复习BufferedInputStream的API

相关文章:Java - 【IO】字节流、字符流复制

六:测试获取Blob字段,下载到本地

  • IO流获取PNG格式图片至本地时,图片会损坏;JPG格式图片不会损坏
@Test
// 可能报错点: java.sql.SQLException: Before start of result set
//          忘记将rs指针下移,即进行next判断
// PNG图片使用IO流读取到本地会被损坏,jpg格式图片不会出现该问题
//          原因未知...
public void testGetBlob() throws Exception {
    Connection conn = JDBCUtils.getConnection();
    String sql = "SELECT uphoto FROM USER WHERE uid=?";
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.setObject(1,1);
    ResultSet rs = ps.executeQuery();
    if(rs.next()) {
        Blob blob = rs.getBlob(1);
        BufferedInputStream bis = new BufferedInputStream(blob.getBinaryStream());
        BufferedOutputStream bos = new BufferedOutputStream(new
                FileOutputStream("src/main/resources/img/img1_fromDB.png"));
        byte[] bys = new byte[1024];
        int len = 0;
        while ((len = bis.read(bys)) != -1) {
            bos.write(bys, 0, len);
        }
    }
    JDBCUtils.closeResource(conn,ps,rs);
}






在这里插入图片描述

最后

以上就是幸福蜻蜓为你收集整理的Java - 【JDBC】操作Blob类型数据的全部内容,希望文章能够帮你解决Java - 【JDBC】操作Blob类型数据所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部