Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26278834
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Java

2010-06-13 15:13:12

Java实现对象序列化保存到数据库

时间:2010-6-13

Java对象序列化就那些实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列 完全恢复为原来的对象。这一过程甚至可以通过网络进行;运行Windows操作系统的计算机上创建的一个对象将其序列化,通过网络将它发送到一台运行 Unix系统的计算机,然后在那里准确地重新组装。Java序列化的一个引用就是RMI,当向远程对象发送消息,需要通过对象序列化来传输参数和返回值。

PS:通过序列化之后我们可以将对象保存到持久化的设备如文件、数据库

 

实现:

    实现Serializable接口。这个接口是标记接口里面没有什么方法要实现的!然后使用一个输出流(如:FileOutputStream) 构造一个ObjectOutputStream(对象流)。然后用ObjectOutputStreamwriteObject(Object obj)方法就可以将参数为obj 的对象写出保存其状态。如果要恢复的话就使用输入流实现!

 

1.     数据表结构

CREATE TABLE `obj` (

  `id` int(11) NOT NULL auto_increment,

  `object` blob,

  PRIMARY KEY  (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

2.     读写代码

package org.test;

import java.io.*;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

import java.sql.Blob;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.Statement;

 

public class ObjectSerial {

    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 cityList = new ArrayList();

         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字段

          Class.forName("com.mysql.jdbc.Driver");

          Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "321");

          con.setAutoCommit(false);

          //将一个对象序列化保存到数据库

          PreparedStatement pstmt = con.prepareStatement("insert into obj (object) values (?)");

          pstmt.setObject(1, obj);

          pstmt.executeUpdate();

          con.commit();

          //从数据库中提取记录

          Statement state = con.createStatement();

          ResultSet rs = state.executeQuery("select object from obj");

          if (rs.next()) {

              //以下是读取的方法一定要注意了!

              Blob inblob = (Blob) rs.getBlob("object");

              InputStream is = inblob.getBinaryStream();

              BufferedInputStream input = new BufferedInputStream(is);

             

              byte[] buff = new byte[(int) inblob.length()];//放到一个buff 字节数组

              while(-1 != (input.read(buff, 0, buff.length)));

             

              ObjectInputStream in =new ObjectInputStream(new ByteArrayInputStream(buff));

              TestObject w3 = (TestObject)in.readObject();//IO流中读取出来.可以得到一个对象了

              System.out.println(w3.getName());

              System.out.println(w3.getPassword());

              System.out.println(w3.getDate());

          }

         

         } catch (Exception ex) {

          ex.printStackTrace();

          System.exit(1);

         }

    }

}

 

class TestObject implements Serializable {

     private static final long serialVersionUID = 4558876142427402513L;

     /**

      * @param args

      */

     private String name;

     private String password;

     private Date date;

     private List cityList;

     

     public List getCityList() {

      return cityList;

     }

     public void setCityList(List 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;

     }

}

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;

     }

}

 

 

阅读(3215) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

hkebao2010-06-13 15:16:44

如果你想保存像数组这样的对象类型到MYSQL也是一样的操作。跟上面的操作方法是一模一样的!