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

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

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

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

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

利用Java进行MySql数据库的导入和导出

利用Java来进行Mysql数据库的导入和导出的总体思想是通过Java来调用命令窗口执行相应的命令。   MySql导出数据库的命令如下: Sql代码   ...

使用JDBC将查询结果集保存为对象时需要注意的问题

编写这样一个方法: public static User getUser(String str) throws SQLException{ User user = new User(); Connec...
  • timhyde
  • timhyde
  • 2016年08月23日 16:53
  • 576

使用JDBC将一个对象保存到数据库

今天在做项目的过程中遇见一个需求: 我有一个角色对象Role,对应数据库中的表role,字段和对象的属性一一对应,现在要实现一个方法saveRole(Role role)。 查了很多资料,但是也没...

JDBC事务及将查询结果封装成对象(通用)

事务(ACID): 1、 原子性(atomicity):组成事物处理的语句形成了一个逻辑单元,不能只执行其中的一部分; 2、 一致性(consistency):在事务处理执行前后,数据库是一致的(...

使用JDBC 插入向数据库插入对象

package com.ctl.util; import java.io.IOException; import java.lang.reflect.Field; import java.lang....
  • CTLLIN
  • CTLLIN
  • 2014年05月09日 01:19
  • 8104

JDBC:数据库自定义类型与Java类的映射—将对象存储在关系数据库中(二)

这里利用PostgreSQL扩展的JDBC方法进行数据库

将Java对象存储到Oracle数据库中

将Java对象存储到Oracle数据库中

Java序列化对象的存储和读取

本文对javaIO流中序列化徐对象的写入和读取方法做示例演示。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java将对象直接在数据库中存取的方法
举报原因:
原因补充:

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