在本文中,我們的目標是啟動并運行能夠與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