30分鐘內使用MongoDB

最近,我被NoSQL錯誤咬住了-或是我的同事Mark Atwell提出的“燃燒在哪里!” 運動。 盡管我無意于在不久的將來或可預見的將來回避友好的“ SELECT ... WHERE”,但我確實設法弄懂了一些代碼。 在本文中,我分享了我在NoSQL世界中首次嘗試的知識。

在本文中,我們的目標是啟動并運行能夠與MongoDB進行交互的基本Java應用程序。 就其本身而言,這并不是一項艱巨的任務,也許您可??以在10分鐘內完成。 單擊此處或單擊此處或單擊此處 ,以獲得一些出色的材料。 但是,我想進一步推動它。

我想添加ORM支持。 我已為本文選擇了Morphia 。 我還想添加DAO模式,單元測試和日志記錄。 簡而言之,我想感覺到,“幾乎就像”我們大多數人使用Java,Hibernate和Oracle為企業應用程序編寫的那種代碼。 并且,我們將嘗試在30分鐘內完成所有這些操作。

我的意圖是讓Java + RDBMS開發人員放心,Java + NoSQL并不是很陌生。 這是相似的代碼,易于嘗試。 在這一點上可能需要補充一點,即我與NoSQL沒有親和力,RDBMS也沒有問題。 我相信它們都有自己的用途( 單擊此處以獲取一些出色的材料)。 作為技術專家,我只是喜歡更好地了解自己的工具,以便為自己的職業伸張正義。 本文僅旨在幫助志趣相投的人們在NoSQL中投入腳步。

好的,足夠說話了。 讓我們開始吧。 在遵循本文之前,您將需要一些軟件/工具。 下載并安裝 MongoDB服務器(如果尚未安裝) 。 我假設您有Java,一些Java IDE以及構建和發布工具。 我在本文中使用jdk 7,Eclipse(STS)和Maven 3。

我首先使用Maven創建一個香草標準Java應用程序。 我喜歡為此使用批處理文件。

文件:codeRepo \ MavenCommands.bat

ECHO OFFREM =============================
REM Set the env. variables.
REM =============================
SET PATH=%PATH%;C:\ProgramFiles\apache-maven-3.0.3\bin;
SET JAVA_HOME=C:\ProgramFiles\Java\jdk1.7.0REM =============================
REM Create a simple java application.
REM =============================
call mvn archetype:create ^-DarchetypeGroupId=org.apache.maven.archetypes ^-DgroupId=org.academy ^-DartifactId=dbLayer002pause

將其導入Eclipse。 確保可以使用Maven進行編譯和運行。

mvn -e clean install.

這應該編譯代碼并運行默認測試。 一旦克服了這一障礙,現在讓我們開始一些編碼。 讓我們創建一個Entity對象作為開始。 我認為使用fname的Person類可以達到我們的目的。 我承認這很簡單,但是可以完成教程。

文件:/dbLayer002/src/main/java/org/academy/entity/Person.java

package org.academy.entity;public class Person {private String fname;[...]
}

為了簡潔起見,我沒有提到吸氣劑和吸氣劑。

現在,讓我們獲取MongoDB Java驅動程序并將其附加到應用程序。 我喜歡讓Maven為我做這件事。 您顯然也可以手動執行此操作。 你的選擇。 我很懶。

文件:/dbLayer002/pom.xml

[...]
<!-- MongDB java driver to hook up to MongoDB server -->
<dependency><groupId>org.mongodb</groupId><artifactId>mongo-java-driver</artifactId><version>2.7.3</version>
</dependency>
[...]

這將使我們能夠編寫一個util類來連接到MongoDB服務器實例。 我假設您已經使用默認設置在服務器中啟動并運行了服務器。

文件:/dbLayer002/src/main/java/org/academy/util/MongoUtil.java

public class MongoUtil {private final static Logger logger = LoggerFactory.getLogger(MongoUtil.class);private static final int port = 27017;private static final String host = "localhost";private static Mongo mongo = null;public static Mongo getMongo() {if (mongo == null) {try {mongo = new Mongo(host, port);logger.debug("New Mongo created with [" + host + "] and ["+ port + "]");} catch (UnknownHostException | MongoException e) {logger.error(e.getMessage());}}return mongo;}
}

我們需要在我們的應用程序中設置記錄器,以便此類編譯。 單擊此處獲取有關日志記錄的文章。 我們需要做的就是用正確的依賴關系連接Maven。

文件:/dbLayer002/pom.xml

[...]
<slf4j.version>1.6.1</slf4j.version>
[...]
<!-- Logging -->
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version>
</dependency>
<dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>${slf4j.version}</version><scope>runtime</scope>
</dependency>
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j.version}</version><scope>runtime</scope>
</dependency>

而且,我們將需要確切指定要記錄的內容。

文件:/dbLayer002/src/java/resources/log4j.properties

# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1# configure A1 to spit out data in console
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

至此,您已經具有一個Entity類和一個實用程序類來連接數據庫。 理想情況下,我將去編寫DAO,然后以某種方式使用ORM將DAO與數據庫連接起來。 但是,Morphia具有一些出色的DAO支持。 它還具有一些注釋,可以將實體與數據庫元素綁定在一起。 因此,盡管我希望Entity和DAO完全不了解ORM和數據庫,但在這里情況并非如此。 我從表面上知道,這聽起來像Morphia或MongoDB迫使我偏離良好的代碼結構,讓我趕緊補充一點,這并不比其他ORM差,例如帶有注釋的Hibernate也會迫使我做同樣的妥協。

因此,讓我們在圖片中引入Morphia。 進入階段,我們永遠有用的工具Maven。 這里有點可避免的障礙。 在編寫此文檔時,無法在中央Maven存儲庫中獲得所需的Morphia版本。 因此,我必須將Maven配置為也使用Morphia存儲庫。 希望這只是暫時的情況。

文件:/dbLayer002/pom.xml

[...]
<!-- Required for Morphia -->
<repositories><repository><id>Morphia repository</id><url>http://morphia.googlecode.com/svn/mavenrepo/</url></repository>
</repositories>
[...]
<!-- Morphia - ORM for MongoDB -->
<dependency><groupId>com.google.code.morphia</groupId><artifactId>morphia</artifactId><version>0.98</version>
</dependency>

如前所述,Morphia允許我們注釋Entity類(非常類似于Hibernate注釋)。 因此,這是更新后的Entity類的外觀。

文件:/dbLayer002/src/main/java/org/academy/entity/Person.java

[...]
@Entity
public class Person {@Id private ObjectId id;[...]

現在,我們還可以添加一個DAO層,并依靠Morphia提供的BasicDAO。

文件:/dbLayer002/src/main/java/org/academy/dao/PersonDAO.java

public class PersonDAO extends BasicDAO<Person, ObjectId> {public PersonDAO(Mongo mongo, Morphia morphia, String dbName) {super(mongo, morphia, dbName);}[...]

BasicDAO的優點在于,盡管我剛剛添加了一個構造函數,但通過擴展它,我自己的DAO類已經具有足夠的功能來執行基本的CRUD操作。 不相信嗎? 好吧,讓我們為此做一個測試。

文件:/dbLayer002/src/test/java/org/academy/dao/PersonDAOTest.java

public class PersonDAOTest {private final static Logger logger = LoggerFactory.getLogger(PersonDAOTest.class);private Mongo mongo;private Morphia morphia;private PersonDAO personDao;private final String dbname = "peopledb";@Beforepublic void initiate() {mongo = MongoUtil.getMongo();morphia = new Morphia();morphia.map(Person.class);personDao = new PersonDAO(mongo, morphia, dbname);}@Testpublic void test() {long counter = personDao.count();logger.debug("The count is [" + counter + "]");Person p = new Person();p.setFname("Partha");personDao.save(p);long newCounter = personDao.count();logger.debug("The new count is [" + newCounter + "]");assertTrue((counter + 1) == newCounter);[...]

您可能已經注意到了。 我已經使用過JUnit4。如果您一直在關注此文章,那么您的項目中將擁有JUnit的早期版本。 為了確保使用JUnit 4,只需通過在pom.xml中添加正確的依賴關系來配置Maven以使用它。

文件:/dbLayer002/pom.xml

<!-- Unit test. -->
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version><scope>test</scope>
</dependency>

你已準備好出發。 如果您運行測試,則它們應該通過。 當然,您可以/應該進入數據庫并檢查數據是否確實已保存。 我將向您推薦我認為相當不錯的MongoDB文檔 。

最后但并非最不重要的一點,讓我向您保證,BasicDAO在任何方面都不是限制性的。 我敢肯定,清教徒會指出,如果我的DAO類需要擴展BasicDAO,那無論如何還是對源代碼結構的限制。 理想情況下,不需要。 我同意這一點。 但是,我也想表明,對于DAO的所有實際目的,您都具有足夠的靈活性。 讓我們繼續,向我們的DAO添加一個自定義的find方法,該方法特定于該Entity即Person。 假設我們希望能夠基于名字進行搜索,并且我們希望為此使用正則表達式。 這是代碼的樣子。

文件:/dbLayer002/src/main/java/org/academy/dao/PersonDAO.java

public class PersonDAO extends BasicDAO<Person, ObjectId> {[...]public Iterator<Person> findByFname(String fname){Pattern regExp = Pattern.compile(fname + ".*", Pattern.CASE_INSENSITIVE);return ds.find(entityClazz).filter("fname", regExp).iterator();}[...]
}

在這里需要再次強調的是,我剛剛在DAO中添加了一個自定義搜索功能,方法是精確添加三行代碼(如果添加最后一個括號,則為四行)。 在我的書中,這很靈活。 忠實于我對自動化測試的堅定信念,因此在我們總結之前,請添加一個快速測試以檢查此功能。

文件:/dbLayer002/src/test/java/org/academy/dao/PersonDAOTest.java

[...]
Iterator<Person> iteratorPerson = personDao.findByFname("Pa");
int personCounter = 0 ;
while(iteratorPerson.hasNext()){personCounter ++;logger.debug("["+personCounter+"]" + iteratorPerson.next().getFname());
}
[...]

在指出之前,是的,這里沒有assert(),所以這不是真正的測試。 讓我向您保證,我的測試課程確實已經完成。 只是這里的代碼片段沒有assert函數。

就是這樣了。 您已經使用Java通過ORA通過DAO層連接到NoSQL數據庫(在這里您已使用ORM的功能并做了一些添加)。 您還完成了正確的日志記錄和單元測試。 半個小時可以用,不是嗎? 快樂的編碼。

進一步閱讀

  • 也可以通過Javalobby的此鏈接獲得本文的一個版本-稍作編輯。

參考: 在我們的JCG合作伙伴 Partho的30分鐘內,從Tech for Enterprise博客獲得了MongoDB 。


翻譯自: https://www.javacodegeeks.com/2012/07/mongodb-in-30-minutes.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371757.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371757.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371757.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Django】--ModelForm組件

ModelForm a.class Meta:model,#對應Model的  fieldsNone,#字段  excludeNone,#排除字段  labelsNone,#提示信息  help_texts None,#幫助提示信息  widgets None,#自定義插件  error_messages None,#自定義錯誤信息(整體錯誤信息from django.core.exceptions im…

mysql實際綜合案例_Mysql綜合案例

Mysql綜合案例考核要點&#xff1a;創建數據表、單表查詢、多表查詢已知&#xff0c;有一個學生表student和一個分數表score&#xff0c;請按要求對這兩個表進行操作。student表和score分數表的表結構分別如表1-1和表1-2所示。表1-1student表結構字段名數據類型主鍵外鍵非空唯一…

2012年I / O之后

從注冊到贈品&#xff0c;每年的I / O瘋狂都在不斷發展。 在今年20分鐘內被出售&#xff0c;并沒有阻止Google贈送更多的東西。 以這種速度并有望在明年發布Google Glass&#xff0c;明年注冊很可能會變得更加混亂&#xff01; 因此&#xff0c;Google&#xff0c;請停止提供免…

h5啟動原生APP總結

許久沒有寫博客了&#xff0c;最近有個H5啟動APP原生頁面的需求&#xff0c;中間遇上一些坑&#xff0c;看了些網上的實現方案&#xff0c;特意來總結下 一、需要判斷客戶端的平臺以及是否在微信瀏覽器中訪問 1、客戶端判斷 在啟動APP時&#xff0c;Android和IOS系統處理的方式…

mysql導入創建表空間_oracle創建表空間 用戶 數據庫導入和導出(轉)

已經安裝orcale 9i 和pl/sql(6.0)OracleJobSchedulerORCL、OracleOraDb10g_home1iSQL*PlusOracleOraDb10g_home1TNSListenerOracleServiceORCL第一個是oem控制臺服務進程第二個是定時器和isql*plus的服務進程第三個是監聽器的服務進程最后是數據庫服務進程1. pl/sql客戶機安裝后…

什么時候使用Apache Camel?

Apache Camel是JVM / Java環境中我最喜歡的開源框架之一。 它可以輕松集成使用多種協議和技術的不同應用程序。 本文介紹了何時使用Apache Camel以及何時使用其他替代方法。 問題&#xff1a;企業應用程序集成&#xff08;EAI&#xff09; 由于新產品和新應用&#xff0c;幾乎…

念整數

念整數&#xff08;5分&#xff09;題目內容&#xff1a; 你的程序要讀入一個整數&#xff0c;范圍是[-100000,100000]。然后&#xff0c;用漢語拼音將這個整數的每一位輸出出來。 如輸入1234&#xff0c;則輸出&#xff1a; yi er san si注意&#xff0c;每個字的拼音之間有一…

python 比較運算符放在列表中_在Python3中將運算符放在列表中

我想把操作符作為一個列表&#xff0c;然后從列表中調用一個元素作為操作符。在如果我沒有在運算符周圍加引號&#xff0c;那么列表中逗號的語法錯誤&#xff1a;File "p22.py", line 24cat [,-,*]^SyntaxError: invalid syntax如果我把引語放在周圍&#xff0c;那么…

軟工個人總結

目錄 一、個人提升二、寫下屬于自己的人月神話三、對下一屆、后來人、自己的建議四、我的團隊——Clover五、關于代碼質量六、學過軟件工程&#xff1f;七、自我介紹八、個性發揮一、個人提升 1. 開學初的目標 希望通過團隊合作領會團隊合作的內在精神&#xff0c;希望在分工完…

Tomcat上下文JUnit @Rule

創建測試上下文的JUnit Rule的初稿。 這可以用Spring上下文規則可用于 這個帖子 創建集成測試一個完整的Spring上下文。 import org.apache.commons.dbcp.BasicDataSource; import org.apache.log4j.Logger; import org.junit.rules.TestRule; import org.junit.runner.Descrip…

排序算法之(7)——堆排序

【堆排序的思路】 堆排序主要是利用了堆的性質。對于大頂堆&#xff1a;堆中的每一個節點的值都不小于它的孩子節點的值&#xff0c;具體可參考我的還有一篇博客http://blog.csdn.net/adminabcd/article/details/46880591&#xff0c;那么大頂堆的堆頂元素就是當前堆中全部元素…

HTML基礎:基本標簽簡介(3)

html中有很多標簽&#xff0c;下面介紹最基本的幾個標簽。 1、meta 是head標簽中的一個輔助性標簽。 有2個重要屬性&#xff1a; &#xff08;1&#xff09;name 可以優化頁面被搜索到的可能性。name中可以指定屬性&#xff0c;content是屬性值。 <html><head><…

java 字符碼_Java字符編碼

編碼原理介紹(中文編碼雜談)&#xff1a;int -> byte可以直接使用強制類型轉換: byte b (byte) aInt;這個操作是直接截取int中最低一個字節&#xff0c;如果int大于255&#xff0c;則值就會變得面目全非了byte -> int這里有兩種情況&#xff0c;一種是要求保持值不變&am…

重新登錄:重新登錄

嗨&#xff0c;我再次回到日志中來&#xff0c;這是任何應用程序設計和開發的固有部分。 我是堅強的基礎知識的忠實擁護者&#xff0c;在我的拙見中&#xff0c;日志記錄是任何企業級應用程序中經常被忽略但基本的關鍵要素之一。 我已經寫在此之前這里 。 為了理解當前文章&…

eclipse 下使用git clone

方法一&#xff1a;eclipse安裝好git插件后&#xff0c;直接import-git-project from git- clone url-輸入github的網址等就可以了方法二&#xff1a;使用git軟件&#xff0c;到指定的目錄&#xff0c;右擊git bash here&#xff0c;git clone 加帶有網址的文件.git,如&#xf…

linux -unrar解壓縮

解壓縮命令unrar的使用&#xff1a; $unrar --help用法: unrar <command>-<switch 1> -<switchN> <archive><files...><listfiles...><path_to_extract\><命令>e 解壓文件到當前目錄l[t,b] 列出壓縮文檔信…

終極JPA查詢和技巧列表–第3部分

在閱讀第三部分之前&#xff0c;請記住本系列的第一部分和第二部分 JPA&#xff1a;通過查詢創建對象 JPA允許我們在查詢內創建對象&#xff0c;并帶有所需的值&#xff1a; package com.model;public class PersonDogAmountReport {private int dogAmount;private Person pe…

分治1--二分查找

分治1--二分查找 一、心得 二、題目和分析 三、代碼和結果 1 #include <iostream>2 using namespace std;3 int a[10]{1,2,4,5,7,8,9,10,13,20};4 5 6 //非遞歸 7 int find(int i){8 int l0,r9;9 int mid(lr)/2; 10 while(l<r){ 11 mid(lr)/2; 12…

隱式意圖啟動一個Activity

隱式意圖是通過指定一組動作或者屬性實現&#xff0c;主要用于跨應用使用。 1.創建一個意圖對象 Intent intent new Intent();2.設置意圖過濾器 intent.setAction("android.intent.action.testActivity"); //對應于action intent.addCategory("android.intent.…

Spring自定義命名空間

Spring自定義命名空間提供了一種很好的方式來簡化用于描述Spring應用程序上下文的bean定義的xml文件。 這是一個相當古老的概念&#xff0c;最初是在Spring 2.0中引入的&#xff0c;但值得不時地進行審查。 考慮一種情況&#xff0c;必須為沒有自定義名稱空間的Spring MVC應用程…