JAVA学习笔记——BLOB类型和数据批量操作
写在开头:本文是学习尚硅谷JavaWeb的个人笔记,便于自己后期复习,也供各位参考评论,指出错误共同进步。
主要内容
- 1 MySQL BLOB 类型
- 1.1 向数据表中插入Blob类型数据
- 1.2 从数据表中读入Blob类型数据
- 2 使用PreparedStatement实现批量数据的操作
- 2.1 进阶一
- 2.2 进阶二
- 2.3 层次三
1 MySQL BLOB 类型
- MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。
- MySQL的四种BLOB类型(除了在存储的最大信息量上不同外,他们是等同的)。
- 实际使用中根据需要存入的数据大小定义不同的BLOB类型。需要注意的是:如果存储的文件过大,数据库的性能会下降。
1.1 向数据表中插入Blob类型数据
package com.atguigu5.blob;import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;import org.junit.Test;import com.atguigu3.util.JDBCUtils;public class BlobTest {//向数据表customer中插入Blob类型的字段@Testpublic void tesrInsert() 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, "lin@qq.com");ps.setObject(3, "1992-06-08");//大的数据一般用流来操作FileInputStream is = new FileInputStream(new File("playgirl.jpg"));ps.setBlob(4, is);ps.execute();JDBCUtils.closeResource(conn, ps);}
}
运行结果:
1.2 从数据表中读入Blob类型数据
@Testpublic void testQuery(){Connection conn = null;PreparedStatement ps = null;InputStream is = null;FileOutputStream fos = null;ResultSet rs = null;try {conn = JDBCUtils.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(1);// String name = rs.getString(2);// String email = rs.getString(3);// Date birth = rs.getDate(4);//方式二: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("zhangyuhao.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();}JDBCUtils.closeResource(conn, ps, rs);}}
2 使用PreparedStatement实现批量数据的操作
2.1 进阶一
普通的向数据库中一条一条插入数据(填充一次占位符,我们就执行一次,效率太低)
package com.atguigu5.blob;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;import org.junit.Test;import com.atguigu3.util.JDBCUtils;/** 使用PreparedStatement实现批量数据的操作* * update、delete本身就具有批量操作的效果。* 此时的批量操作,主要指的是批量插入。使用PreparedStatement如何实现更高效的批量插入?* * 题目:向goods表中插入20000条数据* 在SQLyong里面创建新表* CREATE TABLE goods(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(25)*/
public class InsertTest {//批量插入的方式二:使用PreparedStatement@Testpublic void testInsert1() {Connection conn=null;PreparedStatement ps=null;try {long start = System.currentTimeMillis();conn = JDBCUtils.getConnection();String sql = "insert into goods(name)values(?)";//这里只增加名字,id是自增长ps = conn.prepareStatement(sql);for(int i =1;i<=2000;i++) {ps.setObject(1, "name_"+1);ps.execute();//填充一次占位符,我们就执行一次效率太低}long end = System.currentTimeMillis();System.out.println("花费的时间为:" + (end - start));//花费的时间为:81426}catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {JDBCUtils.closeResource(conn, ps);}}
}
2.2 进阶二
(填充一次占位符,我们就执行一次,效率太低,进阶二便多填充几次占位符(这里是500次),再去执行一次,效率在一定程度上得以提高)。
官方语言: 当需要成批插入或者更新记录时。可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率
- JDBC的批量处理语句包括下面两个方法:
addBatch(String): 添加需要批量处理的SQL语句或是参数;
executeBatch(): 执行批量处理语句;
clearBatch(): 清空缓存的数据
更新驱动方法:之前我们使用的是1.7的驱动已经加载好了,现在复制1.37的驱动进去需要重新记载
1、在先在项目上右键Build Path->configure Build Path,在Libraries中找到1.7的驱动,remove后点击ok。
2、现在右击刚复制进来的1.37驱动,Build Path-> add to Build Path。
//方式二 /** 批量插入的方式二:* 1.addBatch()、executeBatch()、clearBatch()* 2.mysql服务器默认是关闭批处理的,我们需要通过一个参数,让mysql开启批处理的支持。* ?rewriteBatchedStatements=true 写在配置文件的url后面(配置文件就是之前我们写的jdbc.properties文件)* 3.使用更新的mysql 驱动:mysql-connector-java-5.1.37-bin.jar*/@Testpublic void testInsert2() {Connection conn = null;PreparedStatement ps = null;try {long start = System.currentTimeMillis();conn = JDBCUtils.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,"攒"到500次ps.addBatch();if(i % 500 == 0){//2.执行batchps.executeBatch();//每获取500条是都会提交一次//3.清空batchps.clearBatch();}}long end = System.currentTimeMillis();System.out.println("花费的时间为:" + (end - start));//20000:83065 -- 565} catch (Exception e) { //1000000:16086e.printStackTrace();}finally{JDBCUtils.closeResource(conn, ps);}}
2.3 层次三
(虽然执行了,但我们不提交。设置不允许自动提交数据到数据库,执行完之后一起提交,能在一定程度上提高速率)
//批量插入的方式四:设置连接不允许自动提交数据@Testpublic void testInsert3() {Connection conn = null;PreparedStatement ps = null;try {long start = System.currentTimeMillis();conn = JDBCUtils.getConnection();//设置不允许自动提交数据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."攒"sqlps.addBatch();if(i % 500 == 0){//2.执行batchps.executeBatch();//3.清空batchps.clearBatch();}}//统一提交数据conn.commit();long end = System.currentTimeMillis();System.out.println("花费的时间为:" + (end - start));//20000:83065 -- 565} catch (Exception e) { //1000000:16086 -- 5114e.printStackTrace();}finally{JDBCUtils.closeResource(conn, ps);}}
JAVA学习笔记——BLOB类型和数据批量操作相关推荐
- Java 学习笔记 - 数组类型互转
Java 学习笔记 - 数组类型互转 数组类型转换 字符串数组 to (Integer.Long.Double)列表 传统方式 Java8 Stream方式 数组 to 数组 字符串数组 to (in ...
- thinking in java 学习笔记 14 类型信息
第十四章 类型信息 尼玛,刚刚看完了亚冠,恒大这样都被连扳3球,尼玛的垃圾孙祥,恨死了那个全北现代 好吧,回到学习上 运行时类型信息使得你可以再程序运行时发现和使用类型信息 本章讨论的是java如何让 ...
- Java学习笔记---字符类型
一.字符类型也算是整数类型的一种 字符类型在内存中占有2个字节,可以用来保存英文字母等字符.计算机处理字符类型时,是把这些字符当成不同的整数来看待,因此,严格说来,字符类型也算是整数类型的一种(小写a ...
- 【Java学习笔记七】常用数据对象之数组
同一般的对象创建和定义一样,数组的定义和创建可以分开进行也可以合并一起进行. 一维数组定义格式: <元素类型>[] <数组名>;//[]也可以放在数组名的后面 一维数组创建格式 ...
- 【Java学习笔记六】常用数据对象之String
字符串 在Java中系统定义了两种类型的字符串类:String和StringBuffer String类对象的值和长度都不能改变,称为常量字符串类,其中每个值称为常量字符串. StringBuffer ...
- Java学习笔记 --- 字符类型
一.字符类型 字符类型可以表示单个字符,字符类型是char, char是两个字节(可以存放汉字),多个字符我们用字符串String. public class Char01 {public stati ...
- Java学习笔记 --- 布尔类型
一.布尔类型 1.布尔类型也叫boolean类型,boolean类型数据只允许取值true和false,无null public class Bool {public static void main ...
- Java学习之double类型数据比较
Java学习之double类型数据比较 对于两个double类型的数据,是不能直接用==来比较是否相等 double a=1.01; double b=1.01; if(b==a){System.ou ...
- Java学习笔记(十)--控制台输入输出
输入输出 一.控制台输入 在程序运行中要获取用户的输入数据来控制程序,我们要使用到 java.util 包中的 Scanner 类.当然 Java 中还可以使用其他的输入方式,但这里主要讲解 Scan ...
- java学习笔记16--I/O流和文件
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input Output)流 IO流用来处理 ...
最新文章
- 【java】巨菜博主安装jdk为什么每次都失败?
- php管理员登录文件,使用PHP文件重置管理员密码(Drupal 8)
- 8.3. 测试 opensips
- oracle10g检测未通过,win64bit安装oracle 10g版本检查未通过解决 提示要求的结果: 5.0,5.1,5.2,6.0 之一 实际结果: 6.1...
- 设置TDSAuthenticationManager属性对DataSnap服务端的接口授权
- 电商Sass平台-商城运营后台原型-仓储管理-订单管理-店铺运营-采购管理-数据分析-交易分析-留存分析-客户管理-用户运营-围栏管理-商品管理-流量分析-电商erp后台管理-用户权限-销量分析
- 机器学习-吴恩达-笔记-6-应用机器学习的建议
- 服务器负载不高 响应慢_通俗易懂的讲透:负载均衡的原理
- C++--第15课 - 惊艳的继承
- Element UI踩坑记 —— el-table中 formatter 的属性居然失效了
- PAIP.MYSQL数据库比较VC313.TXT
- 如何编写高质量的程序
- hadoop安装常见问题
- 【Windows】win10如何拦截弹窗?
- Longest Common Subsequence
- mysql安装2503,无法安装msi格式软件提示错误代码2502、2503怎么办?
- Deep Anomaly Detection with Deviation Networks论文阅读
- [每日100问][2011-10-11]iphone开发笔记,今天你肿了么
- 李宏毅2021年机器学习笔记———卷积神经网络
- 计算机音乐制作专业大纲,电脑音乐制作教学大纲1.doc
热门文章
- iphone手机投射到电脑的过程详解
- Python 读文件只读了一部分的问题解决
- 构造可以使n个城市连接的最小生成树—C语言实现
- 群晖Docker套件注册Harbor私有镜像仓库,并下载运行自己发布的Docker镜像
- win10下Linux子系统(ubuntu)开启并配置(shell主题,设置中文环境,图形界面...)
- node.js(二 --- events 、buffer、)
- linux 怎么临时修改ip,linux中临时、永久修改ip(示例代码)
- 如何预防计算机病毒英语作文,电脑病毒的英文作文
- Outlier Detection Based on Fuzzy Rough Granules in Mixed Attribute Data论文精读
- Java8新特性(三) – 流式数据处理