java 对象序列化存储oracle:
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import oracle.sql.BLOB;
/**
*
* handle serial object with oracle dbStore<br/>
* eg: create table TEST_OBJECTSTORE ( CLASSNAME VARCHAR2(256), CONTENT BLOB )
* @author Administrator
*
*/
public class ObjectSerialStore {
private String tableName;
private String classNameColumn;
private String serialObjColumn;
/**
* construct
*
* @param tableName
* @param classNameColumn
* @param serialObjColumn
*/
public ObjectSerialStore(String tableName, String classNameColumn,
String serialObjColumn) {
this.tableName = tableName;
this.classNameColumn = classNameColumn;
this.serialObjColumn = serialObjColumn;
}
/**
* store the serial Object
*
* @param dbConn close after use
* @param className serialObj.getClass().getName() or OBJ.class.getName()
* @param serialObj
*/
public final void storeSerialObject(Connection dbConn, String className,
Object serialObj) {
Statement stmt = null;
ResultSet rs = null;
try {
ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
ObjectOutputStream objOuts = new ObjectOutputStream(byteArray);
objOuts.writeObject(serialObj);
final byte[] objBytes = byteArray.toByteArray();
dbConn.setAutoCommit(false);
stmt = dbConn.createStatement();
stmt.executeUpdate("insert into " + this.tableName + " ("
+ this.classNameColumn + ", " + this.serialObjColumn
+ ") values ('" + className + "', empty_blob())");
rs = stmt.executeQuery("select " + this.serialObjColumn + " from "
+ this.tableName + " where " + this.classNameColumn + "='"
+ className + "' for update");
if (rs.next()) {
BLOB blob = (BLOB) rs.getBlob(this.serialObjColumn);
@SuppressWarnings("deprecation")
OutputStream outStream = blob.getBinaryOutputStream();
outStream.write(objBytes, 0, objBytes.length);
outStream.flush();
outStream.close();
}
dbConn.commit();
byteArray.close();
objOuts.close();
} catch (Exception e) {
System.out.println("The error when serial obj:"+e.getMessage());
} finally {
close(rs,stmt,dbConn);
}
}
/**
* update the serial Object
* @param dbConn close after use
* @param className serialObj.getClass().getName() or OBJ.class.getName()
* @param serialObj
*/
public final void updateSerialObject(Connection dbConn, String className,
Object serialObj){
Statement stmt = null;
ResultSet rs = null;
try {
ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
ObjectOutputStream objOuts = new ObjectOutputStream(byteArray);
objOuts.writeObject(serialObj);
final byte[] objBytes = byteArray.toByteArray();
dbConn.setAutoCommit(false);
stmt = dbConn.createStatement();
stmt.executeUpdate("update "+this.tableName+" set "+this.serialObjColumn+"=empty_blob() where "+this.classNameColumn+"='"+className+"'");
rs = stmt.executeQuery("select " + this.serialObjColumn + " from "
+ this.tableName + " where " + this.classNameColumn + "='"
+ className + "' for update nowait");
if (rs.next()) {
BLOB blob = (BLOB) rs.getBlob(this.serialObjColumn);
@SuppressWarnings("deprecation")
OutputStream outStream = blob.getBinaryOutputStream();
outStream.write(objBytes, 0, objBytes.length);
outStream.flush();
outStream.close();
}
dbConn.commit();
byteArray.close();
objOuts.close();
} catch (Exception e) {
System.out.println("The error when update serial obj:"+e.getMessage());
} finally {
close(rs,stmt,dbConn);
}
}
/**
* get the serial Object from db
*
* @param dbConn close after use
* @param className serialObj.getClass().getName() or OBJ.class.getName()
* @return
*/
public final Object getSerialObject(Connection dbConn, String className) {
Statement stmt = null;
ResultSet rs = null;
Object returnObj = null;
try{
stmt = dbConn.createStatement();
rs = stmt.executeQuery("select "+this.serialObjColumn+" from "+this.tableName+" where "+this.classNameColumn+"='"+className+"'");
BLOB blob = null;
if(rs.next()){
blob = (BLOB) rs.getBlob(this.serialObjColumn);
}
InputStream is = blob.getBinaryStream();
BufferedInputStream bufferIs = new BufferedInputStream(is);
byte[] byteArrays = new byte[blob.getBufferSize()];
while(-1 != bufferIs.read(byteArrays, 0, byteArrays.length));
ObjectInputStream objInput = new ObjectInputStream(new ByteArrayInputStream(byteArrays));
returnObj = objInput.readObject();
is.close();
bufferIs.close();
objInput.close();
}catch(Exception e){
System.out.println("The error when deserial obj:"+e.getMessage());
}finally{
close(rs,stmt,dbConn);
}
return returnObj;
}
private void close(ResultSet rs,Statement stmt,Connection conn){
if(rs != null){
try{
rs.close();
}catch(Exception e){}
}
if(stmt != null){
try{
stmt.close();
}catch(Exception e){}
}
if(conn != null){
try{
conn.close();
}catch(Exception e){}
}
}
}