3 Spring Data MongoDB

Wu Jun 2018-12-18 21:52:29
06 Spring > 05 Data.md

文档数据库适合处理没什么关联关系的独立实体

Spring Data MongoDB 提供了三种方式在 Spring 应用中使用 MongoDB:

1 启用 MongoDB

@EnableMongoRepositories 注解启用 MongoDB

1.1 方法一

MongoFactoryBean、MongoTemplate

@Configuration
@EnableMongoRepositories(basePackages="orders.db")//Enable MongoDB repositories
public class MongoConfig {
    //MongoClient bean
    @Bean
    public MongoFactoryBean mongo() {
        MongoFactoryBean mongo = new MongoFactoryBean();
        mongo.setHost("localhost");
        return mongo;
    }
    //MongoTemplate bean
    @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();
... // set properties and add line items
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> {
}