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服务。
4.2 向数据表中插入大数据类型
PreparedStatement对象可以使用输入和输出流来提供参数数据。能够将整个文件放入可以容纳大值的数据库列,例如CLOB大文本类型和BLOB大二进制数据类型。
有以下方法可用于流式传输数据
setAsciiStream():此方法用于提供大的ASCII值。
setCharacterStream():此方法用于提供较大的UNICODE值。
setBinaryStream():此方法用于提供较大的二进制值。
setXXXStream()方法除了参数占位符之外还需要额外的参数和文件大小。此参数通知驱动程序使用流向数据库发送多少数据。需要说明的是:图片在项目的存储:专门的图片服务器,整个服务器存储都是图片, 华为云服务器,购买华为云服务器可以直接使用, 提供一套API,我们调用这些API就可以存储到华为云,存储成功之后返回一个HTTP地址,可以通过http访问整个图片.当然阿里云也有类似的存储.业界里还有一个公司提供存储服务器,七牛云,提供存储服务,特别是图片服务器.
//获取连接
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, "[email protected]");
ps.setDate(3, new Date(new java.util.Date().getTime()));
// 操作Blob类型的变量
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);
// 填充占位符
// 操作Blob类型的变量
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类型的字段
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();}
}
4.5 操作大文本对象
//读取大文本数据,了解知识
public static void readCLOB() {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql="select * from student where s_id=?";
try {
conn = DBUtil.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "11");
rs = pstmt.executeQuery();
if(rs.next()) {
String sname = rs.getString("s_name");
String sid = rs.getString(1);
Date sbirth = rs.getDate("s_birth");
System.out.println(sid+"\t"+sname+"\t"+sbirth);
Reader reader = rs.getCharacterStream("s_resume");
//保存读取到数据
FileWriter writer = new FileWriter("d:\\test.txt");
char [] txt = new char[1024];
int len = 0;
while( (len=reader.read(txt))!= -1 ) {
writer.write(txt, 0, len);
}
writer.close();
reader.close();
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBUtil.closeAll(null, pstmt, conn);
}
}
//存储大文本数据,了解知识
public static void saveCLOB() {
Connection conn = null;
PreparedStatement pstmt = null;
String sql="update student set s_resume=? where s_id=?";
try {
conn = DBUtil.getConnection();
pstmt = conn.prepareStatement(sql);
//根据提供的文件创建输入流
FileReader reader =new FileReader("d:\\data.txt");
pstmt.setCharacterStream(1, reader);
pstmt.setString(2, "11");
int rows = pstmt.executeUpdate();
if (rows>0) {
System.out.println("操作成功");
} else {
System.out.println("操作失败");
}
} catch (SQLException | FileNotFoundException e) {
e.printStackTrace();
}finally {
DBUtil.closeAll(null, pstmt, conn);
}
}