blob与string类型的相互转换——把stringlexington的数据存进oracle的blob字段中

<div style="word-wrap: break-word; color: rgb(102, 102, 102); font-family: 宋体, Arial; line-height: 26px;"><span style="font-size:18px;">【概述】 <wbr style="word-wrap: break-word;"></wbr></span></div><div style="word-wrap: break-word; color: rgb(102, 102, 102); font-family: 宋体, Arial; line-height: 26px;"><span style="font-size:18px;"><br style="word-wrap: break-word;" /></span></div><div style="word-wrap: break-word; color: rgb(102, 102, 102); font-family: 宋体, Arial; line-height: 26px;"><span style="font-size:18px;"> <wbr style="word-wrap: break-word;">  <wbr style="word-wrap: break-word;"> Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据。 <wbr style="word-wrap: break-word;"></wbr></wbr></wbr></span></div><div style="word-wrap: break-word; color: rgb(102, 102, 102); font-family: 宋体, Arial; line-height: 26px;"><span style="font-size:18px;"><br style="word-wrap: break-word;" /></span></div><div style="word-wrap: break-word; color: rgb(102, 102, 102); font-family: 宋体, Arial; line-height: 26px;"><span style="font-size:18px;">写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对 <wbr style="word-wrap: break-word;"></wbr></span></div><div style="word-wrap: break-word; color: rgb(102, 102, 102); font-family: 宋体, Arial; line-height: 26px;"><span style="font-size:18px;"><br style="word-wrap: break-word;" /></span></div><div style="word-wrap: break-word; color: rgb(102, 102, 102); font-family: 宋体, Arial; line-height: 26px;"><span style="font-size:18px;">blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何获得Blob的cursor呢? <wbr style="word-wrap: break-word;"></wbr></span></div><div style="word-wrap: break-word; color: rgb(102, 102, 102); font-family: 宋体, Arial; line-height: 26px;"><span style="font-size:18px;"><br style="word-wrap: break-word;" /></span></div><div style="word-wrap: break-word; color: rgb(102, 102, 102); font-family: 宋体, Arial; line-height: 26px;"><span style="font-size:18px;">这需要你先插入一个empty的blob,这将创建一个blob的cursor,然后你再把这个empty的blob的cursor <wbr style="word-wrap: break-word;"></wbr></span></div><div style="word-wrap: break-word; color: rgb(102, 102, 102); font-family: 宋体, Arial; line-height: 26px;"><span style="font-size:18px;"><br style="word-wrap: break-word;" /></span></div><div style="word-wrap: break-word; color: rgb(102, 102, 102); font-family: 宋体, Arial; line-height: 26px;"><span style="font-size:18px;">用select查询出来,这样通过两步操作,你就获得了blob的cursor,可以真正地写入blob数据了。 </span></div>

<pre name="code" class="java">package com.coci.test2;

import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

import oracle.sql.BLOB;

/**
 * 
 * @author Coci
 *
 */
public class TestBlob {

	public static void main(String[] args) {

		// blob内存放的是字节数组
		// String 的getBytes方法获得该字符串的字节数组(注意编码),然后存入blob即可
		String blobStr = "blob";
		byte[] bytes = null;
		try {
			bytes = blobStr.getBytes("utf-8");
			System.out.println("===" + bytes);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

		instertData(bytes);

		// 从数据库中读取Blob类型数据后,要转换成String类型,即转换成InputStream,再从InputStream转成byte[],再到String即可。
		// blob转换成String
//		String result = "";
//		try {
//			ByteArrayInputStream msgContent = (ByteArrayInputStream) blob
//					.getBinaryStream();
//			byte[] byte_data = new byte[msgContent.available()];
//			msgContent.read(byte_data, 0, byte_data.length);
//			result = new String(byte_data);
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
	}

	@SuppressWarnings("deprecation")
	public static void instertData(byte[] value) {
		// TODO Auto-generated method stub
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String url = "jdbc:oracle:thin:@10.211.19.71:1521:orcl";
			String username = "yst";
			String password = "yst";
			Connection con = DriverManager.getConnection(url, username,
					password);
			con.setAutoCommit(false);
			String sql1 = "insert into testcoci(id,name) values('88',empty_blob())";

			Statement statement = con.createStatement();
			boolean b2 = statement.execute(sql1);
			System.out.println("第一次===" + b2);

			String sql2 = "select name from testcoci where id=88 for update";
			PreparedStatement stmt = con.prepareStatement(sql2);
			ResultSet rs = stmt.executeQuery();
			OutputStream outStream = null;
			if (rs.next()) {

				System.out.println("进来了");
				BLOB blob = (BLOB) rs.getBlob(1);
				System.out.println("数据库  blob =" + blob + "=");
				outStream = blob.getBinaryOutputStream();
				outStream.write(value, 0, value.length);
			}
			outStream.flush();
			outStream.close();
			con.commit();
			con.close();

		} catch (Exception e) {
			System.out.println(e.getCause());
		}
	}
}
<span style="font-size:18px;">这篇博客写的很详细:</span>
<a target=_blank href="http://blog.itpub.net/21632975/viewspace-1116728/"><span style="font-size:18px;">http://blog.itpub.net/21632975/viewspace-1116728/</span></a>





                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值