張磊
摘要:隨著計(jì)算機(jī)技術(shù)的發(fā)展,在應(yīng)用領(lǐng)域,越愛越多的應(yīng)用技術(shù)要接觸到大數(shù)據(jù),在PB級(jí)數(shù)據(jù)面前,傳統(tǒng)關(guān)系型數(shù)據(jù)庫的問題逐漸凸顯出來。隨著而來的面向?qū)ο髷?shù)據(jù)庫應(yīng)運(yùn)而生。針對(duì)面向?qū)ο髷?shù)據(jù)與關(guān)系型數(shù)據(jù)之間的信息交互問題,該文分析了如何利用ORM技術(shù)實(shí)現(xiàn)面向?qū)ο髷?shù)據(jù)與關(guān)系型數(shù)據(jù)之間的信息交互,并舉例說明。
關(guān)鍵詞:面向?qū)ο髷?shù)據(jù);ORM;關(guān)系型數(shù)據(jù);應(yīng)用
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2017)06-0144-02
1 概述
隨著計(jì)算機(jī)技術(shù)的發(fā)展,在應(yīng)用領(lǐng)域,越來越多的應(yīng)用技術(shù)要接觸到大數(shù)據(jù)。在PB級(jí)數(shù)據(jù)的面前,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫的問題越來越多地被暴露了出來。效率低下、可擴(kuò)展性差、使用復(fù)雜以及與當(dāng)下流行的面向?qū)ο蠹夹g(shù)不適應(yīng)等等問題。
在大數(shù)據(jù)時(shí)代下,面向?qū)ο髷?shù)據(jù)庫得到了廣泛的應(yīng)用。面向?qū)ο髷?shù)據(jù)庫與生俱來就與當(dāng)下流程面向?qū)ο蠹夹g(shù)相輔相成,在設(shè)計(jì)之初,就已經(jīng)考慮到大數(shù)據(jù)所帶來的性能消耗問題。所以在大數(shù)據(jù)面前,面向?qū)ο髷?shù)據(jù)庫具有較大的優(yōu)勢(shì)。[1]
但是由于傳統(tǒng)關(guān)系型數(shù)據(jù)庫在過去很長(zhǎng)的一段時(shí)間當(dāng)中,都占領(lǐng)了數(shù)據(jù)庫市場(chǎng)的絕大部分份額。即使在當(dāng)下大數(shù)據(jù)時(shí)代,市面上大部分系統(tǒng)所用的數(shù)據(jù)庫也都為關(guān)系型數(shù)據(jù)庫。比如Oracle、SQL Server、MySQL、DB2等傳統(tǒng)關(guān)系型數(shù)據(jù)庫。由于新老數(shù)據(jù)技術(shù)的交替所帶來的問題也就油然而生,最主要的問題之一就是傳統(tǒng)關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)與面向?qū)ο笮蛿?shù)據(jù)庫的數(shù)據(jù)之間的交互問題。[2]這個(gè)問題是一個(gè)另廣大開發(fā)人員頭痛的問題,由于每個(gè)系統(tǒng)的業(yè)務(wù)邏輯不同,沒有一個(gè)通用的解決方案,所以一般關(guān)系型數(shù)據(jù)與面向?qū)ο髷?shù)據(jù)進(jìn)行數(shù)據(jù)交互都是特定問題特定分析。這種解決方式不僅僅適用于單獨(dú)系統(tǒng),不具備通用性,而且更多的是為企業(yè)帶來開發(fā)成本提高,開發(fā)效率下降等現(xiàn)實(shí)問題。
2 面向?qū)ο笮蛿?shù)據(jù)庫與關(guān)系型數(shù)據(jù)庫中數(shù)據(jù)的特點(diǎn)
面向?qū)ο笮蛿?shù)據(jù)庫是基于面向?qū)ο蠹夹g(shù)發(fā)展起來的,面向?qū)ο蠹夹g(shù)的核心觀點(diǎn)是“世間萬物皆為對(duì)象”,其中對(duì)象是一個(gè)核心概念,任何一個(gè)事物都被認(rèn)為是一個(gè)對(duì)象而存在,比如桌子是一個(gè)對(duì)象,它存在材質(zhì)、大小、顏色、價(jià)格等屬性,可以用于書寫、吃飯、游戲等方法,多個(gè)桌子即可以表示為桌子對(duì)象數(shù)組。將同一類具有相同的屬性和方法的事物用類的方式封裝起來,在面向?qū)ο蠹夹g(shù)中,類還可以被繼承,利用繼承的方式實(shí)現(xiàn)對(duì)象屬性和方法的重用,模擬現(xiàn)實(shí)世界中復(fù)雜的事物行為。這種設(shè)計(jì)方式最顯著的特點(diǎn)就是事物與事物之間的關(guān)聯(lián)性最大程度的降低,即低耦合,事物間的關(guān)聯(lián)性降低,數(shù)據(jù)與代碼之間的關(guān)聯(lián)性降低對(duì)于存儲(chǔ)而言更加輕松方便。面向?qū)ο笮蛿?shù)據(jù)庫就是將這些事物以對(duì)象的形式存起來,所以面向?qū)ο笮蛿?shù)據(jù)庫的存儲(chǔ)基本單元可以認(rèn)為是對(duì)象。
而關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)是傳統(tǒng)的矩陣的形式即行與列,但是現(xiàn)實(shí)世界的事物很難全部都用簡(jiǎn)單的行與列來表示。即使表示出來,也是用了非常復(fù)雜的數(shù)據(jù)結(jié)構(gòu)進(jìn)行表示。[3]比如表與表之間的具有多對(duì)多、一對(duì)一、一對(duì)多等多種情況,這種復(fù)雜的表示方式帶來的問題就是難以解析,尤其在大數(shù)據(jù)面前,即使每條數(shù)據(jù)的解析時(shí)間相差毫秒級(jí),在PB級(jí)的數(shù)據(jù)面前性能消耗也是開發(fā)人員承擔(dān)不起的。
3 利用ORM技術(shù)實(shí)現(xiàn)對(duì)象化數(shù)據(jù)與關(guān)系型數(shù)據(jù)之間的交互應(yīng)用
ORM(Object Relation Mapping),即對(duì)象關(guān)系映射,是用來把對(duì)象模型表示的對(duì)象映射到基于SQL的關(guān)系模型數(shù)據(jù)結(jié)構(gòu)當(dāng)中。這種技術(shù)可以讓開發(fā)人員只關(guān)心對(duì)象即可,不需要操作復(fù)雜的SQL語句。相反的,將利用SQL語句從關(guān)系型數(shù)據(jù)庫當(dāng)中取出來的數(shù)據(jù)轉(zhuǎn)變?yōu)閷?duì)象,開發(fā)人員也是可以直接利用對(duì)象來進(jìn)行業(yè)務(wù)層的業(yè)務(wù)邏輯運(yùn)算即可。
以關(guān)系型數(shù)據(jù)表1為例:
books表為圖書表,表中有如下字段,bookid書序列、title書名、isbn、author作者、unitprice單價(jià)、ctgcode書類別。非常簡(jiǎn)單的一種關(guān)系型數(shù)據(jù)表結(jié)構(gòu)。在面向?qū)ο蟮氖澜缰?,可以將books表定義為books對(duì)象,其中有bookid、title、isbn、author、unitprice、ctgcode屬性以及相應(yīng)的get、set方法。建立books對(duì)象代碼如下:
publicclass Books {
private Long bookid;
private String title;
private String isbn;
private String author;
private Double unitprice;
private String ctgcode;
public Long getBookid() {
returnbookid;}
publicvoid setBookid(Long bookid) {
this.bookid = bookid;}
public String getTitle() {
returntitle;}
publicvoid setTitle(String title) {
this.title = title;}
public String getIsbn() {
returnisbn;}
publicvoid setIsbn(String isbn) {
this.isbn = isbn;}
public String getAuthor() {
returnauthor;}
publicvoid setAuthor(String author) {
this.author = author;}
public Double getUnitprice() {
returnunitprice;}
publicvoid setUnitprice(Double unitprice) {
this.unitprice = unitprice;}
public String getCtgcode() {
returnctgcode;}
publicvoid setCtgcode(String ctgcode) {
this.ctgcode = ctgcode;}}
以關(guān)系型數(shù)據(jù)庫MySQL為例,將books表中的關(guān)系型數(shù)據(jù)轉(zhuǎn)換為Books對(duì)象。其代碼如下:
List
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/booksale?user=root&password=111111&useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false";
Connection con = DriverManager.getConnection(url);
Statement stmt = con.createStatement();
String query = "select * from books";
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
Books book=new Books();
Long bookid = rs.getLong("bookid");
book.setBookid(bookid);
String title = rs.getString("title");
book.setTitle(title);
String isbn = rs.getString("isbn");
book.setIsbn(isbn);
String author = rs.getString("author");
book.setAuthor(author);
Double unitprice = rs.getDouble("unitprice");
book.setUnitprice(unitprice);
String ctgcode = rs.getString("ctgcode");
book.setCtgcode(ctgcode);
list.add(book);}
} catch (Exception e) {
e.printStackTrace();}
利用Java的JDBC技術(shù)連接MySQL數(shù)據(jù)庫,取出books表的數(shù)據(jù),將字段值通過set方法放到Books對(duì)象中。由于一張表中一般不可能只有一條數(shù)據(jù),但是在面向?qū)ο螽?dāng)中Books對(duì)象只代表一個(gè)對(duì)象,對(duì)應(yīng)到數(shù)據(jù)庫當(dāng)中即一條數(shù)據(jù)。所以在程序中加入List數(shù)組,數(shù)組里的元素是Books對(duì)象。
4 結(jié)論
基于ORM技術(shù)的面向?qū)ο髷?shù)據(jù)與關(guān)系型數(shù)據(jù)之間的信息交互問題,在實(shí)際應(yīng)用中,往往不會(huì)如此簡(jiǎn)單,由于數(shù)據(jù)交互的信息量比較大。一般在開發(fā)當(dāng)中,代碼在編寫時(shí)都是以數(shù)據(jù)庫字段未知,對(duì)象屬性未知的情況下編寫。這種編寫方式才可以使代碼更加通用,相應(yīng)的數(shù)據(jù)庫字段,對(duì)象屬性等信息通過XML配置文件或者是注解標(biāo)記等方式告知程序。在Java代碼中會(huì)以反射技術(shù)去開發(fā)這方面代碼,比如當(dāng)下比較流行的Hibernate,MyBatis等框架都是基于此開發(fā)的。
參考文獻(xiàn):
[1] 柴晟. 數(shù)據(jù)庫技術(shù)發(fā)展的新方向——面向?qū)ο蟮臄?shù)據(jù)庫系統(tǒng)[J].成都航空職業(yè)技術(shù)學(xué)院學(xué)報(bào),2013(4).
[2] 楊玉芬.李明明.高曉旸.對(duì)象管理在面向?qū)ο髷?shù)據(jù)庫中的應(yīng)用研究[J].吉林大學(xué)學(xué)報(bào),2013(9).
[3] 應(yīng)建. 面向?qū)ο蟮臄?shù)據(jù)庫技術(shù)研究[J].電腦知識(shí)與技術(shù),2011(6).