JDBC_2Blob数据类型和批量操作「建议收藏」

2022-09-21 08:29:50 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

JDBC Blob数据类型


PreparedStatement操作Blob类型数据

Blob是一个二进制大型对象

Statement不能操作Blob数据类型,以为Blob数据类型是无法使用字符串拼接的,PreparedStatement可以操作Blob数据类型 插入Blob

代码语言:javascript复制
        //插入Blob
        String sql = "insert into customers(name,email,birth,photo) values(?,?,?,?)";
        java.sql.PreparedStatement ps = connection.prepareStatement(sql);
        ps.setObject(1,"张宇豪");
        ps.setObject(2,"zhang@qq.com");
        ps.setObject(3,"1992-09-08");
        FileInputStream fileInputStream = new FileInputStream(new File("play.jpg"));
        ps.setBlob(4,fileInputStream);
        ps.execute();
        ps.close();
        connection.close();

查询Blob

代码语言:javascript复制
//查询Blob
        String sql = "select id,name,birth,photo from customers where id = ?";
        java.sql.PreparedStatement ps = connection.prepareStatement(sql);
        ps.setInt(1,2);
        ResultSet resultSet = ps.executeQuery();
        if(resultSet.next()){ 
   
            int id = resultSet.getInt(1);
            String name = resultSet.getString(2);
            String email = resultSet.getString(3);
            Date birth = resultSet.getDate(4);
            Blob photo = resultSet.getBlob(5);

            //将Blob类型的字段下载下来,以文件的方式保存在本地
            InputStream is = photo.getBinaryStream();
            FileOutputStream fos = new FileOutputStream("zhangyuhao.jpg");
            byte[] buffer = new byte[1024];
            int len;
            while ((len = is.read(buffer)) != -1){ 
   
                fos.write(buffer,0,len);
            }
        }

        ps.execute();
        ps.close();
        connection.close();

批量操作(主要指插入) PreparedStatement比Statement效率更高 原因:DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行,而数据库不会对Statement语句进行缓存

进一步优化: addBatch()方法 executeBatch() clearBatch()(和缓存的原理差不多) 注意:默认情况下mysql服务器默认是关闭批处理的,我们需要通过一个参数,让mysql开启批处理的支持。

代码语言:javascript复制
//批量插入
        String sql = "insert into goods(name) values(?)";
        java.sql.PreparedStatement ps = connection.prepareStatement(sql);
        for(int i = 1;i <= 20000;i   ){ 
   
            ps.setObject(1,"name_"   i);
            ps.addBatch();
            
            if(i % 500 == 0){ 
   
                ps.execute();
                ps.clearBatch();
            }
            
        }

进一步优化 设置connection.setAutoCommit(false),最后等所有sql语句执行完统一commit(相当于所有的语句都缓存起来了)。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168822.html原文链接:https://javaforall.cn

0 人点赞