--- title: 5.1、morphia date: 2018-1-26 19:32:23 tags: - 数据库 - MongoDB categories: - MongoDB --- `Morphia` 是一个轻量级的类型安全的 Java 类库,用来将在 MongoDB 和 Java 对象之间进行映射 对MongoDB的API进行了一些封装 , 类似hibernate [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 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 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"); ```