日期:2014-05-16 浏览次数:20487 次
对象持久化,也就是可以把这个对象永远的保存起来,这里的保存不仅是对象本身,还包括他的属性和所依赖的其他类。通常,对象可以持久化到文件或者是数据库中。我这里只介绍如何将对象存储到数据库中。恰巧Oracle数据库为我们提供了这样的方便。
?? 在Oracle中,有一种blog的字段类型,它是用来存储大量的二进制数据的。我们就利用这个字段去存储对象信息。
?? 首先建立一个测试表:
create table TESTBLOB
(
? NAME??? VARCHAR2(50) not null,
? CONTENT BLOB not null,
? ID????? NUMBER(8) not null
)alter table TESTBLOB
? add constraint IDFORTEST primary key (ID);
?? 只用三个字段,其中id是属性,content是我们要存储对象的字段。
?? 先来看看我们要存入的对象:
import java.io.Serializable;
import java.util.Date;
import java.util.List;
public class TestObject implements Serializable {
?
?private static final long serialVersionUID = 4558876142427402513L;
?/**
? * @param args
? */
?private String name;
?private String password;
?private Date date;
?private List<City> cityList;
?
?public List<City> getCityList() {
??return cityList;
?}
?public void setCityList(List<City> cityList) {
??this.cityList = cityList;
?}
?public Date getDate() {
??return date;
?}
?public void setDate(Date date) {
??this.date = date;
?}
?public String getName() {
??return name;
?}
?public void setName(String name) {
??this.name = name;
?}
?public String getPassword() {
??return password;
?}
?public void setPassword(String password) {
??this.password = password;
?}
}
??? 记得要实现Serializable接口,可以看到这是一个包含了string,date,和list类型的对象,为了给测试增加复杂度,我们的list是另外一个对象(city)的list,如下:
import java.io.Serializable;
public class City implements Serializable{
?private static final long serialVersionUID = 4558876127402513L;
?private String name;
?private String code;
?public String getCode() {
??return code;
?}
?public void setCode(String code) {
??this.code = code;
?}
?public String getName() {
??return name;
?}
?public void setName(String name) {
??this.name = name;
?}
}
???? City对象包括了城市名称和区号。下面是主要的应用了。
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.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import oracle.sql.BLOB;
public class Test {
?public static void main(String[] args) {
??//创建测试用对象
??City beijing = new City();
??beijing.setName("北京");
??beijing.setCode("010");
??
??City shanghai = new City();
??shanghai.setName("上海");
??shanghai.setCode("020");
??
??City tianjin = new City();
??tianjin.setName("天津");
??tianjin.setCode("021");
??
??List<City> cityList = new ArrayList<City>();
??cityList.add(beijing);
??cityList.add(shanghai);
??cityList.add(tianjin);
??
??TestObject obj = new TestObject();
??obj.setName("yangsq");
??obj.setPassword("111");
??obj.setDate(new Date());
??obj.setCityList(cityList);
??
??try{
???//将对象存入blob字段
???ByteArrayOutputStream byteOut=new ByteArrayOutputStream();
???ObjectOutputStream outObj=new ObjectOutputStream(byteOut);
???outObj.writeObject(obj) ;
???final byte[] objbytes=byteOut.toByteArray();
???
???Class.forName("oracle.jdbc.driver.OracleDriver");
???Connection con = DriverManager.getConnection(
?????"jdbc:oracle:thin:@***.***.***.***:1521:****", "yangsq", "yangsq");
???con.setAutoCommit(false);
???Statement st = con.createStatement();
???
???st.executeUpdate("insert into TESTBLOB (ID, NAME, CONTENT) values (1, 'test1', empty_blob())");
???ResultSet rs = st.executeQuery("select CONTENT from TESTBLOB where ID=1 for update");
???
???if (rs.next()) {
????BLOB blob = (BLOB) rs.getBlob("CONTENT");
????OutputStream outStream