JDBC 对Blob数据类型的操作以及大批量插入数据

对Blob数据类型的操作

/**
 * @Auther: Alex
 * @Date: 2020/12/26 - 12 - 26 -23:28
 * @Description: 测试使用ProparedStatement操作Blob类型的数据
 * @Verxion: 1.0
 */
public class BlobTest1 {
    //向customers中插入Blob类型的字段
    @Test
    public void test1() throws Exception {
        Connection conn = JDBCUtils.getConnection();
        String sql = "insert into customers(`name`,email,birth,photo)values(?,?,?,?)";

        PreparedStatement ps = conn.prepareStatement(sql);

        ps.setObject(1,"王杰");
        ps.setObject(2,"wangjie@gmail.com");
        ps.setObject(3,"1980-01-01");
        //插入Blob类型的数据
        FileInputStream is = new FileInputStream(new File("王杰.jpg"));
        ps.setBlob(4,is);

        //执行
        ps.execute();

        //关闭资源
        is.close();
        JDBCUtils.closeResource(conn,ps);
    }

    @Test
    public void test2() throws Exception {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        InputStream is = null;
        FileOutputStream fos = null;
        try {
            conn = JDBCUtils.getConnection();
            String sql = "select id,`name`,email,birth,photo from customers where id = ?";
            ps = conn.prepareStatement(sql);
            ps.setInt(1,19);

            rs = ps.executeQuery();
            if(rs.next()){
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String email = rs.getString("email");
                Date birth = rs.getDate("birth");

                Customer cust = new Customer(id,name,email,birth);
                System.out.println(cust);

                //将Blob类型的字段下载下来,以文件的方式保存
                Blob photo = rs.getBlob("photo");
                is = photo.getBinaryStream();
                fos = new FileOutputStream("王杰2.jpg");

                byte[] byteBuffer = new byte[1024];
                int len;
                while ((len = is.read(byteBuffer)) != -1){
                    fos.write(byteBuffer,0,len);
                }

            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            is.close();
            fos.close();
            JDBCUtils.closeResource(conn,ps,rs);
        }


    }
}

大批量插入数据

/**
 * @Auther: Alex
 * @Date: 2020/12/27 - 12 - 27 -18:03
 * @Description: BlobTest
 * @Verxion: 1.0
 */

/*
使用PreparedStatement实现批量的操作
说明:
1、update、delete 本身就具有批量操作的效果
2、此时的批量操作,主要是批量插入,使用preparedStatement
   如何实现更高效的批量插入
*/
public class InsertTest {
    /*向goods表中插入20000条数据
    方式一:使用statement
    Connection conn = JDBCUtils.getConnection();
    Statement st = conn.CreateStatement();
    for(int i = 1;i <= 20000;i++){
        String sql = "insert into goods(name) values ('name_"+ i +"')"
        st.execute(sql);
    }
     */
    //方式二:使用preparedStatement
    @Test
    public void test() throws Exception {
        long start = System.currentTimeMillis();
        Connection conn = JDBCUtils.getConnection();
        String sql = "insert into goods (name) values (?)";
        PreparedStatement ps = conn.prepareStatement(sql);
        for (int i = 0; i < 20000; i++) {
            ps.setObject(1,"naem_" + i);
            ps.execute();
        }
        JDBCUtils.closeResource(conn,ps);
        long end = System.currentTimeMillis();
        System.out.println(end - start);
    }

    /*方式三:
    1、addBatch():
    2、executeBatch()
    3、clearBatch()

    注意:
    1、mysql默认情况是关闭批处理的,我们需要通过一个参数,让mysql开启批处理支持
    2、 ?rewriteBatchedStatements=true写在配置文件的url后面
    3、使用更新的mysql驱动,导入jar包
     */
    @Test
    public void test2() throws Exception {
        long start = System.currentTimeMillis();
        Connection conn = JDBCUtils.getConnection();
        String sql = "insert into goods (name) values (?)";
        PreparedStatement ps = conn.prepareStatement(sql);
        for (int i = 0; i < 200000; i++) {
            ps.setObject(1,"naem_" + i);
            //1、addBatch():积攒 sql 语句
            ps.addBatch();
            //2、executeBatch():执行积攒的 sql 语句
            if(i % 1000 == 0){
                ps.executeBatch();
                //3、清空积攒的 sql 语句
                ps.clearBatch();
            }
        }
        JDBCUtils.closeResource(conn,ps);
        long end = System.currentTimeMillis();
        System.out.println(end - start);
    }

    /*
    方式四:设置不允许自动提交数据

     */
    @Test
    public void test3() throws Exception {
        long start = System.currentTimeMillis();
        Connection conn = JDBCUtils.getConnection();

        //设置不允许自动提交数据
        conn.setAutoCommit(false);

        String sql = "insert into goods (name) values (?)";
        PreparedStatement ps = conn.prepareStatement(sql);
        for (int i = 0; i < 200000; i++) {
            ps.setObject(1,"naem_" + i);
            //1、addBatch():积攒 sql 语句
            ps.addBatch();
            //2、executeBatch():执行积攒的 sql 语句
            if(i % 1000 == 0){
                ps.executeBatch();
                //3、清空积攒的 sql 语句
                ps.clearBatch();
            }
        }

        //统一提交数据
        conn.commit();
        JDBCUtils.closeResource(conn,ps);
        long end = System.currentTimeMillis();
        System.out.println(end - start);
    }
}

热门文章

编程学习 ·

IBM分布式深度学习平台FfDL了解

IBM的分布式深度学习平台FfDL(Fabric for Deep Learning) 是用于分布式深度学习模型训练,基于微服务的平台。用户通过提交深度学习作业到已部署FfDL的服务器集群或者云上来进行训练。方便了拥有服务器集群的大型公司或机构进行深度学习硬件资源的调度管理。FfDL会自动调度用户…
编程学习 ·

python从入门到放弃篇8(while True的使用,列表,if嵌套)实现选举小程序

今天,我又开始了新的征程,开始学习Java,但是老本不能忘,所以,我打算先把python的全套入门到放弃做完,再开始Java的新篇章,我刚刚装了Java的Esclipe编辑器全英文,还不太适应,过一段时间,慢慢熟悉,应该就会好起来了。路一步步走,饭一口口吃。 while循环,我是很喜欢的…
编程学习 ·

MySQL 简洁速查手册

MySQL 速查手册 文章目录MySQL 速查手册0. 前言1. 开启/关闭数据库2. 数据库操作3. 数据表操作4. 字段操作5. 数据操作6. 运算符7. 高级查询(group by、having、order by、limit)8. 高级插入9. 高级删除10. 高级更新11. 联合查询12. 连接查询12.1 左外连接12.2 右外连接13. 子查…
编程学习 ·

学习Java第十六天

Java多态(下) 接口 接口定义了某一批类所要遵守的规范,接口不关心这些类的内部数据,页不关心这些类里方法的实现细节,它只规定这些类里必须提供某些方法 语法: [修饰符] interface 接口名 [ extends 父接口1,父接口2...] {零到多个常量定义...零到多个抽象方法的定义...零…
编程学习 ·

Unity的学习(二):打砖块

一、新建项目创建成功后,进入了如下界面。二、场景的设计 在Hierarchy中鼠标右键创建Plane(地面)游戏物体,将其Transform组件重置,并将游戏物体重命名为Ground,如下图所示。调整地面的大小。在Assets下创建文件夹Materials,并在其中创建Ground的Material(材质)并在Gro…
编程学习 ·

人脸活体离线识别摇头点头张嘴眨眼动作活体算法源码解析

活体识别要求最近我们公司的项目需要做一个活体识别的功能,要求如下: 1.离线识别,本地识别活体,这样速度快1s内完成。需要识别出人脸,并判断是否在摇头 ,点头,张嘴,眨眼等动作,进而判断是否活体,准确率要求90%即可,可以去破解相信没有任何一个项目能完全规避的,哪怕…
编程学习 ·

Spring核心源码学习笔记-01-XmlFactory

引言最基本的例子,创建一个xmlBeanFactory创建过程中,xmlBeanFactory会对资源文件进行解析,完成beanFactory创建。xmlBeanFactory继承机构:正式开始解析流程:初始化成员变量:XmlBeanDefinitionReader,并传入当前对象,作用于读取资源文件调用方法: this.reader.loadBean…
编程学习 ·

基于jupyter notebook的python编程-----Win10通过OpenCv-3.4.1进行人脸口罩数据集的模型训练并进行戴口罩识别检测

基于jupyter notebook的python编程-----Win10通过OpenCv-3.4.1进行人脸口罩数据集的模型训练并进行戴口罩识别检测目录一、OpenCv的下载及安装1、OpenCv的下载2、OpenCv的安装3、查看是否具有模型训练环境二、人脸口罩数据集的下载及处理1、人脸口罩数据集下载2、数据集重命名为…
编程学习 ·

windows10系统-3-安装mysql8

(1)下载地址 https://dev.mysql.com/downloads/mysql/ mysql-8.0.19-winx64.zip (2)解压到D:\mysql-8.0.19-winx64 (3)在mysql-8.0.19-winx64文件夹下面新建一个my.ini文件和一个data文件夹 (4)文件my.ini中的内容 [mysqld] #设置3306端口 port=3306 #设置mysql的安装目录 base…
编程学习 ·

安装JDK

安装JDK 前提 要准备好jdk的包:jdk-8uxxx-linux-x64.tar.gz //JAVA 8 版本都可以 笔者这里使用的171 下载地址:Java SE 8 存档下载. 步骤 一、 解压jdk:tar -zxvf jdk-8u171-linux-x64.tar.gz二、 设置环境变量,编辑文件添加如下: vi /etc/profile export JAVA_HOME=/us…
编程学习 ·

五篇机器阅读理解论文(Match-LSTM+Ptr,DCN,R-Net,QANet)介绍

以close-domain为例,MRC任务就是给定一篇文章和一些与文章相关的问题,要求模型给出问题的答案 MRC按照问答的形式不同大致可以分成四种任务填空型 多项选择型 片段抽取型 自由答案型首先来看一看数据集 填空型问答 所谓填空型问答是指给定一篇文章和一个缺失某个单词的句子作…
编程学习 ·

Leetcode 349. 两个数组的交集 C++

Leetcode 349. 两个数组的交集 题目 给定两个数组,编写一个函数来计算它们的交集。 测试样例 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2]示例 2: 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4]说明:输出结果中的每个元素一定是唯一的。 我们可以…
编程学习 ·

java常用面试题——笔试选择题解析

1.以下关于 abstract 关键字的说法,正确的是(D)。 A.abstract 可以与 final 并列修饰同一个类。 B.abstract 类中不可以有 private 的成员。 C.abstract 类中必须全部是 abstract 方法。 D.abstract 方法必须在 abstract 类或接口中。解析: final的类不能被重写和继承;而a…
编程学习 ·

B 1065 单身狗(散列的应用)

题目思路 这题明明写的是200ms要求,但可以暴力破解,这是我万万没想到的- -; 散列记录夫妻,hash【id】=cpid; 再用一个散列记录到场; 之后暴力破解遍历0~100001; 测试点3:注意00000的输出,有格式要求,不能输出成0; AC代码 #include<bits/stdc++.h> using names…
编程学习 ·

Golang语言基础教程:函数的返回值

函数的返回值1.1 什么是函数的返回值一个函数被调用后,返回给调用处的执行结果,叫做函数的返回值。调用处需要使用变量接收该结果1.2 一个函数可以返回多个值一个函数可以没有返回值,也可以有一个返回值,也可以有返回多个值。package main ​ import "fmt" ​ fu…
编程学习 ·

IDL中,删除临时生成的txt文件

当对很多个文件进行循环操作计算某些结果时,在这个过程中可能需要输出一些中间结果,但是在进行第二次循环时我就希望这些中间结果可以没有,不然我就无法继续计算。 因为我用了 /append参数,所以这个文件不能被清空重新写入新的结果,只能在原结果后面继续写入。 这个时候就…
编程学习 ·

re表达式

校验数字的表达式校验字符的表达式特殊需求表达式