`
idealab
  • 浏览: 197745 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

利用JDBC操作Oracle CLOB和BLOB类型数据

    博客分类:
  • Java
阅读更多
对LOB数据(包括CLOB BLOB NCLOB BFILE类型)操作的插入操作步骤:插入空值-->获取空值列及更新锁-->更新LOB字段。

通过查询操作得到的LOB类型数据处理要点:首先利用LOB字段数据获取InputStream或OutputStream对象,然后根据需要对其进行操作,若需提取数据则获取InputStream对象,若需更新LOB字段数据,则获取OutputStream对象。

程序分为两层,1)JdbcUtil提供基本数据库访问及事务管理,2)DAO层调用JdbcUtil来提供DAO服务。

包含CLOB数据的content_text表:
/*==============================================================*/
/* Table: content_text                                        */
/*==============================================================*/
CREATE TABLE content_text  (
   pk_content_text    INTEGER                         NOT null,
   text_type          VARCHAR2(25)                    NOT null,
   text_content       CLOB                            NOT null,
   CONSTRAINT PK_CONTENT_TEXT PRIMARY KEY (pk_content_text)
)


包含BLOB数据的content_bin表:
/*==============================================================*/
/* Table: content_bin                                         */
/*==============================================================*/
CREATE TABLE content_bin  (
   pk_content_bin     INTEGER                         NOT null,
   bin_type           VARCHAR2(25)                    NOT null,
   bin_content        CLOB                            NOT null,
   CONSTRAINT PK_CONTENT_BIN PRIMARY KEY (pk_content_bin)
);


=========================JdbcUtil================
-------向content_text表中插入数据:

public int insertText(ContentText text) {
		int insertkey = -1;
		try {
			// 利用序列sequence向数据库索取content_text表的自增长主键
			ResultSet rs = executeQuery("select seq_content_text.nextval as pk_content_text from dual");
			rs.first();
			insertkey = rs.getInt(1);
			rs.close();

			// 插入空CLOB
			String insertEmpty = "insert into content_text values(" + insertkey
					+ ",'" + text.getTextType() + "',empty_clob())";
			boolean insertResult = executeUpdate(insertEmpty);
			if (insertResult == false) {
				throw new SQLException();
			}

			// 获取CLOB类型列text_content,并获取更新锁,锁定当前行直至更新结束
			String getForUpdate = "select text_content from content_text where pk_content_text = "
					+ insertkey + " for update";
			rs = executeQuery(getForUpdate);
			rs.first();
			CLOB content = (CLOB) rs.getClob("text_content");
			rs.close();
			content.setString(1L, text.getContent());

			// 更新text_content列
			String updateSQL = "update content_text set text_content = ? where pk_content_text = ?";
			PreparedStatement pst = conn.prepareStatement(updateSQL);
			pst.setClob(1, content);
			pst.setInt(2, insertkey);
			pst.execute();
			pst.close();
		} catch (SQLException e) {
			try {
				conn.rollback();
				conn.close();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
			System.out.println("Insert text failed!");
		}
		return insertkey;
	}

------------向content_bin表中插入数据:
public int insertBin(ContentBin bin) {
		int insertkey = -1;
		try {
			// 利用序列sequence向数据库索取content_bin表的自增长主键
			ResultSet rs = executeQuery("select seq_content_bin.nextval from dual");
			boolean good = rs.first();
			System.out.println(good);
			insertkey = rs.getInt(1);
			rs.close();

			// 插入空BLOB
			String insertEmpty = "insert into content_bin values(" + insertkey
					+ ",'" + bin.getBinType() + "','" + bin.getBinFilename()
					+ "',empty_blob())";
			boolean result = executeUpdate(insertEmpty);
			System.out.println("插入空值:" + result);

			// 获取空BLOB字段,并获取更新锁
			String getEmpty = "select bin_content from content_bin where pk_content_bin="
					+ insertkey + " for update";
			ResultSet forupdateRs = executeQuery(getEmpty);
			forupdateRs.first();
			BLOB blob = (BLOB) forupdateRs.getBlob(1);
			
			//由文件系统获取文件输入流
			File file = bin.getContent();
			System.out.println(file.getAbsolutePath());
			FileInputStream fin = new FileInputStream(file);
			System.out.println(fin.toString());
			
			// 获取BLOB的输出流,并从文件输入流获取数据,写入BLOB的输出流,完成数据库外的BLOB更新
			OutputStream out = blob.setBinaryStream(0);
			byte[] data = new byte[blob.getBufferSize()];
			System.out.println(data.length);
			int count = -1, total = 0;
			while ((count = fin.read(data)) != -1) {
				total += count;
				out.write(data, 0, count);
			}
			fin.close();
			out.close();

			// 利用新的BLOB更新数据库
			String updateBin = "update content_bin set bin_content=? where pk_content_bin=?";
			PreparedStatement pstmt = conn.prepareStatement(updateBin);
			pstmt.setBlob(1, blob);
			pstmt.setInt(2, insertkey);
			pstmt.execute();
			pstmt.close();

		} catch (SQLException e) {
			try {
				conn.rollback();
				conn.close();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return insertkey;
	}


=============================DAO层====================
---------查询content_text表
public ContentText getById(int id) {
		jdbc.openConn();
		ContentText text = new ContentText();
		String sql = "select pk_content_text,text_type,text_content from content_text where pk_content_text = "
				+ id;
		ResultSet rs = jdbc.executeQuery(sql);
		try {
			rs.first();
			text.setContentId(rs.getInt("pk_content_text"));
			text.setTextType(rs.getString("text_type"));
			CLOB clob = (CLOB) rs.getClob(3);
			char[] chars = new char[(int) clob.getLength()];//(int)clob.length();
			clob.getCharacterStream().read(chars);
			String content = new String(chars);
			text.setContent(content);
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		jdbc.commitAndCloseConn();
		return text;
	}


--------------查询content_bin表
public ContentBin getById(int id) {
		ContentBin bin = new ContentBin();
		jdbc.openConn();
		String sql = "select pk_content_bin,bin_type,bin_filename,bin_content from content_bin where pk_content_bin="+ id;
		ResultSet rs = jdbc.executeQuery(sql);
		try {
			rs.first();
			bin.setContentId(rs.getInt(1));
			bin.setBinType(rs.getString(2));
			String filename = rs.getString(3);
			bin.setBinFilename(filename);
			//利用字段bin_filename值构造文件
			File file = new File(filename);
			FileOutputStream sout = new FileOutputStream(file);
			BLOB blob = (BLOB) rs.getBlob(4);
			InputStream in = blob.getBinaryStream();//获取BLOB数据的输入数据流
			//经BLOB输入数据流读取数据,并将其写入文件
			byte[] b = new byte[256]; 
			int off = 0;
			int len = b.length;
			for (int i = in.read(b); i != -1;) { 
				sout.write(b); 
				System.out.println(i);
				i = in.read(b);
			} 
			in.close();
			sout.close();
			bin.setContent(file);
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		jdbc.commitAndCloseConn();
		return bin;
	}
分享到:
评论
1 楼 se34218 2017-07-12  
我想问一下,为什么插入CLOB字段的时候要先插入空CLOB,empty_clob(),再修改为其他值呢?

相关推荐

    Oracle clob和blob在jdbc的应用

    在Java编程中,Oracle数据库提供了对大型对象(Large Object)的支持,包括CLOB...理解如何正确地使用这些数据类型和相关的JDBC方法对于进行数据库编程至关重要,特别是在处理大数据量或者复杂数据结构的应用场景中。

    详解jdbc实现对CLOB和BLOB数据类型的操作

    JDBC实现对CLOB和BLOB数据类型的操作 在数据库中,存在两种类型的数据:CLOB(Character Large OBject)和BLOB(Binary Large OBject),它们用于存储大型数据,如文本、图片、音频、视频等。对CLOB和BLOB数据类型...

    jdbc读写Oracle的CLOB字段

    JDBC读写Oracle的CLOB字段

    图片存入Oracle中,用clob和blob两种方式

    在数据库管理中,存储非结构化数据如图片、音频或视频文件时,通常会使用`CLOB`(Character Large Object)和`BLOB`(Binary Large Object)这两种数据类型。Oracle数据库系统支持这两种数据类型,用于存储大量文本...

    Oracle,Clob,Blob数据存取的Java代码

    在Oracle数据库中,CLOB(Character Large Object)和BLOB(Binary Large Object)是用来存储大量文本数据和二进制数据的特殊数据类型。CLOB用于存储非结构化的文本信息,如XML文档或长篇文章,而BLOB则适用于图像、...

    sql server中的image类型的数据导出到oracle的clob字段中

    在进行数据库迁移或数据交换时,需要将不同数据库管理系统之间的数据类型进行转换。在本文中,我们将讨论如何将 SQL Server 中的 Image 类型数据导出到 Oracle 的 CLOB 字段中。 Image 类型在 SQL Server 中的应用 ...

    clob-blob.rar_blob and clob_clob_java CLOB_java oracle cl_oracle

    对于CLOB和BLOB字段,Oracle JDBC驱动提供了`oracle.jdbc.driver.OracleClob`和`oracle.jdbc.driver.OracleBlob`类,它们实现了Java的标准接口`java.sql.Clob`和`java.sql.Blob`。这两个接口提供了读取和写入大数据...

    关于在Hibernate中对于Clob,Blob字段的处理方法

    2. 配置Hibernate的JDBC连接,使用支持Clob和Blob高效操作的Oracle JDBC驱动。 3. 利用Hibernate提供的API进行增删改查操作,无需手动处理Clob和Blob的具体存储细节。 在实际开发中,了解并掌握这些知识点可以帮助...

    weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB 类型转换解决办法

    这是因为 WebLogic 服务器为了更好地管理和操作数据库连接,会使用自己的包装类 `weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB` 来表示 CLOB 类型的数据,而不是直接使用 Oracle 提供的标准 `oracle.sql.CLOB` 类。...

    JAVA对clob的操作

    在JAVA中,操作Oracle数据库中的BLOB和CLOB类型字段是一种常见的需求。然而,网络上关于JAVA对Oracle中BLOB、CLOB类型字段的操作说明往往不够全面、不够准确,甚至有的简直就是胡说八道。因此,本文旨在总结JAVA对...

    使用Jdbc4操作Blob,Clob

    当涉及到处理大型对象(LOBs)如Blobs(Binary Large Objects)和Clobs(Character Large Objects)时,JDBC4提供了一种更为便捷的方式来操作这些数据类型。这篇博客“使用Jdbc4操作Blob,Clob”将深入讲解如何利用...

    插入、取出Blob类型的数据代码示例

    Blob是Oracle中的一个大对象数据类型,它可以存储最多4GB的二进制数据。Blob数据可以分为两部分:逻辑Blob头和实际的二进制数据。在Oracle中,Blob数据通常与Clob(Character Large Object)一起使用,Clob用于存储...

    使用hibernate对oracle读取blob

    综上所述,使用Hibernate和JDBC读取Oracle数据库中的Blob数据涉及多个步骤,包括实体类的设计、数据库操作和文件流的处理。理解这些知识点对于处理大对象存储至关重要。在实际项目中,根据需求和性能考虑,选择合适...

    oracle Blob Clob 大数处理 代码

    Oracle数据库系统支持两种类型的大对象(LOB)数据:BLOB(Binary Large Object)和CLOB(Character Large Object)。这两种类型都是用于存储大量数据,BLOB用于二进制数据,如图片、音频或视频文件,而CLOB则用于...

    解析jdbc处理oracle的clob字段的详解

    - JDBC提供了对CLOB字段的操作接口,包括`java.sql.Clob`,通过它可以在数据库和应用程序之间读写CLOB数据。 3. **empty_clob()函数**: - 在插入CLOB数据时,如果值是空的,可以使用Oracle SQL的`empty_clob()`...

    Java存取OracleBlob字段,图片存储,Blob和BLOB的问题,Clob,oracle.docx

    在使用 Java 进行 Oracle 数据库操作时,理解 Blob 和 Clob 类型及其操作方法至关重要。通过合理选择 JDBC 版本和适配容器特性,可以有效地管理大容量数据,提高应用程序的性能和稳定性。此外,还需要关注不同容器...

    解析使用jdbc,hibernate处理clob/blob字段的详解

    在Java的数据库操作中,`CLOB`和`BLOB`是用于存储大对象(Large Object)的数据类型,分别用于存储字符数据和二进制数据。这篇文章主要讲解了如何使用`JDBC`和`Hibernate`这两种不同的方式来处理`CLOB`和`BLOB`字段...

Global site tag (gtag.js) - Google Analytics