写在开头:本文是学习尚硅谷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类型和数据批量操作相关推荐

  1. Java 学习笔记 - 数组类型互转

    Java 学习笔记 - 数组类型互转 数组类型转换 字符串数组 to (Integer.Long.Double)列表 传统方式 Java8 Stream方式 数组 to 数组 字符串数组 to (in ...

  2. thinking in java 学习笔记 14 类型信息

    第十四章 类型信息 尼玛,刚刚看完了亚冠,恒大这样都被连扳3球,尼玛的垃圾孙祥,恨死了那个全北现代 好吧,回到学习上 运行时类型信息使得你可以再程序运行时发现和使用类型信息 本章讨论的是java如何让 ...

  3. Java学习笔记---字符类型

    一.字符类型也算是整数类型的一种 字符类型在内存中占有2个字节,可以用来保存英文字母等字符.计算机处理字符类型时,是把这些字符当成不同的整数来看待,因此,严格说来,字符类型也算是整数类型的一种(小写a ...

  4. 【Java学习笔记七】常用数据对象之数组

    同一般的对象创建和定义一样,数组的定义和创建可以分开进行也可以合并一起进行. 一维数组定义格式: <元素类型>[] <数组名>;//[]也可以放在数组名的后面 一维数组创建格式 ...

  5. 【Java学习笔记六】常用数据对象之String

    字符串 在Java中系统定义了两种类型的字符串类:String和StringBuffer String类对象的值和长度都不能改变,称为常量字符串类,其中每个值称为常量字符串. StringBuffer ...

  6. Java学习笔记 --- 字符类型

    一.字符类型 字符类型可以表示单个字符,字符类型是char, char是两个字节(可以存放汉字),多个字符我们用字符串String. public class Char01 {public stati ...

  7. Java学习笔记 --- 布尔类型

    一.布尔类型 1.布尔类型也叫boolean类型,boolean类型数据只允许取值true和false,无null public class Bool {public static void main ...

  8. Java学习之double类型数据比较

    Java学习之double类型数据比较 对于两个double类型的数据,是不能直接用==来比较是否相等 double a=1.01; double b=1.01; if(b==a){System.ou ...

  9. Java学习笔记(十)--控制台输入输出

    输入输出 一.控制台输入 在程序运行中要获取用户的输入数据来控制程序,我们要使用到 java.util 包中的 Scanner 类.当然 Java 中还可以使用其他的输入方式,但这里主要讲解 Scan ...

  10. java学习笔记16--I/O流和文件

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input  Output)流 IO流用来处理 ...

最新文章

  1. 【java】巨菜博主安装jdk为什么每次都失败?
  2. php管理员登录文件,使用PHP文件重置管理员密码(Drupal 8)
  3. 8.3. 测试 opensips
  4. oracle10g检测未通过,win64bit安装oracle 10g版本检查未通过解决 提示要求的结果: 5.0,5.1,5.2,6.0 之一 实际结果: 6.1...
  5. 设置TDSAuthenticationManager属性对DataSnap服务端的接口授权
  6. 电商Sass平台-商城运营后台原型-仓储管理-订单管理-店铺运营-采购管理-数据分析-交易分析-留存分析-客户管理-用户运营-围栏管理-商品管理-流量分析-电商erp后台管理-用户权限-销量分析
  7. 机器学习-吴恩达-笔记-6-应用机器学习的建议
  8. 服务器负载不高 响应慢_通俗易懂的讲透:负载均衡的原理
  9. C++--第15课 - 惊艳的继承
  10. Element UI踩坑记 —— el-table中 formatter 的属性居然失效了
  11. PAIP.MYSQL数据库比较VC313.TXT
  12. 如何编写高质量的程序
  13. hadoop安装常见问题
  14. 【Windows】win10如何拦截弹窗?
  15. Longest Common Subsequence
  16. mysql安装2503,无法安装msi格式软件提示错误代码2502、2503怎么办?
  17. Deep Anomaly Detection with Deviation Networks论文阅读
  18. [每日100问][2011-10-11]iphone开发笔记,今天你肿了么
  19. 李宏毅2021年机器学习笔记———卷积神经网络
  20. 计算机音乐制作专业大纲,电脑音乐制作教学大纲1.doc

热门文章

  1. iphone手机投射到电脑的过程详解
  2. Python 读文件只读了一部分的问题解决
  3. 构造可以使n个城市连接的最小生成树—C语言实现
  4. 群晖Docker套件注册Harbor私有镜像仓库,并下载运行自己发布的Docker镜像
  5. win10下Linux子系统(ubuntu)开启并配置(shell主题,设置中文环境,图形界面...)
  6. node.js(二 --- events 、buffer、)
  7. linux 怎么临时修改ip,linux中临时、永久修改ip(示例代码)
  8. 如何预防计算机病毒英语作文,电脑病毒的英文作文
  9. Outlier Detection Based on Fuzzy Rough Granules in Mixed Attribute Data论文精读
  10. Java8新特性(三) – 流式数据处理