-
LOB,即Large Objects(大对象),是用来存储大量的二进制和文本数据的一种数据类型
-
LOB分为两种内省:内部LOB和外部LOB
内部LOB将数据以字节流的形式存储在数据库的内部。因而内部LOB的许多操作都可以参与事务,也可以像处理普通数据一样对其进行备份和恢复操作。
Oracle支持三种类型的内部LOB:
BLOB:二进制数据
CLOB:单字节字符数据
NCLOB:多字节字符数据
CLOB和NCLOB类型适用于存储超长的文本数据,BLOB字段适用于存储大量的二进制数据,如图像、视频、音频、文件等。
MySQL四种BLOB类型(除了在存储的最大信息量上不同之外,他们是等同的)
TinyBlob:最大255字节
Blob:最大65K
MediumBlob:最大16M
LongBlob:最大4G
-
如果存储的文件过大,数据库的性能会下降。
-
插入Blob数据
package com.litian.jdbc; import java.io.FileInputStream; import java.io.InputStream; import java.sql.*; /** * @author: Li Tian * @contact: litian_cup@163.com * @software: IntelliJ IDEA * @file: InsertBlob.java * @time: 2020/3/31 14:40 * @desc: |插入Blob类型的数据必须使用PreparedStatement,因为BLOB类型的数据是无法使用字符串拼写的 * 调用setBlob方法插入BLOB */ public class InsertBlob { public static void main(String[] args){ Connection conn = null; PreparedStatement ps = null; try { conn = JDBCTools.getConnection(); String sql = "insert into t_user(username, pwd, pic) values(?,?,?)"; ps = conn.prepareStatement(sql); ps.setString(1, "picture"); ps.setString(2, "123456"); InputStream is = new FileInputStream("C:\Users\Administrator\Desktop\参考投稿进程.jpg"); ps.setBlob(3, is); ps.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { JDBCTools.release(null, ps, conn); } } }
读取Blob数据
package com.litian.jdbc; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.sql.Blob; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; /** * @author: Li Tian * @contact: litian_cup@163.com * @software: IntelliJ IDEA * @file: ReadBlob.java * @time: 2020/3/31 14:47 * @desc: |读取Blob数据 * 1. 使用getBlob方法读取到Blob对象 * 2. 调用Blob的getBinaryStream()方法得到输入流。再使用IO操作即可。 */ public class ReadBlob { public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = JDBCTools.getConnection(); String sql = "select id, username 姓名, pwd, pic from t_user where id=21028"; ps = conn.prepareStatement(sql); rs = ps.executeQuery(); if (rs.next()) { int id = rs.getInt(1); String name = rs.getString(2); String pwd = rs.getString(3); System.out.println(id + "->" + name + "->" + pwd); Blob pic = rs.getBlob(4); InputStream in = pic.getBinaryStream(); OutputStream out = new FileOutputStream("info.jpg"); byte[] buffer = new byte[1024]; int len = 0; while((len=in.read(buffer)) != -1){ out.write(buffer, 0, len); } out.close(); in.close(); } } catch (Exception e) { e.printStackTrace(); } finally { JDBCTools.release(rs, ps, conn); } } }