導(dǎo)入依賴
在pom文件中添加以下依賴织盼,其中mongo-java-driver提供了java操作mongoDB的基本API吆豹,而morphia則是在其之上封裝了Java對(duì)象和BSON對(duì)象的映射關(guān)系惋增。
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.mongodb.morphia</groupId>
<artifactId>morphia</artifactId>
<version>1.0.1</version>
</dependency>
構(gòu)建Datastore對(duì)象
// mongo客戶端用于連接服務(wù)端的地址串
String mongoClientURIString =
"mongodb://192.168.0.100,192.168.14.101/?replicaSet=test&readPreference=nearest";
MongoClientURI mongoClientURI = new MongoClientURI(mongoClientURIString);
// 構(gòu)建出mongo客戶端對(duì)象
MongoClient mongoClient = new MongoClient(mongoClientURI);
Morphia morphia = new Morphia();
// 告訴morphia到哪個(gè)包下面去找實(shí)體類
morphia.mapPackage("com.elong.web.gcCollection.model");
// 構(gòu)建Datastore對(duì)象古胆,其中`gcLog`是數(shù)據(jù)庫(kù)名稱
Datastore datastore = morphia.createDatastore(mongoClient, "gcLog");
// 確保索引生效
datastore.ensureIndexes();
為實(shí)體加上注解
通常一個(gè)實(shí)體映射為mongo中的一個(gè)collection雹洗,我們通過(guò)注解的方式告訴morphia這個(gè)映射關(guān)系渐北。@Entity("gcLogItem")
表示這個(gè)類對(duì)應(yīng)mongo中的名為gcLogItem
的collection阿逃;@Id
表示這個(gè)屬性對(duì)應(yīng)主鍵字段。
注解的其它用法參見這里。
@Entity("gcLogItem")
public class BaseGcItem {
@Id
private String id;
private String host;
/**
* other fields go here ...
*/
/**
* getters and setters methods go here ...
*/
}
通過(guò)Datastore對(duì)象操作mongoDB
構(gòu)建完Datastore對(duì)象以后就可以利用這個(gè)對(duì)象提供的API來(lái)操作mongoDB了恃锉。詳細(xì)用法搀菩,請(qǐng)看這里。
下面這些例子展示了一些用法:
@Repository
public class GcLogItemDaoImpl implements GcLogItemDao {
@Autowired
private DbClient dbClient;
@Override
public String insert(BaseGcItem gcItem) {
Datastore datastore = dbClient.getDatastore();
return (String)datastore.save(gcItem).getId();
}
@Override
public Iterator<Key<BaseGcItem>> insert(List<BaseGcItem> gcItemList) {
Datastore datastore = dbClient.getDatastore();
return datastore.save(gcItemList).iterator();
}
@Override
public List<BaseGcItem> getAll() {
Query<BaseGcItem> query = dbClient.getDatastore()
.createQuery(BaseGcItem.class);
return query.asList();
}
@Override
@SuppressWarnings("unchecked")
public List<String> getDistinctHost() {
DBCollection dbCollection = dbClient.getDatastore()
.getCollection(BaseGcItem.class);
return (List<String>)dbCollection.distinct("host");
}
@Override
public List<BaseGcItem> getByHost(String host) {
Query<BaseGcItem> query = dbClient.getDatastore()
.createQuery(BaseGcItem.class)
.field("host").equal(host)
.order("-timestampOfGc");
return query.asList();
}
@Override
public List<BaseGcItem> getByGcItemType(GcItemType gcItemType) {
Query<BaseGcItem> query = dbClient.getDatastore()
.createQuery(BaseGcItem.class)
.field("gcItemType").equal(gcItemType)
.order("-timestampOfGc");
return query.asList();
}
@Override
public int removeByDateRange(Date startDate, Date endDate) {
Datastore datastore = dbClient.getDatastore();
Query<BaseGcItem> query = datastore
.createQuery(BaseGcItem.class)
.field("timestampOfGc").greaterThanOrEq(startDate)
.field("timestampOfGc").lessThan(endDate);
return datastore.delete(query).getN();
}
}