背景

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

}

}

}

java 对象 数据库中_Java将对象直接在数据库中存取的方法相关推荐

  1. java静态类如何赋值_Java class对象说明 Java 静态变量声明和赋值说明

    先看下JDK中的说明: java.lang.Object java.lang.ClassInstances of theclass Class represent classes and interf ...

  2. java访问对象的属性_java访问对象的属性和行为详细介绍

    每一个对象都会有属于自己的属性和行为,下面的文章就对java访问对象的属性和行为做了一下详细的介绍. 对象的属性和行为在类当中体现为成员变量和成员方法,其中成员变量对应对象的属性,成员方法对应对象的行 ...

  3. java判断空对象为空_Java判断对象是否为空(包括null ,)的方法

    本文实例为大家分享了Java判断对象是否为空的具体代码,供大家参考,具体内容如下 package com.gj5u.publics.util; import java.util.List; /** * ...

  4. java mysql教程基于_java基于jdbc连接mysql数据库功能实例详解

    本文实例讲述了java基于jdbc连接mysql数据库的方法.分享给大家供大家参考,具体如下: 一.JDBC简介 Java 数据库连接,(Java Database Connectivity,简称JD ...

  5. java 消息服务框架_Java消息服务 在 Spring Boot 中的使用

    原标题:Java消息服务 在 Spring Boot 中的使用 当前环境 Mac OS 10.11.x docker 1.12.1 JDK 1.8 SpringBoot 1.5 前言 基于之前一篇&q ...

  6. java opencv 读取视频_java使用OpenCV从视频文件中获取帧

    本文实例为大家分享了java使用OpenCV从视频文件中获取帧的具体代码,供大家参考,具体内容如下 实现功能:使用Java获取mp4.mov.avi等视频文件中的图像帧,每秒获取一帧图像,并保存 环境 ...

  7. word中添加java代码怎么写_Java如何在word文档中写一个段落?

    在Java编程中,如何在word文档中写一个段落? 注意:需要访问网址:http://poi.apache.org/download.html , 下载一个Apache POI软件包.这里下载最新版本 ...

  8. java hook 和反射_Java反射与hook混用反射某支付的方法

    反射某支付软件apk的方法 思路: 1.可以先取得某支付软件的classLoader,可以通过hook某支付软件的必须方法(如:LauncherActivity的attachBaseContext方法 ...

  9. java final修饰符_java final修饰符详解,final修饰方法

    之前给大家讲过java final修饰符final修饰变量方面的知识,那么下面要继续给大家讲到的就是final修饰方法方面的知识,一起来了解一下吧. final修饰的方法不能被重写,假如因为一些原因, ...

最新文章

  1. Mysql服务器问题(2013.3.5日发现)
  2. 百度广告点击软件_网络营销百问百答之64,如何提升企业百度广告点击率
  3. 关于人工智能引擎的最初分析文档
  4. javascript 相关小的知识点集合
  5. git克隆远程仓库的时候断电了,使用git-fetch断点续传
  6. oracle数据库选件,一句话为你解读Oracle数据库选件
  7. ORACLE 日期转换
  8. Atitit..jdk java 各版本新特性 1.0 1.1 1.2 1.3 1.4 1.5(5.0) 1.6(6.0) 7.0 8.0 9.0 attilax 大总结
  9. sis地址发布器_【一起练翻译-9.1】关于提词器、真实、川普和演讲
  10. 阿里巴巴大数据计算平台MaxCompute全套攻略
  11. 计算机服务无法启动,Win7系统下windows firewall服务无法启动怎么解决【图文】
  12. androrid按键事件
  13. rstudio文件保存_R 和 RStudio 的安装及 R Profile 的配置 amp; 初识 R 语言数据爬取
  14. RocketMQ的长轮询消费方式
  15. 思科交换机配置ipv6实验
  16. 3D灯光教程仅需三个步骤,用ThingJS体验极速开发!
  17. 把kali装到U盘里
  18. 地下管线探测重点与难点分析
  19. 解决:mysql报错ERROR 1049 (42000): Unknown database ‘数据库‘
  20. IncorrectResultSizeDataAccessException: Incorrect result size: expected 1, actual 2

热门文章

  1. Flume-NG源码分析-整体结构及配置载入分析
  2. 数据结构总结1(火车进栈/兔子与兔子/括号画家/Editor/邻值查找/最大子序和/前缀统计/Phone List/The XOR Largest Pair)
  3. ECC椭圆曲线加解密原理详解(配图)
  4. 今日软件分享:可以自动生成自画像的软件
  5. 转载:房价暴涨:欧美很紧张 中国一点都不急
  6. mysql常用employee表数据
  7. 前端自动打包部署服务器
  8. 网络优化推广公司如何控制客户网站的网络流量?
  9. sql建表+主键+外键
  10. 各占半壁江山 Apple Pencil和S Pen谁更有优势