Java将对象直接在数据库中存取的方法
2015-11-18 14:53
417 查看
背景
java序列化与反序列化
JDBC
sqlite
详解
而我需要存储的类,其中有一些变量是object类型的,使用时需要动态解析。这就给存入数据库带来了一些麻烦。于是,我考虑把整个对象直接存入数据库。
我选用sqlite数据库来完成这一目的。
使用java控制sqlite数据库需要sqlite的JDBC,需自行安装。
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(); } } }
相关文章推荐
- Java SE\EE\ME区别-下载什么jdk
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- Spring 中的TransactionTemplate
- Eclipse快捷键大全
- 深入浅出Java集合HashMap
- PhoneGap插件调用Java流程源码分析(一)
- java.util.Date与java.sql.Date的关系和转换方法(转)
- Java 并发包中的读写锁及其实现分析
- 用this调用类的构造方法
- java web代码规范:
- Spring Test 整合 JUnit 4 使用总结
- SAXParseException
- MyEclipse:一些比较重要的配置
- java Map集合学习
- SpringMVC 数据绑定
- java向数据库中插入数据,数据库乱码问题解决
- Java邮件发送程序(可以同时发给多个地址、可以带附件)
- Java环境的搭建
- java入门--java连接SQLServer数据库
- Myeclipse错误:Errors occurred during the build. 解决方法