您的位置:首页 > 编程语言 > Java开发

Java将对象直接在数据库中存取的方法

2015-11-18 14:53 417 查看
背景
java序列化与反序列化

JDBC

sqlite

详解

背景

最近在做一个java桌面应用的时候,考虑到要保存一些数据。

而我需要存储的类,其中有一些变量是object类型的,使用时需要动态解析。这就给存入数据库带来了一些麻烦。于是,我考虑把整个对象直接存入数据库。

java序列化与反序列化

Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。

JDBC

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。

sqlite

sqlite是一款轻量级的数据库,嵌入到程序的进程中执行,大大提高了效率。

我选用sqlite数据库来完成这一目的。

使用java控制sqlite数据库需要sqlite的JDBC,需自行安装。

详解

下面用一个demo来介绍整个过程。

public class SqliteDB {
Connection conn;
Statement stat;

//连接到数据库
public SqliteDB(){
try {
Class.forName("org.sqlite.JDBC");
conn=DriverManager.getConnection("jdbc:sqlite:ifttt.db");
stat=conn.createStatement();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

//Task是在别处定义的类。作为例子使用。
public Task readDB(){
try {
stat=conn.createStatement();
ResultSet rs = stat.executeQuery("select * from tasks;");
/*
*将数据库中的数据读到一个byte数组中
*通过ByteArrayInputStream传入ObjectInputStream中
*从ObjectInputStream读出object对象并强制转换成Task
*/
byte[] data=rs.getBytes(1);
ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(data);
ObjectInputStream objectInputStream=new ObjectInputStream(byteArrayInputStream);
Task task=(Task)(objectInputStream.readObject());
byteArrayInputStream.close();
objectInputStream.close();
rs.close();
stat.close();
conn.close();
return task;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
public void saveDB(Task task){
try {
stat.executeUpdate("drop table if exists tasks;");
stat.executeUpdate("create table tasks (task);");
PreparedStatement prep=conn.prepareStatement("insert into tasks values(?);");
/*
*使用ObjectOutputStream将对象序列化,
*传入ByteArrayOutputStream中,
*最后输出到一个byte类型的数组中
*而这样的数组可以直接存入数据库
*/
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(arrayOutputStream);
objectOutputStream.writeObject(task);
objectOutputStream.flush();
byte[] data=arrayOutputStream.toByteArray();
prep.setBytes(1, data);
prep.addBatch();
arrayOutputStream.close();
objectOutputStream.close();
conn.setAutoCommit(false);
prep.executeBatch();
conn.setAutoCommit(true);
stat.close();
conn.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: