最近遇到一个新需求,需要将视频图片等数据存到数据库中方便业务调用,研究测试了一下MySQL和华为高斯库(DWS库,基于PostgreSQL)的相应解决方案(业务用到这两个数据库,故目前只测试了这两种),予以记录。
1、MySQL
MySQL中有存储此类数据对应的数据类型tinyblob、blob、mediumblob、longblob,这四种类型的区别在于最大存储空间的区别,按需选择即可。
建好表,设置好字段类型后直接上代码:
public static void insertData(String s, byte[] bytes) {
Connection conn = null;
PreparedStatement ps = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.
getConnection(
"jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8",
"root", "admin");
ps = conn.prepareStatement("insert into te2 (id, name) values (?, ?)");
ps.setString(1, s);
// 数据库类型为MediumBlob,可以直接按byte[]类型处理
ps.setBytes(2, bytes);
// 两种方法作用相同
// FileInputStream fileInputStream =
// new FileInputStream(
// new File("C:\\Users\\Administrator\\Pictures\\f31fbe096b63f624812951928744ebf81a4ca32f.jpg"));
// ps.setBlob(2, fileInputStream);
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (ps != null) {
ps.close();
}
} catch (Exception e1) {
e1.printStackTrace();
} finally {
try{
if(conn != null){
conn.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
需要注意的是预编译语句中的参数设置方法使用setBytes或者setBlob都可以,只是不同的方法使用的时候需要将参数类型作以改变。
2、DWS(GaussDB)
DWS中存储此类数据对应的数据类型选择bytea。虽然高斯库中也有blob类型和raw类型可选,但是官方文档中也说明了这两种数据类型不支持列存储。
建表完成后同样用代码操作即可。PS:此处不再放冗余代码,异常需自行处理:
Connection conn = DruidUtil.getConnection();
File file = new File("D:\\test\\1.bmp");
FileInputStream fis = new FileInputStream(file);
PreparedStatement ps = conn.prepareStatement("insert into test_schema.test_t1(id, value) values (?, ?)");
ps.setString(1, "t1");
ps.setBinaryStream(2, fis);
ps.executeUpdate();
fis.close();
ps.close();
conn.close();
使用setBinaryStream方法即可将二进制数据存入库中。