现在又一个应用场景,前台数据操作数据我以HashMap保存起来然后存入数据库中的blob字段,现在怎样在把它取出来放到一个map中
[b]问题补充:[/b]
请问有没有spring结合hibernate操作的 ,看了一些网上的配置都有错误,多谢大侠们的解答
[code="java"] //测试用HashMap
HashMap staff=new HashMap();
staff.put("001","true");
staff.put("002","false");
staff.put("003","false");
import oracle.sql.*;//oracle提供的JDBC包
//写入oracle数据库
Connection con=dbConn.getConnection();
con.setAutoCommit(false);
Statement st=con.createStatement();
//关键!!之所以用了这么长时间就是因为没有对BLOB字段初始化!
//插入新的数据时一定要使用EMPTY_BLOB()对BLOB字段初始化!!!
st.executeUpdate("UPDATE TABLE_NAME SET BLOB_VALUE=EMPTY_BLOB() WHERE ID=10");
ResultSet rs = st.executeQuery(
"SELECT BLOB_VALUE " +
"FROM TABLE_NAME " +
"WHERE id = 10 FOR UPDATE"
);
rs.next();
BLOB myBlob =(BLOB) rs.getObject("BLOB_VALUE");
ObjectOutputStream oos=new ObjectOutputStream(myBlob.getBinaryOutputStream());
oos.writeObject(staff);
oos.flush();
st.execute("commit");
……
//从oracle数据库中读出
Connection con=dbConn.getConnection();
Statement st=con.createStatement();
ResultSet rs2 = st.executeQuery(
"SELECT BLOB_VALUE " +
"FROM TABLE_NAME " +
"WHERE id = 10"
);
rs2.next();
BLOB blob =(BLOB) rs.getObject("BLOB_VALUE");
ObjectInputStream ois=new ObjectInputStream(blob.getBinaryStream());
HashMap h1=(HashMap) ois.readObject();
String s1=(String) h1.get("001");
system.out.println(s1);//打印出“true”
ois.close();[/code]
参考
使用JDBC和Hibernate来写入Blob型数据到Oracle中
http://www.iteye.com/topic/254
[color=blue]
其实这就是对象的序列化与反序列化,在数据库中的应用(平时,都是序列化在文件中,现在是序列化到数据库中)
Blob其实就是2进制的bit数据。和对象序列化后的结果一样。所以在JPA中Serializable的数据也是用Blob来存储的。这正是你使用的场景:将序列化的对象以Blob的形式存储在数据库中。
因此可以用对象反序列化的方式恢复Map。不同的就是,以前反序列化时,用的是从File对象开始获取,然后再通过ObjectInputStream,反序列化。现在是从ResultSet获取Blob,然后获取InputStream,最后再通过ObjectInputStream,反序列化。
[/color]
[code="java"]
Blob blob = rs.getBlob();
ObjectInputStream in = new ObjectInputStream(blob.getBinaryStream());
HashMap map = (HashMap)in.readObject();
in.close();
[/code]