文档数据库适合处理没什么关联关系的独立实体
Spring Data MongoDB 提供了三种方式在 Spring 应用中使用 MongoDB:
- 通过注解实现对象-文档映射;
- 使用 MongoTemplate 实现基于模板的数据库访问;
- 自动化的运行时 Repository 生成功能。
1 启用 MongoDB
@EnableMongoRepositories 注解启用 MongoDB
1.1 方法一
MongoFactoryBean、MongoTemplate
@Configuration @EnableMongoRepositories(basePackages="orders.db") public class MongoConfig { @Bean public MongoFactoryBean mongo() { MongoFactoryBean mongo = new MongoFactoryBean(); mongo.setHost("localhost"); return mongo; } @Bean public MongoOperations mongoTemplate(Mongo mongo) { return new MongoTemplate(mongo, "OrdersDB"); } }
|
1.2 方法二
配置类扩展 AbstractMongoConfiguration 并重载 getDatabaseName() 和 mongo() 方法。
@Configuration @EnableMongoRepositories("orders.db") public class MongoConfig extends AbstractMongoConfiguration { @Override protected String getDatabaseName() { return "OrdersDB"; } @Override public Mongo mongo() throws Exception { MongoCredential credential = MongoCredential.createMongoCRCredential( env.getProperty("mongo.username"), "OrdersDB", env.getProperty("mongo.password").toCharArray()); return new MongoClient( new ServerAddress("localhost", 37017), Arrays.asList(credential)); return new MongoClient("mongodbserver", 27017); } }
|
2 注解 MongoDB 持久化
Spring Data MongoDB 提供了一些将 Java 类型映射为 MongoDB 文档的注解。
注解 |
描述 |
@Document |
标示映射到 MongoDB 文档上的领域对象 |
@Id |
标示某个域为ID域 |
@DbRef |
标示某个域要引用其他的文档, 这个文档有可能位于另外一个数据库中 |
@Field |
为文档域指定自定义的元数据 |
@Version |
标示某个属性用作版本域 |
@Document public class Order { @Id private String id; @Field("client") private String customer; private Collection<Item> items = new LinkedHashSet<Item>(); ... }
|
3 使用 MongoTemplate 访问 MongoDB
MongoOperations 是 MongoTemplate 所实现的接口, 不使用具体实现是一个好的做法, 尤其是在注入的时候
@Autowired MongoOperations mongo;
long orderCount = mongo.getCollection("order").count();
Order order = new Order(); ... mongo.save(order, "order");
String orderId = ...; Order order = mongo.findById(orderId, Order.class);
List<Order> chucksOrders = mongo.find(Query.query( Criteria.where("client").is("Chuck Wagon")), Order.class);
List<Order> chucksWebOrders = mongo.find(Query.query( Criteria.where("customer").is("Chuck Wagon") .and("type").is("WEB")), Order.class);
mongo.remove(order);
|
4 编写 MongoDB Repository
扩展 MongoRepository。任何扩展 Repository 的接口将会在运行时自动生成实现。
MongoRepository 接口有两个参数, 第一个是带有 @Document 注解的对象类型, 也就是该 Repository 要处理的类型。 第二个参数是带有 @Id 注解的属性类型。
public interface OrderRepository extends MongoRepository<Order, String> { }
|