数据持久化概念和Java数据持久化技术

什么是数据持久化

数据持久化是把程序中的数据以某种形式保存到某种存储介质中,达到程序重启时不丢失的作用。

Java持久化技术

序列化(Serialization)
序列化(Serialization)也叫串行化,是Java内置的持久化Java对象机制。
只要某个类实现了java.io.Serializable接口,就能够使用java.io.ObjectOutputStream将该类对象以二进制字节码的形式写到硬盘上,并能使用java.io.ObjectInputStream将该对象从硬盘上还原。这样,即使重启硬盘,数据也能从硬盘上恢复。
使一个普通Java类可序列化,要注意一下几方面:
1、类一定要实现Seriablizable标记接口,并声明一个private static final 的long类型的serialVersionUID属性。
2、类所有属性也要是可序列化的。
3、这样,可序列化的类可通过ObjectOutput类中的writeObject方法和readObject方法保存和读取。
如  以下是Java bean类:
package webDemo;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class Person implements Serializable {
	
	private static final long serialVersionUID = 5805021228954269035L;
	private String name;
	private List<String> hobys = new ArrayList<>();

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public List<String> getHobys() {
		return hobys;
	}

	public void setHobys(List<String> hobys) {
		this.hobys = hobys;
	}
	
	@Override
	public String toString() {
		return "姓名:"+name+",爱好:"+ hobys;
	}

}
一下是操作类PersonTest:

package webDemo;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.util.Arrays;

public class PersonTest {

	// 当前文件夹
	public static File directory = new File(System.getProperty("user.dir"));

	// 控制台输入
	public static String systemRead() throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		return br.readLine();
	}

	// 将person对象持久化到硬盘上
	public static void persist(Person person) throws IOException {
		File file = new File(directory, person.getName() + ".dat");
		ObjectOutput output = new ObjectOutputStream(new FileOutputStream(file));
		// 保存对象
		output.writeObject(person);
		output.close();
		System.out.println("文件保存在:" + file);
	}

	// 从硬盘上还原person对象
	public static Person load(String name) throws IOException, ClassNotFoundException {
		File file = new File(directory, name + ".dat");
		if (!file.exists())
			return null;
		ObjectInput ins = new ObjectInputStream(new FileInputStream(file));
		// 读取对象
		return (Person) ins.readObject();
	}

	// main方法
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		System.out.println("人员信息管理系统.");
		System.out.println("1、输入'save'开始录入人员信息.");
		System.out.println("2、输入'load'开始查询人员信息.");
		System.out.println("3、输入'exit'退出系统.");
		System.out.println("请输入(回车结束输入):");
		System.out.println("人员信息管理系统.");
		System.out.println("人员信息管理系统.");
		// 获取用户输入信息
		String menu = systemRead();
		// 如果输入为'save',则继续输入人员姓名、爱好
		if ("save".equals(menu)) {
			System.out.println("请输入要录入的人员姓名:");
			// 获取输入人员的姓名
			String name = systemRead();
			System.out.println("请输入'" + name + "'的爱好,用‘'’隔开:");
			// 获得输入人员的爱好
			String hobbies = systemRead();
			// 创建人员对象
			Person person = new Person();
			person.setName(name);
			person.setHobys(Arrays.asList(hobbies.split(",")));
			// 持久化人员对象
			persist(person);
			// 如果输入的为load,则继续查找人员的姓名,然后根据姓名查询该人员的信息
		} else if ("load".equals(menu)) {
			System.out.println("请输入要查找的人员的姓名:");
			// 获得输入人员的姓名
			String name = systemRead();
			// 根据姓名查询人员,并返回人员相关信息
			Person person = load(name);
			if (person == null) {
				System.out.println("没有此人信息。");
			} else {
				System.out.println("查询结果:" + person);
			}
			// 如果输入的为exit,则退出程序
		} else if ("exit".equals(menu)) {
			System.out.println("再见");
			System.exit(0);
			// 否则,提示错误信息
		} else {
			System.out.println("无效输入:" + menu);
		}

		System.out.println();
		// 继续执行main函数
		main(null);

	}
}

运行效果如下:

人员信息管理系统.
1、输入'save'开始录入人员信息.
2、输入'load'开始查询人员信息.
3、输入'exit'退出系统.
请输入(回车结束输入):
人员信息管理系统.
人员信息管理系统.
chunqiao
无效输入:chunqiao


人员信息管理系统.
1、输入'save'开始录入人员信息.
2、输入'load'开始查询人员信息.
3、输入'exit'退出系统.
请输入(回车结束输入):
人员信息管理系统.
人员信息管理系统.
save
请输入要录入的人员姓名:
chunqiao
请输入'chunqiao'的爱好,用‘'’隔开:
打球,旅行,打架
文件保存在:E:\workspace-sts\webDemo\chunqiao.dat


人员信息管理系统.
1、输入'save'开始录入人员信息.
2、输入'load'开始查询人员信息.
3、输入'exit'退出系统.
请输入(回车结束输入):
人员信息管理系统.
人员信息管理系统.
load
请输入要查找的人员的姓名:
chunqiao
查询结果:姓名:chunqiao,爱好:[打球,旅行,打架]


人员信息管理系统.
1、输入'save'开始录入人员信息.
2、输入'load'开始查询人员信息.
3、输入'exit'退出系统.
请输入(回车结束输入):
人员信息管理系统.
人员信息管理系统.


注,如果把实现序列化去掉,运行load会出错:
load
请输入要查找的人员的姓名:
chunqiao
Exception in thread "main" java.io.InvalidClassException: webDemo.Person; class invalid for deserialization
at java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(Unknown Source)
at java.io.ObjectStreamClass.checkDeserialize(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at webDemo.PersonTest.load(PersonTest.java:43)
at webDemo.PersonTest.main(PersonTest.java:77)
at webDemo.PersonTest.main(PersonTest.java:94)
at webDemo.PersonTest.main(PersonTest.java:94)
at webDemo.PersonTest.main(PersonTest.java:94)


补充说明:在实际运用中,tomcat的会话(Session)中使用的就是序列化技术。当tomcat关闭时候,tomcat会把Session中的Java对象通过序列化技术保存到硬盘上,这样,重启tomcat时候就会把硬盘上的Java对象还原并放回到session里。因此,保存在session中的对象最好实现Seriaizable。

JDBC
JDBC(Java Database Connectivity)是最常用的持久化技术,它能够把数据保存进关系型数据库,并且高效地从数据库中查询出来。
但是,JDBC并不直接支持对Java对象的持久化。使用JDBC技术,持久化Java对象时候可能需要用到sql代码,将数据保存到数据库中,如:

package webDemo;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

import jdk.internal.org.objectweb.asm.tree.TryCatchBlockNode;

public class PersonDao {

	public void persist(Person person) throws Exception {
		// 获取数据库连接
		Connection conn = DBManager.getConnection();
		java.sql.PreparedStatement preStmt = null;
		try {
			// 创建预编译对象
			preStmt = conn.prepareStatement("INSERT INTO tb_person (name) values (?) ");
			preStmt.setString(1, person.getName());
			// 插入一条人员数据
			preStmt.executeUpdate();
			// 分别插入爱好数据
			for (String hobby : person.getHobys()) {
				preStmt = conn.prepareStatement(" INSERT INTO tb_boby ( person_name, hoby ) values (?, ?)");
				preStmt.setString(1, person.getName());
				preStmt.setString(2, hobby);
				// 执行插入操作
				preStmt.executeUpdate();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			preStmt.close();
			conn.close();
		}
	}

}

通过以上代码可以看出,使用JDBC持久化Java对象需要编写大量sql语句,当数据表结构和Java对象属性发生变化时候,JDBC的缺点就更加明显了。

关系对象映射(ORM)
ORM是针对JDBC不能直接持久化Java对象的解决方案。ORM框架能够将Java对象映射到关系数据库,能够直接持久化复杂的Java对象。目前比较流行的ORM框架有hibernate、mybatis、TopLink。
对象数据库(ODB)

Java数据对象(JDO)
EJB2.X








  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春侨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值