持久化:某个对象的生命周期不依赖与程序的执行与否,这个对象以某种形式持久地存活在系统中,可随时被获取。

一、Java对象序列化

序列化是Java语言中内置的轻量级数据持久化机制,可将任何实现了java.io.Serializable接口的对象转化为连续的字节流数据,保存在文件中,或者通过网络进行传输,这些数据可被还原成原来的对象状态。

当对象被序列化时,Java将遍历对象图的闭包,将所有可访问的对象写入数据流中,如类成员标记被transient,则忽略该成员

public class SerializableTest extends TestCase{
   public void testSerialize() throws FileNotFoundException,IOException,ClassNotFoundException{
   
   //实现了java.io.Seralizable接口对象
   Product p = new Product(new Long(1),"Hibernate");
   
   //序列化对象
   ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("product.out"));
   oos.wirteObject(p);
   oos.close();
   
   //从文件中反序列化
   ObjectInputStream ois = new ObjectInputStream(new FileInputStream("product.out"));
   Product pi = (Product) ois.readObject();
   //判断是否和原来的对象相等
   assertEquals(1,pi.getId().intValue());
   assertEquals("Hibernate",pi.getName());
   ois.close();
   }
}
//持久类,实现java.io.Serializable接口

class Product implement java.io.Serializable{
    //类属性
	private Long id;
	private Sring name;
	public Product(Long id, String name){
	  this.id = id;
	  this.name = name;
	}
	//省略get\set方法
}
public class SerializableTest extends TestCase{
   public void testSerialize() throws FileNotFoundException,IOException,ClassNotFoundException{
   
   //实现了java.io.Seralizable接口对象
   Product p = new Product(new Long(1),"Hibernate");
   
   //序列化对象
   ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("product.out"));
   oos.wirteObject(p);
   oos.close();
   
   //从文件中反序列化
   ObjectInputStream ois = new ObjectInputStream(new FileInputStream("product.out"));
   Product pi = (Product) ois.readObject();
   //判断是否和原来的对象相等
   assertEquals(1,pi.getId().intValue());
   assertEquals("Hibernate",pi.getName());
   ois.close();
   }
}
//持久类,实现java.io.Serializable接口

class Product implement java.io.Serializable{
    //类属性
	private Long id;
	private Sring name;
	public Product(Long id, String name){
	  this.id = id;
	  this.name = name;
	}
	//省略get\set方法
}

对象序列化的局限性:


查询:当对象序列化到数据流后,读取对象时仅能返回数据流中的下一个对象,不能根据对象的特定属性进行查询;

部分读取或更新:序列化对象不提供部分读取和更新,必须一次将所有对象全部取出,不适合数据量较大的应用。

生命周期管理:序列化不提供对象生命周期刮泥,知识简单地读取和写入。

并发和事务:不提供并发和事务特性,多线程或者多个应用不能并发地、互不冲突地读写同一个序列化数据。

对象序列化仅适合简单应用,不适合企业级应用中的数据处理。

二、使用JDBC

配置MySql数据库驱动程序:

在Eclipse中新建一个Java项目,起名为“JDBCTest”,然后选择“Project”菜单下的“Properties”,进入到如下所示的界面。单击“Add External JARs...”按钮,找到刚才解压出来的Jar文件,完成后,配置对话框中就会多出一项“mysql-connector-java....”,单击下面的OK按钮,就完成和JDBC驱动在Eclipse项目中的添加。

JDBC是用来访问关系数据库系统的标准JAVA API。当需要保存数据到数据库或从数据库读取数据时,只需要使用java.sql包提供的API对应所需的业务逻辑操作:连接数据库、建立指令、进行查询、获取结果,即可完成所有的数据操作。JDBC只提供访问数据的接口,其底层实现由特定的数据库厂商实现。

JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 

 1、加载JDBC驱动程序: 

 2、提供JDBC连接的URL •连接URL定义了连接数据库时的协议、子协议、数据源标识。 •书写形式:协议:子协议:数据源标识 协议:在JDBC中总是以jdbc开始 子协议:是桥连接的驱动程序或是数据库管理系统名称。 数据源标识:标记找到数据库来源的地址与连接端口。 例如:(MySql的连接URL) jdbc:mysql: //localhost:3306/test?useUnicode=true&characterEncoding=gbk ; useUnicode=true:表示使用Unicode字符集。如果characterEncoding设置为 gb2312或GBK,本参数必须设置为true 。characterEncoding=gbk:字符编码方式。 3、创建数据库的连接 4、创建一个Statement •要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3 种类型: 1、执行静态SQL语句。通常通过Statement实例实现。 2、执行动态SQL语句。通常通过PreparedStatement实例实现。 3、执行数据库存储过程。通常通过CallableStatement实例实现。 具体的实现方式: Statement stmt = con.createStatement() ; PreparedStatement pstmt = con.prepareStatement(sql) ; CallableStatement cstmt = con.prepareCall("{CALL demoSp(? , ?)}") ; 5、执行SQL语句 Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate 和execute 1、ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。 2、int executeUpdate(String sqlString):用于执行INSERT、UPDATE或 DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等 3、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的语句。 具体实现的代码: ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ; int rows = stmt.executeUpdate("INSERT INTO ...") ; boolean flag = stmt.execute(String sql) ; 6、处理结果 两种情况: 1、执行更新返回的是本次操作影响到的记录数。 2、执行查询返回的结果是一个ResultSet对象。 • ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些 行中数据的访问。 • 使用结果集(ResultSet)对象的访问方法获取数据: while(rs.next()){ String name = rs.getString("name") ; String pass = rs.getString(1) ; // 此方法比较高效 } (列是从左到右编号的,并且从列1开始) 7、关闭JDBC对象 操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声 明顺序相反: 1、关闭记录集 2、关闭声明 3、关闭连接对象 if(rs != null){ // 关闭记录集 try{ rs.close() ; }catch(SQLException e){ e.printStackTrace() ; } } if(stmt != null){ // 关闭声明 try{ stmt.close() ; }catch(SQLException e){ e.printStackTrace() ; } } if(conn != null){ // 关闭连接对象 try{ conn.close() ; }catch(SQLException e){ e.printStackTrace() ; } }

public class JDBCTest extends TestCase{
   public void testJDBC() throws ClassNotFoundException{
         //JDBC驱动类
	     String mySqlJDBCDriver = "com.mysql.jdbc.Driver";
	     //定义连接数据库的协议、子协议、数据源标识
	     String mysqlUrl = "jdbc:mysql://localhost/petstore";
	     //用户名和密码
	     String userName = "root";
	     String password = "root";
	     Connection conn = null;
	     PreparedStatement Stmt = null;
	  
	    try{
	         //加载JDBC驱动,成功后会将Driver类的实例注册到DriverManager类中
		     Class.forName(mySqlJDBCDriver);
	    }catch(ClassNotFoundExceptiong e){
	     System.out.println("找不到驱动程序类,加载驱动失败");
		 e.printStactTrace();
	    }
	  
	    try{
	         //获取JDBC连接
		     conn = DriverManager.getConnection(url, userName,passward);
		      //设置当前连接事务为手动提交模式
		     conn.setAutoCommit(false);
             String sql = "insert into products(name,description) values(?,?)"; 
             Stmt = conn.prepareStatement(sql);
             Stmt.setString(1,"Hibernate");
             Stmt.setString(2,"ORM FrameWork");
             //插入数据
             Stmt.execute();
             conn.commit();
        }catch(SQLException e){
		     try{
			     //出现异常时,回滚当前事务
				 conn.rollback();
		    }catch(SQLException e1){
			    e1.printStackTrace();
			}
			e.printStackTrace();
		}finally{
		     //程序结束时,关闭JDBC连接
			 try{
			     if(Stmt != null)
				     Stmt.close();
				 conn.close();
		     }catch(SQLException e){
			    e.printStackTrace();
			}
		}
	}
}
public class JDBCTest extends TestCase{
   public void testJDBC() throws ClassNotFoundException{
         //JDBC驱动类
	     String mySqlJDBCDriver = "com.mysql.jdbc.Driver";
	     //定义连接数据库的协议、子协议、数据源标识
	     String mysqlUrl = "jdbc:mysql://localhost/petstore";
	     //用户名和密码
	     String userName = "root";
	     String password = "root";
	     Connection conn = null;
	     PreparedStatement Stmt = null;
	  
	    try{
	         //加载JDBC驱动,成功后会将Driver类的实例注册到DriverManager类中
		     Class.forName(mySqlJDBCDriver);
	    }catch(ClassNotFoundExceptiong e){
	     System.out.println("找不到驱动程序类,加载驱动失败");
		 e.printStactTrace();
	    }
	  
	    try{
	         //获取JDBC连接
		     conn = DriverManager.getConnection(url, userName,passward);
		      //设置当前连接事务为手动提交模式
		     conn.setAutoCommit(false);
             String sql = "insert into products(name,description) values(?,?)"; 
             Stmt = conn.prepareStatement(sql);
             Stmt.setString(1,"Hibernate");
             Stmt.setString(2,"ORM FrameWork");
             //插入数据
             Stmt.execute();
             conn.commit();
        }catch(SQLException e){
		     try{
			     //出现异常时,回滚当前事务
				 conn.rollback();
		    }catch(SQLException e1){
			    e1.printStackTrace();
			}
			e.printStackTrace();
		}finally{
		     //程序结束时,关闭JDBC连接
			 try{
			     if(Stmt != null)
				     Stmt.close();
				 conn.close();
		     }catch(SQLException e){
			    e.printStackTrace();
			}
		}
	}
}

三、使用JDO


四、实体EJB

五、对象关系映射ORM(Object Relation Mapping)

解决对象模型和关系模型的语义映射问题。包括三个层次:类属性和数据表字段的映射、类和数据库表的映射以及类之间的关联关系和数据库表的约束的映射。

对象映射技术:JBOSS的Hibernate、Oracle的TopLink、Apahce组织的Torque等

类《》表对象关系映射

一个完整的对象映射框架,一般应该具备以下四个方面:

一个元数据映射规范,负责持久化类、类属性和数据库表、字段的映射,实现对象和关系的语义连接;

一组对象操作接口,用于完成数据的添加、删除、修改和更新等操作;

一种面向对象的查询语言,该语言能理解继承、多态和关联等面向对象的特性,实现基于对象的查询并在对象之间导航。

一系列与数据库相关的技术实现和最佳时间,保证系统的完整性并提供系统的可用性和扩展性,比如:事务、缓存和数据抓取策略等。