124 lines
3.6 KiB
Markdown
124 lines
3.6 KiB
Markdown
---
|
|
title: 5.1、morphia
|
|
date: 2018-1-26 19:32:23
|
|
tags:
|
|
- 数据库
|
|
- MongoDB
|
|
categories:
|
|
- MongoDB
|
|
---
|
|
|
|
`Morphia` 是一个轻量级的类型安全的 Java 类库,用来将在 MongoDB 和 Java 对象之间进行映射
|
|
对MongoDB的API进行了一些封装 , 类似hibernate
|
|
<!-- more -->
|
|
[maven仓库jar包](http://mvnrepository.com/artifact/org.mongodb.morphia/morphia)
|
|
|
|
---
|
|
由于使用MongoDB的原生jar包无法对实体类执行映射操作
|
|
如果有一个实体类的对象 , 比如要手工转化为Document对象才可以保存到数据库
|
|
同样 , 查询获得的结果也是Document对象 , 而不是实体类对象 , 使用相对不便
|
|
|
|
1. **创建实体类 , 并添加注解**
|
|
```java
|
|
@Entity(value="t_person")
|
|
public class Person {
|
|
@Id
|
|
private long id;
|
|
private String name;
|
|
private String address;
|
|
private int age;
|
|
//getter与setter方法...
|
|
}
|
|
```
|
|
可以在@Entry注解的value属性指定该实体类对应的集合名称
|
|
如果不指定 , 就默认为这个类的名称
|
|
|
|
2. **使用junit进行单元测试**
|
|
首先编写测试类的基类 , 需要进行连接的初始化和执行完毕后的连接关闭
|
|
```java
|
|
public class UnitTestBase {
|
|
protected Mongo mongo;
|
|
protected Morphia morphia;
|
|
protected Datastore ds;
|
|
|
|
private static final String HOST = "127.0.0.1";
|
|
private static final int PORT = 27017;
|
|
private static final String DB_NAME = "demo";
|
|
@Before
|
|
public void init() {
|
|
mongo = new MongoClient(HOST, PORT);
|
|
morphia = new Morphia();
|
|
ds = morphia.createDatastore(mongo, DB_NAME);
|
|
}
|
|
|
|
@After
|
|
public void desotry() {
|
|
mongo.close();
|
|
}
|
|
}
|
|
```
|
|
如果需要用户认证 , 直接对MongoClientt对象执行操作即可
|
|
方式参考前一篇笔记
|
|
|
|
3. **增删改查操作**
|
|
通常的增删改查方法如下
|
|
```java
|
|
public class MongodbTest extends UnitTestBase {
|
|
@Test
|
|
public void testSave(){
|
|
Person person = new Person(1002, "Molly", "excuse me?", 20);
|
|
ds.save(person);
|
|
// 注意:在执行save操作的时候, 如果对应的集合不存在, 则自动创建该集合
|
|
}
|
|
|
|
@Test
|
|
public void testDelete() {
|
|
Person person = new Person();
|
|
person.setId(1002);
|
|
//删除操作是根据主键来删除, 实体类中已经用@Id设定了主键
|
|
ds.delete(person);
|
|
}
|
|
|
|
@Test
|
|
public void testUpdate() {
|
|
Person person = new Person();
|
|
person.setId(1002);
|
|
UpdateOperations<Person> ops = ds.createUpdateOperations(Person.class);
|
|
ops.set("name", "Polly");
|
|
ops.set("address", "000");
|
|
//第一个参数是过滤条件, 第二个参数是需要修改的属性和值的集合
|
|
ds.update(person, ops);
|
|
/*
|
|
* update方法是修改所有符合条件的数据
|
|
* 如果只需要修改符合条件的第一条数据, 可以使用
|
|
* ds.updateFirst(query, ops)
|
|
*/
|
|
}
|
|
|
|
@Test
|
|
public void testQuery(){
|
|
Query<Person> result = ds.find(Person.class, "name", "Molly");
|
|
//第二个与第三个参数是查询的条件
|
|
for(Person per : result) {
|
|
System.out.println(per);
|
|
}
|
|
/*
|
|
* 在查询当中, 如果集合中的文档有额外的字段, 会被忽略
|
|
* 实体类中有而文档中没有的字段
|
|
* 查询结果的对象中对应属性就是null或者基本数据类型的默认值
|
|
*/
|
|
}
|
|
}
|
|
```
|
|
以上的增删改查方法都有多种重载形式 , 在这里就不一一举例了
|
|
具体的可以查看morphia源代码
|
|
|
|
---
|
|
上述方式是使用注解添加类的映射
|
|
如果不用注解 , 也可以手动把某些类加载到morphia当中
|
|
```java
|
|
//将若干个类加入到映射
|
|
morphia.map(Person.class);
|
|
//将某个包中的所有类添加到映射
|
|
morphia.mapPackage("com.entry");
|
|
``` |