mongodb是世界上最像关系型数据库的非关系型数据库,操作灵活方便,mongodb在4.2以后支持了ACID事务,水平扩展方便,客户端API简单,支持二级索引查询,是一款非常优秀的数据库。morphia是谷歌开源的mongodb的java客户端。morphia从另外一种意义上来说是mongodb的orm框架。
pom依赖
<dependency>
<groupId>dev.morphia.morphia</groupId>
<artifactId>core</artifactId>
<version>1.5.5</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.11.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
复制
morphia的实现方式也是类似于java的ORM框架一样做到实体类-表格之间的映射。基于注解实现标注。实体类定义如下
@Entity("person")
@Getter
@Setter
@ToString
static class Person implements Serializable {
@Id
String id;
@Property
String name;
@Property
LocalDateTime birth;
@Property
Integer age;
}
复制
@Id是标明的属性是主键,@Entity标明的是对应表格的名称,@Property标明的是对应的表格字段的信息。
morphia配置mongodb连接信息
Datastore datastore = null;
MongoClient client = null;
Morphia morphia = null;
@Before
public void before() {
client = new MongoClient("192.168.74.135");
morphia = new Morphia();
datastore = new DatastoreImpl(morphia, client, "nonStand");
}
复制
morphia保存数据
@Test
public void testSave() {
Person person = new Person();
person.setId(Worker.id());
person.setAge(19);
person.setBirth(LocalDateTime.now());
person.setName("jack ma");
Key<Person> personKey = datastore.save(person);
System.err.println(personKey);
}
复制
Key{collection=person, id=633552187364478976}
复制
morphia数据查询依赖于中间对象query,query对象里面可以设置检索的条件。
@Test
public void testQuery() {
Query<Person> query = datastore.createQuery(Person.class);
query.filter("age >= ", 10);
MorphiaCursor<Person> morphiaCursor = query.find();
morphiaCursor.forEachRemaining(System.err::println);
}
复制
结果打印(查询成功)
MorphiaAPISimpleTest.Person(id=632502582027784192, name=jack ma, birth=2019-10-12T16:59:26.893, age=19)
MorphiaAPISimpleTest.Person(id=632506113141149696, name=yviodPFunB, birth=2019-10-12T17:13:28.778, age=31)
复制
morphia数据删除,跟检索原理大概一致,需要设置删除对象的过滤条件。
@Test
public void testDelete() {
Person person = new Person();
person.setId("632502582027784192");
WriteResult writeResult = datastore.delete(person);
System.err.println(writeResult);
}
复制
结果打印(删除成功)
WriteResult{n=1, updateOfExisting=false, upsertedId=null}
复制
morphia修改数据,跟查询原理大致一致,也需要设置一些过滤条件。
@Test
public void testUpdate(){
// 构建修改的doc
Document updateDoc = new Document();
updateDoc.append("$set", new Document().append("item", "java canvas"));
// 过去查询的doc
Document searchQueryDoc = new Document().append("item", "canvas");
UpdateResult updateResult = collection.updateOne(searchQueryDoc, updateDoc);
System.err.println(updateResult);
}
复制
上面代码需要注意的是$set,$set可以理解为mongodb要更新数据的指定操作符,所以需要加入$set。并无其他意义。我们需要过滤的条件是item为canvas的数据的item全部更新为 "java canvas",打印结果如下。
AcknowledgedUpdateResult{matchedCount=1, modifiedCount=1, upsertedId=null}
复制
文章转载自开源拾椹,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。