文章目录
第4章 操作BLOB类型字段4.1 MySQL BLOB类型4.2 向数据表中插入大数据类型4.3 修改数据表中的Blob类型字段4.4 从数据表中读取大数据类型
第5章 批量插入5.1 批量执行SQL语句5.2 高效的批量插入5.2.1 实现层次一:使用Statement5.2.2 实现层次二:使用PreparedStatement5.2.3 实现层次三5.2.4 实现层次四
第4章 操作BLOB类型字段
4.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服务。mysql8.0后默认为4M。
4.2 向数据表中插入大数据类型
Connection conn
= JDBCUtils
.getConnection();
String sql
= "insert into customers(name,email,birth,photo)values(?,?,?,?)";
PreparedStatement ps
= conn
.prepareStatement(sql
);
ps
.setString(1, "徐海强");
ps
.setString(2, "xhq@126.com");
ps
.setDate(3, new Date(new java.util.Date().getTime()));
FileInputStream fis
= new FileInputStream("xhq.png");
ps
.setBlob(4, fis
);
ps
.execute();
fis
.close();
JDBCUtils
.closeResource(conn
, ps
);
4.3 修改数据表中的Blob类型字段
Connection conn
= JDBCUtils
.getConnection();
String sql
= "update customers set photo = ? where id = ?";
PreparedStatement ps
= conn
.prepareStatement(sql
);
FileInputStream fis
= new FileInputStream("coffee.png");
ps
.setBlob(1, fis
);
ps
.setInt(2, 25);
ps
.execute();
fis
.close();
JDBCUtils
.closeResource(conn
, ps
);
4.4 从数据表中读取大数据类型
String sql
= "SELECT id, name, email, birth, photo FROM customer WHERE id = ?";
conn
= getConnection();
ps
= conn
.prepareStatement(sql
);
ps
.setInt(1, 8);
rs
= ps
.executeQuery();
if(rs
.next()){
Integer id
= rs
.getInt(1);
String name
= rs
.getString(2);
String email
= rs
.getString(3);
Date birth
= rs
.getDate(4);
Customer cust
= new Customer(id
, name
, email
, birth
);
System
.out
.println(cust
);
Blob photo
= rs
.getBlob(5);
InputStream is
= photo
.getBinaryStream();
OutputStream os
= new FileOutputStream("c.jpg");
byte [] buffer
= new byte[1024];
int len
= 0;
while((len
= is
.read(buffer
)) != -1){
os
.write(buffer
, 0, len
);
}
JDBCUtils
.closeResource(conn
, ps
, rs
);
if(is
!= null
){
is
.close();
}
if(os
!= null
){
os
.close();
}
}
第5章 批量插入
5.1 批量执行SQL语句
当需要成批插入或者更新记录时,可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率
JDBC的批量处理语句包括下面三个方法:
addBatch(String):添加需要批量处理的SQL语句或是参数;executeBatch():执行批量处理语句;clearBatch():清空缓存的数据
通常我们会遇到两种批量执行SQL语句的情况:
多条SQL语句的批量处理;一个SQL语句的批量传参;
5.2 高效的批量插入
举例:向数据表中插入20000条数据
数据库中提供一个goods表。创建如下:
CREATE TABLE goods
(
id
INT PRIMARY KEY AUTO_INCREMENT,
NAME
VARCHAR(20)
);
5.2.1 实现层次一:使用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
.executeUpdate(sql
);
}
5.2.2 实现层次二:使用PreparedStatement
long start
= System
.currentTimeMillis();
Connection conn
= JDBCUtils
.getConnection();
String sql
= "insert into goods(name)values(?)";
PreparedStatement ps
= conn
.prepareStatement(sql
);
for(int i
= 1;i
<= 20000;i
++){
ps
.setString(1, "name_" + i
);
ps
.executeUpdate();
}
long end
= System
.currentTimeMillis();
System
.out
.println("花费的时间为:" + (end
- start
));
JDBCUtils
.closeResource(conn
, ps
);
5.2.3 实现层次三
@Test
public void testInsert1() 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
= 1;i
<= 1000000;i
++){
ps
.setString(1, "name_" + i
);
ps
.addBatch();
if(i
% 500 == 0){
ps
.executeBatch();
ps
.clearBatch();
}
}
long end
= System
.currentTimeMillis();
System
.out
.println("花费的时间为:" + (end
- start
));
JDBCUtils
.closeResource(conn
, ps
);
}
5.2.4 实现层次四
@Test
public void testInsert2() 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
= 1;i
<= 1000000;i
++){
ps
.setString(1, "name_" + i
);
ps
.addBatch();
if(i
% 500 == 0){
ps
.executeBatch();
ps
.clearBatch();
}
}
conn
.commit();
long end
= System
.currentTimeMillis();
System
.out
.println("花费的时间为:" + (end
- start
));
JDBCUtils
.closeResource(conn
, ps
);
}
资料来源:https://www.bilibili.com/video/BV1eJ411c7rf?p=35