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.mzph.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应用程…