物件導向是從軟體工程基本原則(如耦合、彙總和封裝)的基礎上發展起來的,而關聯式資料庫則是從數學理論發展而來的,兩套理論存在顯著的區別,而Java是完全物件導向的語言,這個衝突就表現的越發明顯。
對目前的J2EE資訊化系統而言,通常採用物件導向分析和物件導向設計的過程。系統從需求設計到系統設計都是按物件導向方式進行。但到了詳細設計階段,由於資料持久化需要儲存到關聯式資料庫,不得不自底向上修改設計方案,又回到了按照過程進行編程的老路上來,這是非常令人沮喪的。
如代碼9.2展示的是由資料庫中查詢資料,按條讀取結果集中每一個欄位,然後裝配成對象,而代碼9.3展示的是相反的情況,把一個對象儲存到資料庫中。需要把對象的每一個屬性拆出來,拼湊成SQL字串,再提交資料庫。這個來迴轉換的過程煩瑣而且極容易錯,對於一個物件導向的程式如噩夢一般。
代碼9.2 查詢資料庫組裝對象
List persons = new Arraylist(); ResultSet rs = stmt.executeQuery("SELECT * FROM person"); // 對結果集進行處理 while (rs.next()) { Person person = new Person int id = rs.getInt("id"); String name = rs.getString("name"); Integer age = rs.getObject("age") == null null : rs.getInt("age"); person.setId(id); person.setName(name); persion.setAget(age); Persons.add(person); } |
代碼9.3 儲存對象到資料
String sql = "insert into t_person (id, name, age) values ("+person.getId+", "+person.getName()+", "+person.getAge()+")"; Statement stmt = con.createStatement(); stmt.executeUpdate(sql) con.commit() |
優秀的物件導向開發人員厭倦了這種重複性的勞動,開始採用通常的“積極”偷懶做法,即建立工具,使整個過程自動化,協助開發人員只關心對象而不必考慮資料庫的結構。對於關聯式資料庫來說,這種努力的最大成果就是下一節要介紹的對象/關係映射(ORM)工具。