码迷,mamicode.com
首页 > 数据库 > 详细

java 对象序列化存储oracle

时间:2014-08-29 13:06:17      阅读:347      评论:0      收藏:0      [点我收藏+]

标签:java对象序列化存储   serializable   oracle   oracle存储java对象   

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){}
		}
	}

}


 

java 对象序列化存储oracle

标签:java对象序列化存储   serializable   oracle   oracle存储java对象   

原文地址:http://blog.csdn.net/shefron/article/details/38922503

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!