在access中保存使用对象(Object)

原创 2006年05月25日 13:43:00

最近在做一个使用RSA+MD5算法实现数字签名的一个软件。因为考虑到RSA密钥对的管理与分发,所以采用数据库管理RSA密钥对。由于在java中RSA密钥使用java.security.interfaces.RSAPrivateKey;与java.security.interfaces.RSAPublicKey;两个类,因此需要将这两个对象持久化。

考虑到方便用户使用,因而不采用类似JDataStroe,MySQL甚至MS SQL SERVER啦,所以采用Access。

Access只支持文本,数字与OLE对象。而JDBC没有提供相应的方法操作OLE对象,但可以往OLE对象中写入2进制流。

因此,主要思想采用将对象Serialize到BtyeArray流,在将BtyeArray流写入到2进制流。取出对象时,方法相同。

代码如下:

//连接Access,我的文件名为:db/MyRSAStore.mdb,密码123,表:MyRSAKeys(name[文本],description[文本],RSApublicKey[OLE对象],RSAprivateKey[OLE对象],create_data[文本])
String conURL="jdbc:odbc:driver={MicroSoft Access Driver (*.mdb)};DBQ=db//MyRSAStore.mdb";
String password="123";

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con=DriverManager.getConnection(conURL,password,password);//这里只user或password用密码不行

//RSA密钥对象
KeyPair keyPair = lyRSA.generateKeyPair(1024);
RSAPublicKey pubKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey priKey = (RSAPrivateKey) keyPair.getPrivate();


//得到各个流
ByteArrayOutputStream bout1 = new ByteArrayOutputStream();
ObjectOutputStream oout1 = new ObjectOutputStream(bout1);
oout1.writeObject(pubKey);
oout1.flush();
oout1.close();//将pubKey对象写入ByteArrayOutputStream
   
ByteArrayOutputStream bout2 = new ByteArrayOutputStream();
ObjectOutputStream oout2 = new ObjectOutputStream(bout2);
oout2.writeObject(priKey);
oout2.flush();
oout2.close();//将priKey对象写入ByteArrayOutputStream
   
//得到ByteArrayInputStream,主要因为PreparedStatement.setBinaryStream()方法要求InputStream作为参数,如果采用pst.setBytes()方法向OLE对象写入byte将得到JDBC的Access数据不匹配异常
  
ByteArrayInputStream pubin=new ByteArrayInputStream(bout1.toByteArray());
ByteArrayInputStream priin=new ByteArrayInputStream(bout2.toByteArray());

//写入数据:
pst=con.prepareStatement("insert into MyRSAKeys(name,description,RSApublicKey,RSAprivateKey,create_data) values (?,?,?,?,?)");
pst.setString(1,"test");
pst.setString(2,"no");
pst.setBinaryStream(3,pubin,pubin.available());//pubin.available()获得流长度
pst.setBinaryStream(4,priin,priin.available());
pst.setString(5,new java.sql.Date(new java.util.Date().getTime()).toString());
pst.executeUpdate();

//读出数据
pst=con.prepareStatement("select * from MyRSAKeys");
ResultSet rs=pst.executeQuery();
while(rs.next()){
System.out.println(rs.getInt(1));
System.out.println(rs.getString(2));
System.out.println(rs.getString(3));

//从数据库中读出Bytes然后包装成ObjectInputStream,读出对象。
RSAPublicKey r=(RSAPublicKey)(new ObjectInputStream(new ByteArrayInputStream(rs.getBytes(4))).readObject());
RSAPrivateKey p = (RSAPrivateKey)(new ObjectInputStream(new ByteArrayInputStream(rs.getBytes(5))).readObject());
System.out.println(r);
System.out.println(p);
System.out.println(rs.getString(6));
}

//使用RSA密钥对象,加密test.txt文件得到密文encrypt_result.txt,解密得到明文decrypt_result.txt
File file = new File("test.txt");
FileInputStream in = new FileInputStream(file);
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] tmpbuf = new byte[1024];
int count = 0;
while ((count = in.read(tmpbuf)) != -1) {
bout.write(tmpbuf, 0, count);
tmpbuf = new byte[1024];
}
in.close();
byte[] orgData = bout.toByteArray();
byte[] raw = lyRSA.encrypt(p, orgData);
file = new File("encrypt_result.txt");
OutputStream out = new FileOutputStream(file);
out.write(raw);
out.close();
byte[] data = lyRSA.decrypt(r, raw);
File = new File("decrypt_result.txt");
out = new FileOutputStream(file);
out.write(data);
out.flush();


//程序完,测试通过,平台jdk1.5,Access2003,winXp sp3


结语:
 一般的,通过保存对象,我们可以保存各种类型数据到Access。

以上工作,欢迎大家指正其中错误

盘子060525

相关文章推荐

DAO-数据访问对象(Data Access Object) 模式

业务对象只应该关注业务逻辑,不应该关心数据存取的细节。数据访问对象必须实现特定的持久化策略(如,基于JDBC或Hibernate的持久化逻辑), 这样就抽出来了DAO层,作为数据源层,而之上的Doma...

SQlite数据库(4)---DAO(data access object)数据访问对象

SQlite数据库(1) SQlite数据库(2)—-android 操作 SQlite数据库(3)—API操作 实现步骤 1.实体类2.实体类DAOpublic class BookDao ...

DAO(Data Access Object ,数据访问对象)设计模式

DAO(Data Access Object ,数据访问对象)的主要功能是数据操作

java DAO(Data Access Object,DAO) 数据访问对象

DAO之我见:DAO是一种设计模式,提高代码灵活性。使用DAO之前,业务组件直接访问持久化数据。当持久化数据发生改变时(例如更换数据库厂商),此时业务组件要跟着改变。DAO的出现解决此类问题。DAO是...

android jni 使用object对象

  • 2011年12月13日 13:55
  • 96KB
  • 下载

VC使用ADO对象连接一个Access数据库

1、创建一个基于对话框的应用程序ADO 2、在对话框中添加一个按钮空间。ID:IDC_TEST。标题:测试连接 3、在stdafx.h中添加代码msado15.dll动态链接库导入到程序中。(红色...

Preserve Whole Object(保存对象完成)

你从某个对象中取出若干值,将它们作为某一次函数调用时的参数。 1.动机 有时候,你会讲来自同一对象的若干项数据作为参数,传递给某个函数。这样做的问题在于:万一将来被调用函数需要新的数据项,你就必须查...

iPhone/iOS中保存自定义对象(Custom Object/Custom Class)的数组(NSMutableArray/NSArray)到NSUserDefaults

【问题】 在折腾: 给Your Second iOS App:BirdWatching添加支持程序退出后,用户数据仍然保留 的过程中,遇到一个问题,需要将一个自定义对象的数组,保存到...
  • yuanya
  • yuanya
  • 2013年12月25日 17:34
  • 2684

jedis 保存自定义List和Object对象

1.新建抽象类,jdk1.8同样可以创建接口. public abstract class SerializeTranscoder { protected static Logger logger...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在access中保存使用对象(Object)
举报原因:
原因补充:

(最多只允许输入30个字)