CLOB: 用来存储单字节的字符数据
BLOB: 用于存储二进制数据
------------------------------------------------------------------------------------------------
API:
clob
Reader | getCharacterStream() 以 java.io.Reader 对象形式(或字符流形式)检索此 Clob 对象指定的 CLOB 值 |
Writer | setCharacterStream(long pos) 检索用于将 Unicode 字符流写入此 Clob 对象表示的 CLOB 值中(位置 pos 处)的流。 |
long | length() 检索此 Clob 对象指定的 CLOB 值中的字符数。 |
blob
InputStream | getBinaryStream() 以流的形式检索此 Blob 实例指定的 BLOB 值。 |
byte[] | getBytes(long pos, int length) 以字节数组的形式检索此 Blob 对象表示的全部或部分 BLOB 值。 |
long | length() 返回由此 Blob 对象指定的 BLOB 值中的字节数。 |
OutputStream | setBinaryStream(long pos) 检索用于写入此 Blob 对象表示的 BLOB 值的流 |
----------------------------------------------------------------------
JDBC
CLOB Java代码
//获得数据库连接
Connection con = ConnectionFactory.getConnection(); con.setAutoCommit(false);
Statement st = con.createStatement(); //不需要“for update”
ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1");
if (rs.next()) {
java.sql.Clob clob = rs.getClob("CLOBATTR");
Reader inStream = clob.getCharacterStream();
char[] c = new char[(int) clob.length()]; //读取字节数
inStream.read(c);
//data是读出并需要返回的数据,类型是String data = new String(c);
inStream.close();
}
inStream.close();
con.commit();
con.close();
BLOB java 代码
//获得数据库连接
Connection con = ConnectionFactory.getConnection(); con.setAutoCommit(false);
Statement st = con.createStatement(); //不需要“for update”
ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1");
if (rs.next()) {
java.sql.Blob blob = rs.getBlob("BLOBATTR");
InputStream inStream = blob.getBinaryStream();
//data是读出并需要返回的数据,类型是
byte[] data = new byte[input.available()]; //input.available()字节长度
inStream.read(data);
inStream.close();
}
inStream.close();
con.commit();
con.close();
JDBC SQL插入语句:
CLOB java 代码
//获得数据库连接
Connection con = ConnectionFactory.getConnection(); con.setAutoCommit(false);
Statement st = con.createStatement();
//插入一个空对象empty_clob()
st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())");
//锁定数据行进行更新,注意“for update”语句
ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");
if (rs.next()) {
//得到java.sql.Clob对象后强制转换为oracle.sql.CLOB
oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBATTR");
Writer outStream = clob.getCharacterOutputStream();
//data是传入的字符串,定义:String data
char[] c = data.toCharArray();
outStream.write(c, 0, c.length);
}
outStream.flush();
outStream.close();
con.commit();
con.close();
BLOB java 代码
//获得数据库连接
Connection con = ConnectionFactory.getConnection(); con.setAutoCommit(false);
Statement st = con.createStatement();
//插入一个空对象empty_blob()
st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())");
//锁定数据行进行更新,注意“for update”语句
ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update");
if (rs.next()) {
//得到java.sql.Blob对象后强制转换为oracle.sql.BLOB
oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("BLOBATTR");
OutputStream outStream = blob.getBinaryOutputStream();
//data是传入的byte数组,定义:byte[] data
outStream.write(data, 0, data.length);
}
outStream.flush();
outStream.close();
con.commit();
con.close();
---------------------------------------------------------------------
Hibernate保存大字段:
blob:
PO: import org.apache.struts.upload.FormFile;
属性:private FormFile file = null;
byte[] fileData = po.getFile().getFileData();
String fileName = po.getFile().getFileName();
PubInfoFiles pubInfoFiles = new PubInfoFiles();
pubInfoFiles.setFileName(fileName);//private Blob file;
pubInfoFiles.setFile(Hibernate.createBlob(fileData));
pubInfoFiles.setCreateDate(new Date());
getPubFileService().savePo(pubInfoFiles);
//一般保存PO的方法
clob:
在映射文件中定义成org.springframework.orm.hibernate3.support.ClobStringType类型,在po中定义成String类型
<property name="requestContent" type="org.springframework.orm.hibernate3.support.ClobStringType"><column name="REQUEST_CONTENT"></column></property>
private String requestContent;操作同String类似。
输出eg:
//将图片读进输入流
FileInputStream fis = new FileInputStream("c:\\a.jpg");
//转成Blob类型
photo = Hibernate.createBlob(fis);
user.setPhoto(photo);
xx.save(user);
try {
//从数据库中要读取出来
InputStream is = user.getPhoto().getBinaryStream();
//在写到一个图片格式的文件里
FileOutputStream fos = new FileOutputStream("c:\\l.jpg");
byte[] buffer = new byte[1024];
int len = 0;
//从数据库中读取到指定的字节数组中
while((len = is.read(buffer) )!= -1){
//从指定的数组中读取,然后输出来,所以这里buffer好象是连接inputStream和outputStream的一个东西
fos.write(buffer,len);
} catch (FileNotFoundException e) {
e.printStackTrace(); } catch (SQLException e) {
e.printStackTrace(); } catch (IOException e) {
e.printStackTrace(); }
session.close();
---------------------------------------------------------------------
oracle sql语句:
select STREAM_DATA from pub_info_files
STREAM_DATA:blob类型
insert into T (image) values( (select STREAM_DATA from pub_info_files));
if调用函数:select 函数名(STREAM_DATA) from pub_info_files