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

JDBC_2Blob数据类型和批量操作「建议收藏」JDBC Blob数据类型PreparedStatement操作Blob类型数据Blob是一个二进制大型对象Statement不能操作Blob数据类型,以为Blob数据类型是无法使用字符串拼接的,PreparedStatement可以操作Blob数据类型插入Blob //插入Blob String sql = “insert into customers(name,email,birth,photo) values(?,?,?,?)”; java.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

JDBC Blob数据类型


PreparedStatement操作Blob类型数据

Blob是一个二进制大型对象

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


        //插入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

//查询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开启批处理的支持。

//批量插入
        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.net/168822.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 3G中的TDD与FDD

    3G中的TDD与FDD在现有的3G有三大主流技术标准:WCDMA、CDMA2000和TD-SCDMA,虽然它们都属于CDMA技术,但是从它们的主要应用方面可分为两类:WCDMA、CDMA2000属于FDD标准;而TD-SCDMA属于TDD标准。另外,3.5G的HSDPA系统中兼有FDD和TDD,而4G的前驱MobileWiMAX兼有TDD、FDD、半双工FDD。国际上给WCDMA分的…

    2022年5月4日
    50
  • android开发笔记之SwipeRefreshLayout

    android开发笔记之SwipeRefreshLayoutSwipeRefreshLayout简介SwipeRefrshLayout是Google官方更新的一个控件,可以实现下拉刷新的效果,该控件集成自ViewGroup在support-v4兼容包下.在android源码中,主要是在联系人界面刷新联系人数据:packages/apps/Contacts/src/com/android/contacts/list/DefaultContactBrow…

    2022年6月25日
    27
  • QQ强制聊天工具,教你如何强制用QQ与陌生人聊天

    QQ强制聊天工具,教你如何强制用QQ与陌生人聊天

    2021年8月13日
    486
  • sql语句字符串用单引号还是双引号_sql什么时候用单引号

    sql语句字符串用单引号还是双引号_sql什么时候用单引号总结一下SQL语句中引号(‘)、quotedstr()、(”)、format()在SQL语句中的用法以及SQL语句中日期格式的表示(#)、(”)在Delphi中进行字符变量连接相加时单引号用(”’),又引号用(””)表示首先定义变量varAnInt:integer=123;//为了方便在此都给它们赋初值。虽然可能在引赋初值在某些情况下不对AnIntStr:string=’45…

    2022年8月31日
    4
  • 完美解决:针对tensorflow中,tf.logging.set_verbosity(tf.logging.ERROR)问题。

    完美解决:针对tensorflow中,tf.logging.set_verbosity(tf.logging.ERROR)问题。tf.logging.set_verbosity(tf.logging.ERROR)代码作用:让tensorflow只讲错误信息进行记录。因为Tensorflow2.0移除了一些API,其中就包括logging属性。所以如果你用tensorflow2.0的话,请参考下文解决。解决方法:将此代码更换为:tf.compat.v1.logging.set_verbosity(tf.compat…

    2025年6月14日
    3
  • CPU核数和load average的关系「建议收藏」

    CPU核数和load average的关系「建议收藏」在前面的文章《Linux系统监控——top命令》中我简单提到了,判断loadaverage的数值到底大不大的判断依据,就是数值除以CPU核数,大于5,就说明超负荷运转了。——这里其实不太严谨今天这篇文章来仔细分析分析,CPU和loadaverage的关系。转载文章一我们知道判断一个系统的负载可以使用top,uptime等命令去查看,它分别记录了一分钟、五分钟、以及十五分钟的系统…

    2022年7月17日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号