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

原创 2015年11月18日 14:53:26

背景

最近在做一个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();
        }
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

JavaWeb-1-IOS或Android客户端上传图片到Java服务端存到数据库,再从数据库取出下载下来的过程

前言:一直想写段代码实现IOS或Android客户端上传图片到Java服务端存到数据库,再从数据库取出下载下来的过程,今天终于忍不住将代码吐了出来,这里仅提供了Javaweb端servlet的响应代码...
  • IOT_LI
  • IOT_LI
  • 2015-10-17 12:01
  • 2744

Java读取接口数据并保存到数据库

public class Test05GetData { //guo sheng shi xian zhen cun的表结构完全一样。数据全部读取完毕之后再将数据整合到同一张表中 protecte...
  • umgsai
  • umgsai
  • 2016-02-04 11:02
  • 2187

java对象序列化并存储到文件和数据库

Java中要实现将对象保存起来持久化,需要让对象实现Serializable接口,这样就能将java对象用二进制流保存并恢复。下面我将以保存到文件和保存到mysql来进行解析。先给出序列化类的定义: ...

Mysql数据库:java对象的存入和查询

首先说明下我们实验的条件: 数据库中的表:books ,字段id(int) book(Blob二进制流) 连接方式:JDBC 定义一个简单的连接数据库的类: public class Data...

一个简单的java桌面应用:单机版IFTTT

本项目是由java编写的一款基于触发器-动作框架的IFTTT窗口程序。 用户可以指定this和that事件。当应用监测到this事件发生时,将自动执行that事件。

java设计模式、框架、架构、平台之间的关系

一、设计模式(Design Patterns)                                    ...

干货系列2:看看Java桌面应用开发的职业发展空间与必备技能

导读: 我前面两篇文章分别写了java软件开发和java互联网开发工程师的职业发展和技能要素,今天说一说Java桌面应用开发的程序员,他们一般来说对未来发展尤为困惑,确实,用Java可以创建出桌面应...

数据库中树结构数据,转换为Java对象树结构( 多叉树结构 )

总体就是图所表示所表示的转换,由数据库 => Java对象转换,代码比较简单,在之前的基础上又加了一个数据库查询方法queryListToMap(); //No.1.1 (推荐使用 运行时间较短) ...

Java对SQLite的"增删改查"

最近iOS的项目完工了,空闲下来,就学学Android和Java。这里先介绍Java对SQLite的使用。 主要分四步:增、删、改、查。

11. jsp与servlet之间页面跳转及参数传递实例

1.从一个jsp页面跳转到另一个jsp页面时的参数传递     (1)使用request对象获取客户端提交的信息     login.jsp页面代码如下: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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