[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]
LOB(Large Object)分为CLOB和BLOB, CLOB表示文本数据, BLOB用于表示二进制数据.
MySql存储文本数据使用的是TEXT而不是CLOB, MySql中的TEXT和BLOB分别分为:
TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT, 占用的内存空间分别为256B, 64K, 16M, 64G.
TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB, 占用的内存空间同上.
如果LOB数据过大, 并不适合使用数据库处理, 因为处理这些数据需要长时间占用数据库的链接资源.
读取与存储TEXT数据:
/*
* create table text_data(id int primary key auto_increment, resume text);
*/
public class TextData {
@Test
public void insertToDatabase() {
Connection conn = null;
PreparedStatement st = null;
String sql = "insert into text_data(resume) values(?)";
// 获得文本文件的绝对路径
String path = TextData.class.getClassLoader().getResource("db.properties").getPath();
File file = new File(path);
try {
conn = JdbcUtils.getConnection();
st = conn.prepareStatement(sql);
st.setCharacterStream(1, new FileReader(file), (int)file.length());
st.executeUpdate();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.release(null, st, conn);
}
}
@Test
public void readTextFromDatabase() {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
Reader reader = null;
FileWriter writer = null;
String sql = "select resume from text_data where id=1";
try {
conn = JdbcUtils.getConnection();
st = conn.prepareStatement(sql);
rs = st.executeQuery();
if (rs.next()) {
reader = rs.getCharacterStream("resume");
writer = new FileWriter("d://db.properties");
char[] chs = new char[1024];
int len = 0;
while((len = reader.read(chs)) != -1) {
writer.write(chs, 0, len);
}
}
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
FileUtils.fileClose(reader, writer);
JdbcUtils.release(null, st, conn);
}
}
}
读取与存储二进制数据:
/*
* create table blob_data(id int primary key auto_increment, resume blob);
*/
public class BlobData {
@Test
public void insertToDatabase() {
Connection conn = null;
PreparedStatement st = null;
String sql = "insert into blob_data(resume) values(?)";
// 获得文本文件的绝对路径
String path = TextData.class.getClassLoader().getResource(
"db.properties").getPath();
File file = new File(path);
try {
conn = JdbcUtils.getConnection();
st = conn.prepareStatement(sql);
st.setBinaryStream(1, new FileInputStream(file), (int) file
.length());
st.executeUpdate();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.release(null, st, conn);
}
}
@Test
public void readBlobFromDatabase() {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
InputStream in = null;
OutputStream out = null;
String sql = "select resume from blob_data where id=1";
try {
conn = JdbcUtils.getConnection();
st = conn.prepareStatement(sql);
rs = st.executeQuery();
if (rs.next()) {
in = rs.getBinaryStream("resume");
out = new FileOutputStream("d://db.properties");
byte[] buffer = new byte[1024];
int len = 0;
while((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
}
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
FileUtils.streamClose(in, out);
JdbcUtils.release(null, st, conn);
}
}
}
分享到:
相关推荐
- **读取图片**:查询数据库获取`ImageData`,然后将返回的二进制数据写入响应流,用户端可以通过浏览器或其他方式显示图片。 3. **Oracle数据库与图片处理**: - **创建表结构**:Oracle提供`BLOB`类型来存储二...
- **BLOB** 类型用于存储二进制数据,有TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB四种,分别可以存储不同大小的二进制数据。 - **TEXT** 类型则用于存储非二进制的大文本数据,有TINYTEXT、TEXT、MEDIUMTEXT和LONG...
在关系型数据库中,如MySQL、Oracle或SQL Server,通常有特定的数据类型用于存储二进制数据,如BLOB(Binary Large Object)、VARBINARY或IMAGE。这些数据类型能容纳任意大小的二进制流,适合存储图片。 三、从...
`@Lob`注解用于大文本和二进制数据,`@Column(columnDefinition = "BLOB")`是针对特定数据库(如MySQL)的额外配置。`@Enumerated(EnumType.STRING)`则将枚举类型转化为字符串存储,便于数据库操作。 然后,我们...
在许多应用场景中,我们不仅需要存储文本、数字等常规数据,还可能需要存储图像等二进制数据。本文将深入探讨如何从SQL数据库中读取存储的二进制图片,并将其转换为可本地查看的文件。 首先,我们需要了解在SQL...
BLOB用于存储非文本的二进制数据,如图片、音频和视频文件,而CLOB则用于存储大文本数据,如长篇文章或文档。 接着,文章详细讲述了JDBC在访问Oracle数据库中的LOB数据时的作用。JDBC是Java连接关系数据库的标准...
在Oracle数据库中,CLOB可以用于存储非二进制的文本数据。 1. 插入CLOB数据: 在Java中,我们通常使用PreparedStatement来插入CLOB数据。首先,创建一个Clob对象,并将待插入的文本数据写入到Clob对象中,然后在SQL...
在IT领域,尤其是在数据库...总之,无论是使用JDBC还是Hibernate,正确处理Oracle中的BLOB字段都是至关重要的,尤其是在处理大量二进制数据的应用场景下。掌握上述流程和技巧,能够有效提升数据操作的效率和安全性。
例如,使用`BufferedReader`或`FileInputStream`配合`DataInputStream`可以高效地读取文本文件或二进制文件。 2. CSV处理:Apache Commons CSV库提供了解析CSV文件的工具,适合处理结构化数据。 3. JSON处理:...
4. **二进制类型**:如`BLOB`(二进制大对象)、`BINARY`(二进制字符串)、`VARBINARY`(可变长度二进制字符串),在JDBC中通常映射为`java.sql.Blob`和`byte[]`。 5. **NULL类型**:`NULL`表示字段值为空,它在...
Blob通常用于存储二进制数据,如图片、音频或视频文件,而Clob则用于存储大量文本数据,如长篇的文本或XML文档。在JDBC4中,处理LOB对象变得更为直接和高效,主要归功于新增的`java.sql.Blob`和`java.sql.Clob`接口...
- **SQL Server**: 使用`BINARY`和`VARBINARY`类型,但不支持`BIT`作为二进制数据类型。 - **Oracle**: 支持`RAW`类型,类似于`BINARY`;不支持`BIT`类型。 - **DB2**: 支持`BINARY`和`BIT`类型。 - **JDBC**: `...
#### 十、用JDBC访问文本和二进制数据 - **文本数据**: - 将文本数据插入数据库。 - 从数据库中读取文本数据。 - **二进制数据**: - 插入图片等二进制数据。 - 从数据库中读取二进制数据。 #### 十一、JDBC...
5. BLOB:二进制大对象,用于存储任意二进制数据,如图片、文档等。 6. NUMERIC:这是一个动态类型,SQLite会根据值的类型自动选择INTEGER或REAL存储。 7. ANY:在某些特殊情况下,SQLite允许使用ANY作为数据类型,...
BLOB类型用于存储非结构化的二进制数据,如图片、音频文件或大型文本文件。本教程将深入探讨如何利用Java的JDBC(Java Database Connectivity)和ORM框架Hibernate来处理Oracle数据库中的Blob型数据。 首先,我们...
- `getBinaryStream()`: 获取Binary、VarBinary、LongVarBinary类型的数据,返回一个InputStream,以二进制流的形式读取数据。 5. Java对象类型的方法: - `getObject()`: 这是最通用的方法,可以用于获取任何...
通过这个过程,开发者能够有效地在数据库中存储和检索二进制数据,如图片或其他文件。在JDBC-MySQL-BLOB-master这个项目中,你可能会找到更具体的实现示例和详细教程,帮助你进一步理解和应用这些概念。
这两种类型用于存储大量的文本数据(CLOB)和二进制数据(BLOB),例如图片、文档或音频文件。在JDBC(Java Database Connectivity)中,我们可以使用特定的方法来操作这些类型的数据。 首先,我们需要建立与数据库...
- **高级数据类型**:深入解释`Blob`和`Clob`数据类型的特性和用途,通过示例演示如何在实际应用中使用这些类型存储和检索大容量文本或二进制数据。 #### 四、总结与展望 通过本教程的学习,开发者将掌握利用JDBC...