关闭

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

标签: 数据库javasqlite序列化
3067人阅读 评论(1) 收藏 举报
分类:

背景

最近在做一个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();
        }
    }
}
1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:33200次
    • 积分:554
    • 等级:
    • 排名:千里之外
    • 原创:21篇
    • 转载:0篇
    • 译文:0篇
    • 评论:24条
    文章分类
    最新评论