最近,我被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

30分钟内使用MongoDB相关推荐

  1. k8s aws 部署_如何在短短30分钟内使用CircleCI设置到AWS S3的持续部署

    k8s aws 部署 by Adam Watt 通过亚当·瓦特 如何在短短30分钟内使用CircleCI设置到AWS S3的持续部署 (How to setup Continuous Deployme ...

  2. 请使用recaptcha_如何在30分钟内使用ReCaptcha和PHP构建Bootstrap电子邮件表单

    请使用recaptcha by Ondrej Svestka 通过Ondrej Svestka 如何在30分钟内使用ReCaptcha和PHP构建Bootstrap电子邮件表单 (How to bui ...

  3. 机器人坐标系建立_如何在30分钟内建立一个简单的搜索机器人

    机器人坐标系建立 by Quinn Langille 奎因·兰吉尔(Quinn Langille) 如何在30分钟内建立一个简单的搜索机器人 (How to Build A Simple Search ...

  4. Retrace AV推出新型涂料添加剂,可在30分钟内灭杀新冠病毒

    新型涂料添加剂可在30分钟内消灭新冠病毒,为家庭和工作场所提供高达99.99%的保护   伦敦--(美国商业资讯)--全球数十亿人正尝试重返办公室.学校和社交场所.政府和企业主需要尽其所能提振信心,让 ...

  5. 如何零基础零费用的在30分钟内用hugo+github pages创建一个专属于你的个人博客 - 简单快捷到建议人手一个

    写这篇文章的原因是在网上看了很多的教程,踩了不少的坑,更多的白费了很多功夫,也没找到一篇从头到尾完整有效的个人建站方法. 有些教程年代久远,有些教程极为繁琐,有些教程压根跑不通. 为了方便自己,做个记 ...

  6. 如何实现生成订单30分钟内未支付则自动取消?

    如何实现生成订单30分钟内未支付则自动取消? 数据库轮询 JDK的延迟队列 Quartz 时间轮算法 使用消息队列 数据库轮询 不是很推荐的一种方式,需要定时扫描数据库,借助定时任务工具,如果是多服务 ...

  7. 停车30分钟内不收费,程序员远程操控挪车,实现自动免费停车...

    还记得前几天关于野生钢铁侠如何创造 自动驾驶自行车 的故事吗? 掌握核心科技的程序员们,又开始开脑洞啦!最近又有一个北京的开发者开了 这个脑洞的背景: 北京道路停车的自动收费,停车不足30分钟不计费 ...

  8. swiftui_使用SwiftUI在30分钟内制作一个应用

    swiftui This post was first delivered as a live coding presentation at a Telstra Purple Back2Base ev ...

  9. 30分钟内使用手机控制四轴飞行器(ESP8266 + A7105 + Blynk App for iOS/Android)

    很久以来,我就想做类似的项目了.但是手机集成工作的复杂性让我感到害怕.而且如果以后我有新的想法,也很难再重新利用这个项目. 现在,有了Blynk,这一切变得易如反掌:) 因此,我花了一个晚上,完成了这 ...

最新文章

  1. Blender中的主程序纹理学习课程 Master Procedural Texturing in Blender
  2. 与servlet Api 的集成
  3. 深入理解 x86/x64 的中断体系--IVT VS IDT
  4. 【MySQL查询】复杂查询:别名、外键join
  5. rfid阅读器的主要任务_RFID阅读器(读写器)的应用领域及其如何使用?
  6. 关于SubSonic3.0生成的表名自动加复数(s)的“用户代码未处理SqlException,对象名'xxxs'无效”异常处理...
  7. Android9编程一:安装开发环境
  8. MySQL批处理SQL语句
  9. Response.Redirect和Server.Transfer的区别
  10. java 如何查询数据库_java怎么查询数据库
  11. 开心消消乐简单的逆向破解过程
  12. 电子工程师12个忠告,新手老鸟都值得一看!
  13. perl and LWP 文档
  14. python爬取天极网手机信息代码
  15. 数据库主键到底是用自增长(INT)好还是UUID好?
  16. C语言实现操作系统的进程调度算法--RR算法
  17. 学习笔记-频率域滤波(2)-取样函数
  18. java实现德州扑克比较大小
  19. 面试问这些问题,你敢直接拒绝?!
  20. [波波带你手动提取网页视频]02讲 实战video标签mp4 提取

热门文章

  1. mybatis_user_guide(6) Java API
  2. java流与文件——操作文件
  3. RandomAccessFile类解析
  4. java线程——中断线程+线程状态+线程属性(优先级)
  5. mockito接口没法赋值_Mockito:无法实例化@InjectMocks字段:类型是接口
  6. svn: 没有演进历程信息_使用默认方法的接口演进–第二部分:接口
  7. java代码初体验_第一次Java 8体验
  8. 使用Testcontainers和PostgreSQL,MySQL或MariaDB的Spring Boot测试
  9. 使用这些先进的GC技术提高应用程序性能
  10. spring java配置_Spring:使基于Java的配置更加优雅