java序列化对象 插入、查询、更新到数据库

java序列化对象 插入、查询、更新到数据库 :

实现代码如下:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 *
 * 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;
	}

	public final void storeSerialObject(Connection dbConn,String className,Object serialObj){
		PreparedStatement pstmt = null;
		try {
			ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
			ObjectOutputStream objOuts = new ObjectOutputStream(byteArray);
			objOuts.writeObject(serialObj);

			final byte[] objBytes = byteArray.toByteArray();

			pstmt = dbConn.prepareStatement("insert into "+ this.tableName +" ("
					+this.classNameColumn+", "+this.serialObjColumn
					+") values (?,?)");

			pstmt.setString(1, className);

			ByteArrayInputStream bis = new ByteArrayInputStream(objBytes);
			pstmt.setBinaryStream(2, bis,objBytes.length);

			pstmt.execute();
		} catch (Exception e) {
			System.out.println("The error when serial obj:"+e.getMessage());
		} finally {
			close(null,pstmt,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){
		
		PreparedStatement pstmt = null;
		ResultSet rs = null;

		try {
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			ObjectOutputStream objOuts = new ObjectOutputStream(out);
			objOuts.writeObject(serialObj);

			final byte[] objBytes = out.toByteArray();

			pstmt = dbConn.prepareStatement("update "+this.tableName+" set "+this.serialObjColumn+"=? where "+this.classNameColumn+"=?");

			ByteArrayInputStream input = new ByteArrayInputStream(objBytes);
			pstmt.setBinaryStream(1, input, objBytes.length);
			pstmt.setString(2, className);

			pstmt.execute();

			input.close();
			out.close();
			objOuts.close();
		} catch (Exception e) {
			System.out.println("The error when update serial obj:"+e.getMessage());
		} finally {
			close(rs,pstmt,dbConn);
		}

	}
	
	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 = rs.getBlob(this.serialObjColumn);
			}

			byte[] getBytes = blob.getBytes(1, (int)blob.length());
			
			ObjectInputStream objInput = new ObjectInputStream(new ByteArrayInputStream(getBytes));
			returnObj = objInput.readObject();

			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序列化对象 插入、查询、更新到数据库 。



 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值