NoSQL:not only SQL,非關係型數據java
MongoDB是文檔型數據,文檔是獨立的實體,文檔數據庫不適用於關聯關係明顯的數據spring
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》第十二章
越想快一點的時候,越慢越想要的,越難以獲得抓到越緊,越是徒勞