作者:蔡世友 來源:www.easyjf.com
一、什么是對象-關系映射(ORM)?
對象-關系映射(Object/Relation Mapping,簡稱ORM),是隨著面向對象的軟件開發方法發展而產生的。面向對象的開發方法是當今企業級應用開發環境中的主流開發方法,關系數據庫是企業級應用環境中永久存放數據的主流數據存儲系統。對象和關系數據是業務實體的兩種表現形式,業務實體在內存中表現為對象,在數據庫中表現為關系數據。內存中的對象之間存在關聯和繼承關系,而在數據庫中,關系數據無法直接表達多對多關聯和繼承關系。因此,對象-關系映射(ORM)系統一般以中間件的形式存在,主要實現程序對象到關系數據庫數據的映射。
二、為什么要引入對象-關系映射中間件?
在開發關系數據庫的系統時,可以通過SQL語句讀取及操作關系數據庫數據。在Java領域,可以直接通過JDBC編程來訪問數據庫。JDBC可以說是JAVA訪問關系數據庫的最原始、最直接的方法。這種方式的優點是運行效率高,缺點是在Java程序代碼中嵌入大量SQL語句,冗余是不可避免的,開發人員常常發現自己在一次又一次地編寫相同的普通代碼,如獲得連接、準備語句、循環結果集以及其他一些 JDBC 特定元素,使得項目難以維護。特別是當涉及到非常多的關系數據表、需要在多個不同類型的關系數據庫系統中使用時,通過在程序中使用JDBC開發實施起來更加困難。
在開發基于數據應用為主的軟件系統時,引入對象-關系映射中間件是提高開發效率、提升軟件產品的可維護、擴展性的現實需要。實踐表明,在基于數據處理為主的企業級應程序開發中,通過引入對象-關系映射中間件,可以節省與對象持久化有關的差不多35%的編程工作量,同時提升軟件產品可維護及易擴展性,提升軟件產品質量。
因此,在開發企業級應用時,有必要通過引入對象-關系映射系統中間件,實現數據庫的快速開發。企業可以通過JDBC編程來開發單獨的持久化層,把數據庫訪問操作封裝起來,提供簡潔的API,供業務層統一調用,實現自己的ORM系統中間件。
當然,一個成熟的對象-關系映射中間件產品,不只是簡單的把內存中的對象持久化到數據庫、把數據庫中的關系數據加載到內存中,還要保證系統頻繁地訪問數據庫的性能,降低訪問數據庫的頻率,需要引入多線程、緩存、事務管理等很多細節,涉及到的技術比較復雜,因此,我們更多是使用市場上優秀的ORM系統中間件產品。
三、當前JAVA主流的對象-關系映射中間件產品?
對象關系映射程序(Object Relational Mappers,ORM)有多種形式。在 Java領域,大多數流行的 ORM 都可以實現完整的域模型映射,它的目標是將整層的對象和行為映射到數據庫表。當前主流的 ORM 中間件產品主要有:
Hibernate(重點推薦)
JDO
iBatis
EJB Entities 3
EJB Entity Beans 2.x
TopLink
在眾多的ORM中間件產品中,Hibernate是筆者重點推薦的。Hibernate是一個基于Java的開放源代碼的持久化中間件,它對JDBC做了輕量級封裝,不僅提供ORM映射服務,還提供數據查詢和數據緩存功能,Java開發人員可以方便地通過Hibernate API來操縱數據庫。現在,越來越多的Java開發人員把Hibernate作為企業應用和關系數據庫之間的中間件。
四、使用EasyDBO實現簡單的對象-關系映射
EasyDBO是由簡易java框架網(www.easyjf.com)開發的一個適合中小型軟件數據庫開發的java數據持久層框架,系統參考hibernate、JDO等,結合中小項目軟件的開發實際,實現簡單的Java對象到關系數據的映射。EasyDBO由于比較簡單,比較適合于中小企業及個人開發使用,EasyDBO當前還處于測試階段、是一個簡易但不太成熟的對象-關系映射開源中間件。
EasyDBO的源代碼非常簡單,有一點Java知識的人基本上都能讀懂,因此,選擇EasyDBO作本文的示例主要目的在于讓讀者快速進入ORM系統的世界,理解對象-關系數據庫實質及實現原理。
EasyDBO考慮的是最簡單的對象-關系映射,簡單到可以不使用任何配置文件就實現對象-關系的映射。EasyDBO源碼主要包括com.easyjf.dbo、com.easyjf.dbo.config、com.easyjf.dbo.sql三個包。其中com.easyjf.dbo是框架的核心、實現了對象-關系的轉換、JDBC API的封裝以及用戶接口支持等,com.easyjf.dbo.config實現配置文件的管理,com.easyjf.dbo.sql實現數據庫的簡單Sql語句的生成及多數據庫支持的擴展。
在當前推出的測試版本中,程序員使用EasyDBO操作數據庫主要關注EasyJDO類提供的方法及原數據對象DBObject類、IObject接口即可。
五、使用EasyDBO的開發數據庫應用程序示例
下面我們看看使用EasyDBO是怎么樣實現數據庫的開發。
假設一個留言版系統存放留言信息關系數據表(message)的結構為:
cid: varchar 16 主鍵
title: varchar 50
content: text
inputUser: varchar 16
inputTime: datetime
status: int
相應java中的類Message定義為
import java.util.Date;
import java.util.List;
import com.easyjf.dbo.EasyJDB;
import com.easyjf.dbo.IObject;
//實現com.easyjf.dbo.IObject接口從而使得你的對象無需要配置文件即可與關系數據表映射
public class Message implements IObject {
private String cid;
private String title;
private String content;
private String inputUser;
private Date inputTime;
private Integer status;
public String getTableName() {
return "message";
}
public String getKeyField() {
return "cid";
}
public String getKeyGenerator() {
return "com.easyjf.dbo.IdGenerator";
}
public String getCid() {
return cid;
}
public void setCid(String cid) {
this.cid = cid;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public java.util.Date getInputTime() {
return inputTime;
}
public void setInputTime(java.util.Date inputTime) {
this.inputTime = inputTime;
}
public String getInputUser() {
return inputUser;
}
public void setInputUser(String inputUser) {
this.inputUser = inputUser;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
//把對象持久化(保存)到關系數據庫中
public boolean save()
{
EasyJDB db=new EasyJDB();
return db.saveOrUpdate(this);
}
//從持久化存儲設備數據庫系統中永久刪除對象
public boolean del()
{
EasyJDB db=EasyJDB.getInstance();
return db.del(this);
}
//通過主鍵id從數據庫系統中讀取數據,返回一個對象
public static Message read(String cid)
{
EasyJDB db=EasyJDB.getInstance();
return (Message)db.get(Message.class,cid);
}
//通過sql從數據庫中查詢符合條件的數據,返回對象列表
public static List query(String sql)
{
EasyJDB db=EasyJDB.getInstance();
return db.query(Message.class,sql);
}
//應用演示代碼
public static void main(String[] args) {
Message m=new Message();
m.setTitle("標題");
m.setContent("內容");
m.setInputTime(new Date());
m.setInputUser("test");
m.setStatus(new Integer(1));
if(m.save())
{
System.out.print("成功把對象保存到關系數據庫中");
}
else
{
System.out.println("保存數據出錯!");
}
//查詢數據
List list=Message.query("1=1");
if(list!=null){
for(int i=0;i<list.size();i++)
{
Message message=(Message)list.get(i);
System.out.println("--------");
System.out.println("cid:"+message.getCid());
System.out.println("title:"+message.getTitle());
System.out.println("inputUser:"+message.getInputUser());
System.out.println("inputTime:"+message.getInputTime());
System.out.println("status:"+message.getStatus());
}
}
}
}
如上面的代碼所示,程序只需要通過EasyJDB的getInstance()方法得到一個實例,然后就可以通過EasyJDB對象的save、update、del、get、query等類似的方法進行數據庫的操作了。而程序員不用管具體的數據庫系統類型、不用管數據庫連接的獲取、數據庫資源的釋放、不用構造煩瑣無味的Sql添、刪、改、查語句。
關于數據源及配置文件:用戶可以通過EasyDBO的配置文件easyjf-dbo.xml文件配置數據庫連接數據源,也可以程序中設置數據源,還可通過IOC容器設置數據源。下面我們看看EasyDBO的數據源配置文件easyjf-dbo.xml的內容。
<easyjf-dbo>
<datasource id="bbs" type="org.apache.commons.dbcp.BasicDataSource">
<property name="easydbo.connection.driver_class">org.gjt.mm.mysql.Driver</property>
<property name="easydbo.connection.password">yourpassword</property>
<property name="easydbo.connection.url">jdbc:mysql://127.0.0.1:3306/easyjf</property>
<property name="easydbo.connection.username">root</property>
<property name="easydbo.dialect">com.easyjf.dbo.sql.MySqlQuery</property>
<property name="easydbo.optimize">true</property>
<property name="esyydbo.show_sql">true</property>
</datasource>
<tables>
<class>
</class>
</tables>
</easyjf-dbo>
假如用戶使用的是MS Sql Server數據為,把上面的的配置文件修改成如下的內容即可:
<easyjf-dbo>
<datasource id="bbs" type="org.apache.commons.dbcp.BasicDataSource">
<property name="easydbo.connection.driver_class">com.microsoft.jdbc.sqlserver.SQLServerDriver</property>
<property name="easydbo.connection.password">sa</property>
<property name="easydbo.connection.url">jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=easyjf;SelectMethod=cursor</property>
<property name="easydbo.connection.username">yourpassword</property>
<property name="easydbo.dialect">com.easyjf.dbo.sql.MSSqlServerQuery</property>
</datasource>
<tables>
<class>
</class>
</tables>
</easyjf-dbo>
六、選擇適合你的對象-關系映射中間件
不是功能最全,用得最多的中間件就一定適合您,當前流行的各種ORM中間件產品中,hibernate無疑是最為出色的產品,從系統的構架、性能及功能上都非常好。在大型分布市群集服務器運用領域,EJB Entity Beans是首選,因為其有廣泛的市場及運用基礎。當然,在小型的數據庫應用軟件領域,如一個新聞網站、一個簡單的網上商店、論壇系統等,筆者也推薦大家不防試試EasyDBO。作為初學者,筆者推薦大家使用EasyDBO,閱讀EasyDBO的源代碼,可以讓你快速掌握及了解ORM中間件的實質及工作原理,從而為學習及使用功能更加強大對象-關系映射中間件產品打下基礎。
更多完整的有關EasyDBO應用實例代碼,請通過官方網站www.easyjf.com下載。
(轉載請保留作者及來源信息)
posted on 2006-04-17 21:23
簡易java框架 閱讀(1040)
評論(1) 編輯 收藏