网站建设设计指标,免费的网络推广,php+ajax网站开发典型实例 pdf,网站性能最近#xff0c;我被NoSQL错误咬住了-或是我的同事Mark Atwell提出的“燃烧在哪里#xff01;” 运动。 尽管我无意于在不久的将来或可预见的将来回避友好的“ SELECT ... WHERE”#xff0c;但我确实设法弄懂了一些代码。 在本文中#xff0c;我分享了我在NoSQL世界中首次… 最近我被NoSQL错误咬住了-或是我的同事Mark Atwell提出的“燃烧在哪里” 运动。 尽管我无意于在不久的将来或可预见的将来回避友好的“ SELECT ... WHERE”但我确实设法弄懂了一些代码。 在本文中我分享了我在NoSQL世界中首次尝试的知识。 在本文中我们的目标是启动并运行能够与MongoDB进行交互的基本Java应用程序。 就其本身而言这并不是一项艰巨的任务也许您可以在10分钟内完成。 单击此处或单击此处或单击此处 以获得一些出色的材料。 但是我想进一步推动它。 我想添加ORM支持。 我已为本文选择了Morphia 。 我还想添加DAO模式单元测试和日志记录。 简而言之我想感觉到“几乎就像”我们大多数人使用JavaHibernate和Oracle为企业应用程序编写的那种代码。 并且我们将尝试在30分钟内完成所有这些操作。 我的意图是让Java RDBMS开发人员放心Java NoSQL并不是很陌生。 这是相似的代码易于尝试。 在这一点上可能需要补充一点即我与NoSQL没有亲和力RDBMS也没有问题。 我相信它们都有自己的用途 单击此处以获取一些出色的材料。 作为技术专家我只是喜欢更好地了解自己的工具以便为自己的职业伸张正义。 本文仅旨在帮助志趣相投的人们在NoSQL中投入脚步。 好的足够说话了。 让我们开始吧。 在遵循本文之前您将需要一些软件/工具。 下载并安装 MongoDB服务器如果尚未安装 。 我假设您有Java一些Java IDE以及构建和发布工具。 我在本文中使用jdk 7EclipseSTS和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_HOMEC:\ProgramFiles\Java\jdk1.7.0REM
REM Create a simple java application.
REM
call mvn archetype:create ^-DarchetypeGroupIdorg.apache.maven.archetypes ^-DgroupIdorg.academy ^-DartifactIddbLayer002pause 将其导入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 --
dependencygroupIdorg.mongodb/groupIdartifactIdmongo-java-driver/artifactIdversion2.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.version1.6.1/slf4j.version
[...]
!-- Logging --
dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion${slf4j.version}/version
/dependency
dependencygroupIdorg.slf4j/groupIdartifactIdjcl-over-slf4j/artifactIdversion${slf4j.version}/versionscoperuntime/scope
/dependency
dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-log4j12/artifactIdversion${slf4j.version}/versionscoperuntime/scope
/dependency 而且我们将需要确切指定要记录的内容。 文件/dbLayer002/src/java/resources/log4j.properties # Set root logger level to DEBUG and its only appender to A1.
log4j.rootLoggerDEBUG, A1# configure A1 to spit out data in console
log4j.appender.A1org.apache.log4j.ConsoleAppender
log4j.appender.A1.layoutorg.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 --
repositoriesrepositoryidMorphia repository/idurlhttp://morphia.googlecode.com/svn/mavenrepo//url/repository
/repositories
[...]
!-- Morphia - ORM for MongoDB --
dependencygroupIdcom.google.code.morphia/groupIdartifactIdmorphia/artifactIdversion0.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 BasicDAOPerson, 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. --
dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.10/versionscopetest/scope
/dependency 你已准备好出发。 如果您运行测试则它们应该通过。 当然您可以/应该进入数据库并检查数据是否确实已保存。 我将向您推荐我认为相当不错的MongoDB文档 。 最后但并非最不重要的一点让我向您保证BasicDAO在任何方面都不是限制性的。 我敢肯定清教徒会指出如果我的DAO类需要扩展BasicDAO那无论如何还是对源代码结构的限制。 理想情况下不需要。 我同意这一点。 但是我也想表明对于DAO的所有实际目的您都具有足够的灵活性。 让我们继续向我们的DAO添加一个自定义的find方法该方法特定于该Entity即Person。 假设我们希望能够基于名字进行搜索并且我们希望为此使用正则表达式。 这是代码的样子。 文件/dbLayer002/src/main/java/org/academy/dao/PersonDAO.java public class PersonDAO extends BasicDAOPerson, ObjectId {[...]public IteratorPerson 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 [...]
IteratorPerson 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