JDBC-day03(BLOB类型字段,批量插入)

news2024/9/24 11:21:25

四:操作BLOB类型字段

1.MySQL BLOB类型

  • 在MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。可以用来存储图片,视频等

  • 插入BLOB类型的数据必须使用PreparedStatement,因为BLOB类型的数据无法使用字符串拼接写的。

  • MySQL的四种BLOB类型(除了在存储的最大信息量上不同外,他们是等同的)
    在这里插入图片描述

  • 实际使用中根据需要存入的数据大小定义不同的BLOB类型。

  • 如果在指定了相关的Blob类型以后,还报错:xxx too large,那么在mysql的安装目录下,找my.ini文件加上如下的配置参数: max_allowed_packet=16M。同时注意:修改了my.ini文件之后,需要重新启动mysql服务。

2.向数据表customer中插入Blob类型的字段

public class BlobTest {
	@Test
	public void testInsert() throws Exception {
		Connection conn = null;                          
		PreparedStatement ps = null;
		try {
			conn = JDBC_Utils.getConnection();
			String sql = "insert into customers(name,email,birth,photo)values(?,?,?,?)";
			
			ps = conn.prepareStatement(sql);
			
			ps.setObject(1, "张杰");
			ps.setObject(2, "ZhangJie@168.com");
			ps.setObject(3, "1992-09-08");
			FileInputStream is = new FileInputStream(new File("zhangjie.jpg"));
			//如果文件大于1MB,可能会报xxx too large错误,解决方法参照上面的解决方式
			ps.setBlob(4, is);
			
			ps.execute();
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBC_Utils.closeResource(conn, ps);
		}
			
	}
}

注:在工作目录下要有zhangjie.jpg,否则会提示找不到文件

3.查询数据表customer中的Blob字段

	@Test
	public void testQuery(){
		Connection conn = null;      
		PreparedStatement ps = null;
		ResultSet rs = null; 
		InputStream is = null;
		FileOutputStream fos = null;
		try { 
			conn = JDBC_Utils.getConnection();
			String sql = "select id,name,email,birth,photo from customers where id = ?"; 
			ps = conn.prepareStatement(sql);
			ps.setInt(1,21);
			
			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 customer = new Customer(id,name,email,birth);
				System.out.println(customer); 
				
				//将Blob类型的字段下载下来,以文件的形式保留到本地
				Blob photo = rs.getBlob("photo");
				is = photo.getBinaryStream();
				fos = new FileOutputStream("singer.jpg");
				byte[] buffer = new byte[1024];
				int len;
				while((len = is.read(buffer)) != -1) { 
					fos.write(buffer, 0, len);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try { 
				if(is != null) 
					is.close(); 
			} catch (IOException e) {
				e.printStackTrace();
			}
			try { 
				if(fos != null) 
					fos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			JDBC_Utils.closeResource(conn, ps, rs); 
		
		}
		
	}

五:批量插入

1.批量操作

当需要成批插入或者更新记录时,可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率

JDBC的批量处理语句包括下面三个方法:

  • addBatch(String):添加需要批量处理的SQL语句或是参数;
  • executeBatch():执行批量处理语句;
  • clearBatch():清空缓存的数据

通常我们会遇到两种批量执行SQL语句的情况:

  • 多条SQL语句的批量处理;
  • 一个SQL语句的批量传参;

2.高效的批量插入

  • 使用PreparedStatement实现批量数据操作
  • update,delete本身就具有批量操作的效果
  • 此时的批量操作,主要指批量插入

例: 题目向goods表添加100万条数据

 CREATE TABLE goods(
 id INT PRIMARY KEY AUTO_INCREMENT,       
 NAME VARCHAR(25)
);
import java.sql.Connection;                                      
import java.sql.PreparedStatement;

import org.junit.Test;

import com.jdbc.util.JDBC_Utils;

public class InsertTest {
	//方式一:使用Statement批量插入数据(略)
	//方式二:使用PreparedStatement批量插入数据
	@Test
	public void testInsert1() {
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			long start = System.currentTimeMillis();
			conn = JDBC_Utils.getConnection();
			String sql = "insert into goods(name)values(?)";
			ps = conn.prepareStatement(sql);
			for(int i = 1;i <= 1000000;i++) {
				ps.setObject(1,"name_" + i);
				
				ps.execute();
			}
			long end = System.currentTimeMillis();
			System.out.println("插入花费时间为:" + (end - start) + "毫秒");//1350941毫秒---8473毫秒---5857毫秒
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBC_Utils.closeResource(conn, ps);
		}	
	}
}

方式三:使用addBatch(),executeBatch(),clearBatch()批量插入数据

  • mysql服务器默认关闭批处理,需要通过在url后添加?rewriteBatchedStatements=true来进行开启,不是mysqld的配置文件,是数据库连接的配置文件,即jdbc.properties

  • mysql驱动需要5.1.37及以上版本

    @Test
    public void testInsert2() {
    	Connection conn = null;                                                        
    	PreparedStatement ps = null;
    	try { 
    		long start = System.currentTimeMillis();
    		conn = JDBC_Utils.getConnection();
    		String sql = "insert into goods(name)values(?)"; 
    		ps = conn.prepareStatement(sql);
    		for(int i = 1;i <= 1000000;i++) {
    			ps.setObject(1,"name_" + i);
    			//1."攒"SQL
    			ps.addBatch();
    			if(i % 500 == 0) {
    				//2.执行batch
    				ps.executeBatch();
    				//3.清空batch
    				ps.clearBatch(); 
    			}
    		}
    		long end = System.currentTimeMillis();
    		System.out.println("插入花费时间为:" + (end - start) + "毫秒");
    	} catch (Exception e) {
    		e.printStackTrace();
    	}finally {
    		JDBC_Utils.closeResource(conn, ps);
    	}
    }
    
    
    

方式四:设置连接不允许自动提交数据

	@Test
	public void testInsert3() {
		Connection conn = null;          
		PreparedStatement ps = null;
		try {
			long start = System.currentTimeMillis();
			conn = JDBC_Utils.getConnection();
			//设置不允许自动提交,默认执行SQL,就自动提交到数据库
			conn.setAutoCommit(false);
			String sql = "insert into goods(name)values(?)";
			ps = conn.prepareStatement(sql);
			for(int i = 1;i <= 1000000;i++) {
				ps.setObject(1,"name_" + i);
				//1."攒"SQL
				ps.addBatch();
				if(i % 500 == 0) {
					//2.执行batch
					ps.executeBatch();
					//3.清空batch
					ps.clearBatch();
				}
			}
			//提交数据
			conn.commit();
			long end = System.currentTimeMillis();
			System.out.println("插入花费时间为:" + (end - start) + "毫秒");
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBC_Utils.closeResource(conn, ps);
		}
	}


其中可能会出现不少的小问题,请多多包含
感谢大家的支持,关注,评论,点赞!
参考资料:尚硅谷_宋红康_JDBC核心技术

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1074879.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redis,mongoDB,mysql,Elasticsearch区别

Redis&#xff1a; Redis是一种高性能键值存储数据库&#xff0c;基于内存操作&#xff0c;支持数据持久化&#xff0c;支持数据类型丰富灵活&#xff0c;如字符串、哈希、列表、集合、有序集合等。Redis还提供了订阅/发布、事务、Lua脚本、主从同步等功能&#xff0c;适用于访…

学习记忆——数学篇——案例——代数——函数——一元二次函数

记忆宫殿法 一元二次函数&#xff1a; y a x 2 b x c yax^2bxc yax2bxc a &#xff1e; 0 a&#xff1e;0 a&#xff1e;0&#xff0c;开口向上&#xff1b; a &#xff1c; 0 a&#xff1c;0 a&#xff1c;0&#xff0c;开口向下&#xff1b; x − b 2 a x-\frac{b}{2a…

2023-10-09 python-使用psd_tools-读取psd信息及导出图层图片-记录

摘要: 2023-10-09 python-使用psd_tools-读取psd信息及导出图层图片-记录 相关文档: Usage — psd-tools 1.9.28 documentation 读取psd的信息: py代码: from psd_tools import PSDImagepsd PSDImage.open(example.psd) #psd PSDImage.open(one.psd)print(psd)for layer in …

DirectX C++项目调试时报错:The FX file cannot be complied.

文章目录 遇到的问题错误排除方法经验总结 遇到的问题 在编虚拟现实的课程作业的时候&#xff0c;打算基于上一次的作业项目改一改来交&#xff0c;于是把上次项目的代码复制过来。生成解决方案的过程没有报错&#xff0c;但是在调试该项目时&#xff0c;报错内容如下图所示&a…

vulnhub_clover靶机渗透测试

clover靶机 文章目录 clover靶机信息收集ftp渗透web渗透横线移动权限提升靶机总结 靶机地址&#xff1a;https://www.vulnhub.com/entry/clover-1,687/ 信息收集 使用nmap扫描得到了很对端口&#xff0c;能用的也就是21 22 80三个端口&#xff0c;其他都是关闭的&#xff0c;全…

【开发篇】二十三、SpringBoot Admin端点指标控制以及自定义端点

文章目录 1、info端点指标控制2、health端点指标控制3、metrics端点指标控制4、自定义端点5、补充 接上篇&#xff0c;整合完SpringBoot Admin的客户端和服务端后&#xff0c;在监控页面看到信息栏是空的&#xff0c;但info端点是开放的&#xff0c;这就涉及到端点指标控制。 1…

基于ffmpeg给视频添加时间字幕

FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序&#xff0c;我们可以基于ffmpeg对视频进行各种操作。本文主要介绍基于ffmpeg给视频添加字幕&#xff0c;字幕的内容为视频所播放的时间&#xff08;故需要安装ffmpeg&#xff0c;具…

【配置vscode编写python代码并输出到外部控制台】

配置vscode编写python代码并输出到外部控制台 1、扩展中添加python插件 2、打开一个文件夹&#xff0c;在里面新建一个.py文件&#xff0c;粘贴print(‘你好啊&#xff01;’)并运行 运行结果如下: 3、点击调试点击如下图 生成launch.json&#xff0c;将console后面改成exte…

如何搭建接口自动化测试框架

接口自动化测试框架搭建 一、原理及特点 参数放在XML文件中进行管理 用httpClient简单封装一个httpUtils工具类 测试用例管理使用了testNg管理&#xff0c;使用了TestNG参数化测试&#xff0c;通过xml文件来执行case。 测试报告这里用到第三方的包ReportNG 项目组织用Maven 二、…

在MySQL中使用!=还能走索引吗?

在MySQL中使用!还能走索引吗&#xff1f; 一般情况下&#xff0c;我们会在一个索引上较多的使用等值查询或者范围查询&#xff0c;此时索引大多可以帮助我们极快的查询出我们需要的数据。 那当我们在where条件中对索引列使用!查询&#xff0c;索引还能发挥他的作用吗&#xf…

基于SSM的网上宠物店商城交易系统

基于SSM的网上宠物店商城交易系统~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 前台界面 详情界面 登录界面 管理员界面 摘要 基于SSM框架的网上宠物店商城交易系统…

Vue-1.8生命周期

Vue生命周期 一个Vue实例从创建到销毁的整个过程。 生命周期&#xff1a; 1&#xff09;创建&#xff1a;响应式数据 ->发送初始化渲染请求 2&#xff09;挂载&#xff1a;渲染数据->操作dom 3&#xff09;更新&#xff1a;数据修改&#xff0c;更新视图 4&#xf…

M4Singer CUDA error: no kernel image is available for execution on the device

操作系统Ubuntu 22.04 2060 上整合好的M4Singer&#xff0c;拷贝到Ubuntu 22.04 4060ti16G上运行报错 Traceback (most recent call last): File "data_gen/tts/bin/binarize.py", line 20, in <module> binarize() File "data_gen/tts/bin/bi…

UDP协议(UDP协议特点 UDP的报文格式 UDP的服务端和客户端代码(简单的步骤))

目录 端口号 UDP协议 UDP协议特点 UDP 无连接 UDP 面向数据报 UDP 全双工 UDP 的报文格式 什么是校验和&#xff1f; 如何基于校验和来完成数据校验呢&#xff1f; CRC算法&#xff08;循环冗余算法&#xff09; MD5算法/SHA算法&#xff08;这里只介绍MD5算…

智能AI创作系统ChatGPT详细搭建教程/AI绘画系统/支持GPT联网提问/支持Prompt应用/支持国内AI模型

一、智能AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作…

JavaScript Web APIs第五天笔记

Web APIs - 第5天笔记 目标&#xff1a; 能够利用JS操作浏览器,具备利用本地存储实现学生就业表的能力 BOM操作综合案例 js组成 JavaScript的组成 ECMAScript: 规定了js基础语法核心知识。比如&#xff1a;变量、分支语句、循环语句、对象等等 Web APIs : DOM 文档对象模型&…

ElementUI--数据表格增删改查与表单验证

一、CRUD实现 1.1 后台CRUD编写 package com.zking.ssm.controller;import com.zking.ssm.model.Book; import com.zking.ssm.service.IBookService; import com.zking.ssm.util.JsonResponseBody; import com.zking.ssm.util.PageBean; import com.zking.ssm.vo.BookFileVo;…

arm 点灯实验代码以及现象(c语言版本)

.led.h #ifndef __LED_H__ #define __LED_H__ //构建寄存器组织结构体 typedef struct {unsigned int moder; unsigned int otyper; unsigned int ospeedr;unsigned int pupdr;unsigned int idr;unsigned int odr; }gpio_t;#define GPIOE (*(gpio_t*)0x50006000) #define G…

全图化在线系统设计

Pillars是什么 Pillars是一个Serverless全图化业务托管平台。Pillars应用全图化开发模型,提供丰富的运行时组件,支持CI/CD全生命周期项目管理,具备主动式资源优化能力。 Pillars解决什么问题 当前广告系统架构采用分布式微服务的设计理念,通过服务分治实现各组织间开发、…

java基础 API Calendar类

Calendar日历类 &#xff1a; package daysreplace;import com.sun.jdi.IntegerValue;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Calendar; import java.util.Date;public class Test {public static v…