最近遇到一个新需求,需要将视频图片等数据存到数据库中方便业务调用,研究测试了一下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方法即可将二进制数据存入库中。

更多推荐