使用Spring Data MongoDB持久化文檔數據

介紹

  • NoSQL:not only SQL,非關係型數據java

  • MongoDB是文檔型數據,文檔是獨立的實體,文檔數據庫不適用於關聯關係明顯的數據spring

Spring Data MongoDB

  • Spring Data MongoDB提供了三種方式在Spring應用中使用MongoDBmongodb

    • 經過註解實現對象-文檔映射數據庫

    • 使用MongoTemplate實現基於模板的數據庫訪問服務器

    • 自動化的運行時Repository生成功能app

import java.util.Collection;
import java.util.LinkedHashSet;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

/**
 * Spring Data MongoDB註解將Java類型映射爲文檔
 */
@Document        //這是一個文檔
public class Order {

    @Id        //指定id
    private String id;
    
    @Field("client")        //覆蓋默認的域名
    private String customer;
    
    private String type;
    
    private Collection<Item> items = new LinkedHashSet<>();

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getCustomer() {
        return customer;
    }

    public void setCustomer(String customer) {
        this.customer = customer;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public Collection<Item> getItems() {
        return items;
    }

    public void setItems(Collection<Item> items) {
        this.items = items;
    }
    
    
    
}
  • 啓用MongoDBide

    • 經過@EnableJpaRepositories註解啓用Spring Data的自動化JPA Repository生成功能this

    • @EnableMongoRepositories爲MongoDB實現了相同的功能code

    • 第一種方式:對象

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

import com.mongodb.MongoClient;

/**
 * 
 * Spring Data MongoDB的配置
 *
 */
@Configuration
@EnableMongoRepositories(basePackages="com.adagio.db")    //啓用MongoDB的Repository功能
public class MongoConfig {

    /**
     * MongoTemplate Bean
     * @param mongoDbFactory
     * @return
     */
    @Bean
    public MongoOperations mongoTemplate(){
        return new MongoTemplate(mongoDbFactory());
    }
    
    /**
     * MongoDbFactory bean
     * @return
     */
    public MongoDbFactory mongoDbFactory(){
        return new SimpleMongoDbFactory(mongoClient(), "com.adagio.db");
    }
    
    /**
     * MongoClient bean
     * @return
     */
    public MongoClient mongoClient(){
        return new MongoClient("localhost");
    }
    
}
  • 第二種方式

import java.util.Arrays;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.data.mongodb.config.AbstractMongoConfiguration;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

import com.mongodb.Mongo;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;

/**
 * 
 * Spring Data MongoDB的配置
 * 擴展AbstractMongoConfiguration
 *
 */
@Configuration
@EnableMongoRepositories(basePackages="com.adagio.db")    //啓用MongoDB的Repository功能
public class MongoConfig2 extends AbstractMongoConfiguration {

    @Override
    protected String getDatabaseName() {
        return "OrdersDB";        //指定數據庫名
    }

    @Autowired
    private Environment env;
    
    @Override
    public Mongo mongo() throws Exception {
//        return new MongoClient();        //建立Mongo客戶端
        
        //若是MongoDB服務器運行在其餘的機器上
//        return new MongoClient("mongoServer");
        
        //若是MongoDB服務器監聽的端口不是默認端口27017
//        return new MongoClient("mongoServer", 37017);
        
        //若是MongoDB服務器在生產配置上,啓用了認證功能
        MongoCredential credential = MongoCredential.createCredential(
                env.getProperty("mongo.username") , "OrdersDB", 
                env.getProperty("mongo.password").toCharArray());
        return new MongoClient(
                new ServerAddress("localhost", 37017),
                Arrays.asList(credential));
    }

    
}
  • 爲模型添加註解,實現MongoDB持久化

    • 用於對象-文檔映射的Spring Data MongoDB註解

      • @Document 標示映射到MongoDB文檔上的領域對象 相似JPA @Entity註解

      • @Id 標示某個域爲ID域

      • @DbRef 標示某個域要引用的其它的文檔,這個文檔有可能位於另外一個數據庫中

      • @Field 爲文檔域指定自定義的元數據

      • @Version 標示某個屬性用做版域

    • 注意:沒有添加註解的屬性,也會持久化爲文檔中域,除非設置瞬時態(transient)

    • 注意:Order.items屬性,不是 關聯關係,會徹底嵌入到Order中

  • 使用MongoTemplate訪問MongoDB

    • 配置類中配置的MongoTemplate bean,將其注入到使用的地方

    • @Autowired MongoOperations mongo;

    • MongoOperations是MongoTemplate所實現的接口

    • void save(Object objectToSave, String collectionName);

    • save第一個參數是新建立的對象,第二個參數是要保存的文檔存儲的名稱

  • 編寫MongoDB Repository

    • 使用Spring Data MongoDB來建立Repository

    • 經過@EnableMongoRepositories註解啓用Spring Data MongoDB的Repository功能

    • 經過擴展MongoRepository接口,可以繼承多個CRUD操做

  • 查詢方式:

    • 自定義查詢

    • 指定查詢

    • 混合定義查詢

//自定義查詢
    List<Order> findByCustomer(String customer);
    List<Order> getByCustomer(String customer);
    List<Order> readByCustomer(String customer);
    
    int countByCustomer(String customer);
    
    List<Order> findByCustomerLike(String customer);

    List<Order> findByCustomerAndType(String customer, String type);

    List<Order> getByType(String type);
        
    //指定查詢
    @Query("{customer:'Chuck Wagon'}")
    List<Order> findChucksOrders();

混合自定義的功能

  • 首先,定義中間接口

import java.util.List;

public interface OrderOperations {

    List<Order> findOrderByType(String t);
}
  • 編寫混合實現

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;


public class OrderOperationsimpl implements OrderOperations {

    @Autowired
    private MongoOperations mongo;        //注入MongoOperations
    @Override
    public List<Order> findOrderByType(String t) {
        String type = t.equals("NET") ? "WEB" : t;
        
        //建立查詢
        Criteria where = Criteria.where("type").is(type);
        Query query = Query.query(where);
        
        //執行查詢
        return mongo.find(query, Order.class);
    }

}

引用:《Spring In Action 4》第十二章

越想快一點的時候,越慢越想要的,越難以獲得抓到越緊,越是徒勞

相關文章
相關標籤/搜索