NoSQL专题
MongoDB + Morphia使用
环境: jdk 7, Eclipse (STS) 和 Maven 3
首先下载MongoDB 然后运行。
用Maven准备一个Java 项目,codeRepo\MavenCommands.bat:
ECHO OFF
REM =============================
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.0
REM =============================
REM Create a simple java application.
REM =============================
call mvn archetype:create ^
-DarchetypeGroupId=org.apache.maven.archetypes ^
-DgroupId=org.academy ^
-DartifactId=dbLayer002
pause
将项目目录导入到Eclipse即可,用Maven编译和运行:
mvn -e clean install.
下面开始编码,假设有一个实体: /dbLayer002/src/main/java/org/academy/entity/Person.java
package org.academy.entity;
public class Person {
private String fname;
[...]
}
准备一下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>
[...]
准备一下连接MongoDB的工具类:File: /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;
}
}
加入日志辅助调试:/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
这里要引入Morphia ,是一个Java对象和MongoDB转换工具,适合有JPA 经验的程序员。
配置Morphia依赖File: /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>
下面是可选:
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>[2.1_3,)</version>
<type>jar</type>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.thoughtworks.proxytoys</groupId>
<artifactId>proxytoys</artifactId>
<version>1.0</version>
<type>jar</type>
<optional>true</optional>
</dependency>
使用Morphia像JPA或Hibernate进行元注解annotate:
[...]
@Entity
public class Person {
@Id private ObjectId id;
[...
编制一个DAO来操作Person。
Datastore ds = ...; // like new Morphia(new Mongo()).createDatastore("hr")
morphia.map(Person.class);
ds.save(new Person("Mister", "GOD", null, 0));
更多操作见:https://github.com/mongodb/morphia
MongoDB的优化锁