概述
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类型数据所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复