持久化:某個對象的生命週期不依賴與程序的執行與否,這個對象以某種形式持久地存活在系統中,可隨時被獲取。 java
1、Java對象序列化 mysql
序列化是Java語言中內置的輕量級數據持久化機制,可將任何實現了java.io.Serializable接口的對象轉化爲連續的字節流數據,保存在文件中,或者經過網絡進行傳輸,這些數據可被還原成原來的對象狀態。 sql
當對象被序列化時,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方法 }
查詢:當對象序列化到數據流後,讀取對象時僅能返回數據流中的下一個對象,不能根據對象的特定屬性進行查詢; 緩存
部分讀取或更新:序列化對象不提供部分讀取和更新,必須一次將全部對象所有取出,不適合數據量較大的應用。 網絡
生命週期管理:序列化不提供對象生命週期刮泥,知識簡單地讀取和寫入。 多線程
併發和事務:不提供併發和事務特性,多線程或者多個應用不能併發地、互不衝突地讀寫同一個序列化數據。 閉包
對象序列化僅適合簡單應用,不適合企業級應用中的數據處理。 併發
2、使用JDBC app
配置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個步驟:
一、加載JDBC驅動程序:
二、提供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:字符編碼方式。 三、建立數據庫的鏈接 四、建立一個Statement •要執行SQL語句,必須得到java.sql.Statement實例,Statement實例分爲如下3 種類型: 一、執行靜態SQL語句。一般經過Statement實例實現。 二、執行動態SQL語句。一般經過PreparedStatement實例實現。 三、執行數據庫存儲過程。一般經過CallableStatement實例實現。 具體的實現方式: Statement stmt = con.createStatement() ; PreparedStatement pstmt = con.prepareStatement(sql) ; CallableStatement cstmt = con.prepareCall("{CALL demoSp(? , ?)}") ; 五、執行SQL語句 Statement接口提供了三種執行SQL語句的方法:executeQuery 、executeUpdate 和execute 一、ResultSet executeQuery(String sqlString):執行查詢數據庫的SQL語句,返回一個結果集(ResultSet)對象。 二、int executeUpdate(String sqlString):用於執行INSERT、UPDATE或 DELETE語句以及SQL DDL語句,如:CREATE TABLE和DROP TABLE等 三、execute(sqlString):用於執行返回多個結果集、多個更新計數或兩者組合的語句。 具體實現的代碼: ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ; int rows = stmt.executeUpdate("INSERT INTO ...") ; boolean flag = stmt.execute(String sql) ; 六、處理結果 兩種狀況: 一、執行更新返回的是本次操做影響到的記錄數。 二、執行查詢返回的結果是一個ResultSet對象。 • ResultSet包含符合SQL語句中條件的全部行,而且它經過一套get方法提供了對這些 行中數據的訪問。 • 使用結果集(ResultSet)對象的訪問方法獲取數據: while(rs.next()){ String name = rs.getString("name") ; String pass = rs.getString(1) ; // 此方法比較高效 } (列是從左到右編號的,而且從列1開始) 七、關閉JDBC對象 操做完成之後要把全部使用的JDBC對象全都關閉,以釋放JDBC資源,關閉順序和聲 明順序相反: 一、關閉記錄集 二、關閉聲明 三、關閉鏈接對象 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(); } } } }3、使用JDO
4、實體EJB
5、對象關係映射ORM(Object Relation Mapping)
解決對象模型和關係模型的語義映射問題。包括三個層次:類屬性和數據表字段的映射、類和數據庫表的映射以及類之間的關聯關係和數據庫表的約束的映射。
對象映射技術:JBOSS的Hibernate、Oracle的TopLink、Apahce組織的Torque等
類《》表對象關係映射
一個完整的對象映射框架,通常應該具有如下四個方面:
一個元數據映射規範,負責持久化類、類屬性和數據庫表、字段的映射,實現對象和關係的語義鏈接;
一組對象操做接口,用於完成數據的添加、刪除、修改和更新等操做;
一種面向對象的查詢語言,該語言能理解繼承、多態和關聯等面向對象的特性,實現基於對象的查詢並在對象之間導航。
一系列與數據庫相關的技術實現和最佳時間,保證系統的完整性並提供系統的可用性和擴展性,好比:事務、緩存和數據抓取策略等。