數據庫存儲和查詢方法、屬性值獲取方法和設備的制造方法
【技術領域】
[0001]本發明總體上涉及數據庫領域,具體地涉及一種數據庫存儲和查詢方法、屬性值獲取方法和設備。更具體地,本發明涉及一種統一 Mysql與MongoDB存取方式的數據庫存儲和查詢方法、屬性值獲取方法和設備。
【背景技術】
[0002]Mysql是一種關系型數據庫管理系統,其將數據保存在不同的表中,通常為web系統最主要的持久化工具。MongoDB是一個基于分布式文件存儲的數據庫,是非關系型數據庫當中功能最豐富,與關系型數據庫最相似的。在web系統中,通常用Mongo存取長文本字段(即,字符長度大于255的字段)。
[0003]在編寫Java程序時,經常需要同時查詢Mysql和MongoDB的數據。現有技術通常采用以下方法:首先,使用Java Annotat1n(以下簡稱“Annotat1n”)技術對需要存放到MongoDB的Java屬性做標記;然后,將剩余需要映射到Mysql的Java屬性配置好iBatis ORM框架的配置文件;最后,在編寫Dao層代碼時使用指定API (Applicat1n ProgrammingInterface,應用程序編程接口)查詢數據,實現數據的組裝。這里使用的iBatis ORM框架是一個將Java對象和屬性映射成為數據庫的一條記錄和字段的映射框架。
[0004]圖1示出了該現有技術的具體實現步驟。如圖1所示,在步驟S110,調用API查詢數據。在步驟SI 20,根據查詢的Ja va實體找到對應的iBat i s配置文件,從Mysql中查詢出數據。在步驟S130,使用Java Annotat1n技術,判斷當前Java實體是否有屬于MongoDB的屬性,若有,進行到步驟S140,若無,進行到步驟S170,返回數據,結束查詢。在步驟S140,再次使用Java Anno tat 1n技術獲取到實體中的MongoDB屬性列表。在步驟SI 50,從MongoDB中查詢出關聯數據。在步驟S160,將Mysql和MongoDB查詢的數據做組裝。在步驟S170,返回數據,結束查詢。
[0005]現有技術方案在每次查詢時默認會把存儲在MongoDB中的數據讀取出來,不能靈活控制獲取MongoDB屬性的時機,導致MongoDB數據的讀取頻率很高,查詢延時明顯增加。
【發明內容】
[0006]本發明的一個方面提供了一種數據庫存儲方法,包括:根據與Java對象相對應的iBat is配置文件將Java對象中的Mysql屬性值存儲到Mysql數據庫,并獲取該Java對象在Mysql數據庫中的Mysql主鍵ID;確定Java對象中是否有要存儲到MongoDB數據庫的MongoDB屬性值;如果Java對象中沒有要存儲到MongoDB數據庫的MongoDB屬性值,則結束本次存儲;以及如果Java對象中有要存儲到MongoDB數據庫的MongoDB屬性值,則把要存儲到MongoDB數據庫的MongoDB屬性值與該Java對象的Mysql主鍵ID—起存入MongoDB數據庫中,結束本次存儲。
[0007]可選地,根據Java Anno tat 1n技術確定Java對象中是否有要存儲到MongoDB數據庫中的屬性值并確定該屬性值。
[0008]本發明的另一個方面提供了一種數據庫查詢方法,包括:根據與查詢的Java實體相對應的iBatis配置文件查詢Mysql數據庫中的Mysql屬性值;確定Java實體中是否含有MongoDB屬性;如果Java實體中不含有MongoDB屬性,貝Ij基于查詢到的Mysql屬性值返回查詢結果對象;以及如果Java實體中含有MongoDB屬性,貝Ij生成與所述MongoDB屬性相對應的按需加載代碼,所述按需加載代碼在被調用時,根據被查詢的Java對象的Mysql主鍵ID從MongoDB數據庫中查詢MongoDB屬性值,并且將Mysql屬性值和按需加載代碼組裝成代理對象,并返回該代理對象作為查詢結果對象。
[0009]可選地,使用Java Annotat1n技術確定Java實體中是否含有MongoDB屬性;并且/或者使用CGLIB技術生成所述按需加載代碼。
[0010]本發明的另一個方面提供了一種從根據如上所述的查詢結果對象獲取屬性值的方法,包括:確定要獲取的屬性值是否對應于MongoDB屬性;如果要獲取的屬性值不對應于MongoDB屬性,則返回該屬性值;以及如果要獲取的屬性值對應于MongoDB屬性,則根據查詢結果對象在Mysql中的主鍵ID到MongoDB數據庫中查詢該屬性值并返回該屬性值。
[0011 ]可選地,如果要獲取的屬性值對應于MongoDB屬性,則判斷該屬性值是否為空,如果該屬性值為空,則根據查詢結果對象在Mysql中的主鍵ID到MongoDB數據庫中查詢該屬性值并返回該屬性值,否則直接返回該屬性值。
[0012]可選地,該方法還包括:將查詢到的MongoDB屬性值賦值給相應的MongoDB屬性。
[0013]本發明的另一個方面提供了一種數據庫存儲設備,包括:用于根據與Java對象相對應的iBatis配置文件將Java對象中的Mysql屬性值存儲到Mysql數據庫,并獲取該Java對象在Mysql數據庫中的Mysql主鍵ID的裝置;用于確定Java對象中是否有要存儲到MongoDB數據庫的屬性值的裝置;用于如果Java對象中沒有要存儲到MongoDB數據庫的屬性值,則結束本次存儲的裝置;以及用于如果Java對象中有要存儲到MongoDB數據庫的屬性值,則把要存儲到MongoDB數據庫的屬性值與該Java對象的Mysql主鍵ID—起存入MongoDB數據庫中,結束本次存儲的裝置。
[00?4] 可選地,根據Java Annotat1n技術確定Java對象中是否有要存儲到MongoDB數據庫中的屬性值并確定該屬性值。
[0015]本發明的另一個方面提供了一種數據庫查詢設備,包括:用于根據與查詢的Java實體相對應的iBatis配置文件查詢Mysql數據庫中的Mysql屬性值的裝置;用于確定Java實體中是否含有MongoDB屬性的裝置;用于如果Java實體中不含有MongoDB屬性,貝Ij基于查詢到的Mysql屬性值返回查詢結果對象的裝置;以及用于如果Java實體中含有MongoDB屬性,則生成與所述MongoDB屬性相對應的按需加載代碼的裝置,所述按需加載代碼在被調用時,根據被查詢的Java對象的Mysql主鍵ID從MongoDB數據庫中查詢MongoDB屬性值,并且將Mysql屬性值和按需加載代碼組裝成代理對象,并返回該代理對象作為查詢結果對象。
[0016]可選地,使用Java Annotat1n技術確定Java實體中是否含有MongoDB屬性;并且/或者使用CGLIB技術生成所述按需加載代碼。
[0017]本發明的另一個方面提供了一種從如上所述的查詢結果對象獲取屬性值的設備,包括:用于確定要獲取的屬性值是否對應于MongoDB屬性的裝置;用于如果要獲取的屬性值不對應于MongoDB屬性,則返回該屬性值的裝置;以及用于如果要獲取的屬性值對應于MongoDB屬性,則根據查詢結果對象在Mysql中的主鍵ID到MongoDB數據庫中查詢該屬性值并返回該屬性值的裝置。
[0018]可選地,如果要獲取的屬性值對應于MongoDB屬性,則判斷該屬性值是否為空,如果該屬性值為空,則根據查詢結果對象在Mysql中的主鍵ID到MongoDB數據庫中查詢該屬性值并返回該屬性值,否則直接返回該屬性值。
[0019]可選地,該設備還包括:用于將查詢到的MongoDB屬性值賦值給相應的MongoDB屬性的裝置。
【附圖說明】
[0020]為了更完整地理解本發明及其優勢,現在將參考結合附圖的以下描述,其中:
[0021 ] 圖1示意性示出了現有技術的Mysql與MongoDB查詢方法。
[0022]圖2示意性示出了根據本發明實施例的數據庫存儲方法。
[0023]圖3示意性示出了根據本發明實施例的數據庫查詢方法。
[0024]圖4示意性示出了根據本發明實施例從查詢結果對象獲取屬性值的方法。
【具體實施方式】
[0025]根據結合附圖對本發明示例性實施例的以下詳細描述,本發明的其它方面、優勢和突出特征對于本領域技術人員將變得顯而易見。
[0026]在本