摘要:每個條件必須引用一個屬性,并且還可以指定一種比較操作。如果省略比較操作符的話,那么這暗指是一種相等比較操作。
Spring-data對MongoDB進行了很好的支持,接下來就講解一下關于Spring對MongoDB的配置和一些正常的使用
我下面的工程使用的是Spring的Java配置的方式和Maven構建
具體的工程代碼大家可以訪問我的Github地址:https://github.com/zoeminghong/springmvc-javaconfig
①MongoDB的必要配置</>復制代碼
package springmvc.rootconfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoClientFactoryBean;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
import com.mongodb.Mongo;
@Configuration
// 啟用MongoDB的Repository功能,會對其Repositories自動掃描
@EnableMongoRepositories(basePackages = "springmvc.orders.db")
public class MongoConfig {
// MongoClient配置
@Bean
public MongoClientFactoryBean mongo() {
MongoClientFactoryBean mongo = new MongoClientFactoryBean();
mongo.setHost("localhost");
//MongoCredential credential=MongoCredential.createCredential(env.getProperty("mongo.username"), "OrdersDB",env.getProperty("mongo.password").toCharArray());
// mongo.setCredentials(new MongoCredential[]{credential});
//還可以對端口進行配置
return mongo;
}
// Mongo Template配置
@Bean
public MongoOperations mongoTemplate(Mongo mongo) {
//OrdersDB就是Mongo的數據庫
return new MongoTemplate(mongo, "OrdersDB");
}
}
為了訪問數據庫的時候,我們可能還需要帳號密碼
</>復制代碼
MongoCredential credential=MongoCredential.createCredential(env.getProperty("mongo.username"), "OrdersDB",env.getProperty("mongo.password").toCharArray());
mongo.setCredentials(new MongoCredential[]{credential});
②為模型添加注解
</>復制代碼
package springmvc.bean;
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;
//這是文檔
@Document
public class Order {
//指定ID
@Id
private String id;
//為域重命名
@Field("client")
private String customer;
private String type;
private Collection- 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- getItems() {
return items;
}
public void setItems(Collection- items) {
this.items = items;
}
}
</>復制代碼
package springmvc.bean;
public class Item {
private Long id;
private Order order;
private String product;
private double price;
private int quantity;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
public String getProduct() {
return product;
}
public void setProduct(String product) {
this.product = product;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
}
注解 | 描述 |
---|---|
@Document | 標示映射到mongoDB文檔上的領域對象 |
@ID | 標示某個為ID域 |
@DbRef | 標示某個域要引用其他的文檔,這個文檔有可能位于另外一個數據庫中 |
@Field | 為文檔域指定自定義的元數據 |
@Version | 標示某個屬性用作版本域 |
</>復制代碼
若不使用@Field注解,域名就與Java屬性相同
上面之所以Item的Java類為什么沒有@Document注解,是因為我們不會多帶帶想Item持久化為文檔
③使用MongoTemplate訪問MongoDB
</>復制代碼
package springmvc.web;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import springmvc.bean.Order;
import springmvc.orders.db.OrderRepository;
@Controller
public class HomeController {
@Autowired
MongoOperations mongo;
@RequestMapping(value = { "/", "index" }, method = RequestMethod.GET)
public String index() {
long orderCount=mongo.getCollection("order").count();
System.out.println(orderCount);
// Order order = new Order();
// order.setId("1");
// order.setCustomer("gg");
// order.setType("2");
//第二個參數是文檔存儲的名稱
// mongo.save(order,"order");
// String orderId="1";
// Order order=mongo.findById(orderId, Order.class);
// System.out.println(order.getCustomer());
return "index";
}
}
</>復制代碼
在這里我們將MongoTemplate注入到一個類型為MongoOperations的屬性中。MongoOperations是MongoTemplate所實現的接口,MongoOperations中存在很多文檔操作方法
MongoOperations其實已經能滿足很多需求了
如果還沒有滿足你的需求,接下來我就介紹一下,如何編寫MongoDB Repository
編寫MongoDB Repository</>復制代碼
package springmvc.orders.db;
import java.util.List;
import org.springframework.data.mongodb.repository.MongoRepository;
import springmvc.bean.Order;
public interface OrderRepository extends MongoRepository {
List findByCustomer(String c);
List findByCustomerLike(String c);
List findByCustomerAndType(String c, String t);
List findByCustomerLikeAndType(String c, String t);
}
</>復制代碼
看到這里,大家有沒有發現package的地址就是我們剛才@EnableMongoRepositories(basePackages = "springmvc.orders.db")的配置
MongoRepository接口有兩個參數,第一個是帶有@Document注解的對象類型,也就是該Repository要處理的類型。第二個參數是帶有@Id注解的屬性類型
OrderRepository繼承了MongoRepository中很多自帶的方法
方法 | 描述 |
---|---|
long count() | 返回指定Repository類型的文檔數量 |
void delete(Iterable) | 刪除與指定對象關聯的所有文檔 |
void delete(T) | 刪除與指定對象關聯的文檔 |
void delete(ID) | 根據ID刪除某一個文檔 |
void deleteAll(); | 刪除指定Repository類型的所有文檔 |
boolean exists(Object) | 如果存在與指定對象相關聯的文檔,則返回true |
boolean exists(ID) | 如果存在與指定對象相關聯的文檔,則返回true |
List |
返回指定Repository類型的所有文檔 |
List |
返回指定文檔ID對應的所有文檔 |
List |
為指定Repository類型,返回分頁且排序的文檔列表 |
List |
為指定Repository類型,返回排序后的所有文檔列表 |
T findOne(ID) | 為指定的ID返回單個文檔 |
Save(terable |
保存指定Iterable中的所有文檔 |
save( |
為給定的對象保存一條文檔 |
上面的我們定義的四個方法都是我們自定義的方法,其方法名存在很多意義,不能隨便定義
</>復制代碼
List findByCustomer(String c);
find為查詢動詞,還可以是read、get、count等
Customer為斷言,判斷其行為
在斷言中,會有一個或多個限制結果的條件。每個條件必須引用一個屬性,并且還可以指定一種比較操作。如果省略比較操作符的話,那么這暗指是一種相等比較操作。不過,我們也可以選擇其他的比較操作
類型 |
---|
IsAfter、After、IsGreaterThan、GreaterThan |
IsGreaterThanEqual、GreaterThanEqual |
IsBefore、Before、IsLessThan、LessThan |
IsLessThanEqual、LessThanEqual |
IsBetween、Between |
IsNull、Null |
IsNotNull、NotNull |
IsIn、In |
IsNotIn、NotIn |
IsStartingWith、StartingWith、StartsWith |
IsEndingWith、EndingWith、EndsWith |
IsContaining、Containing、Contains |
IsLike、Like |
IsNotLike、NotLike |
IsTure、True |
IsFalse、False |
Is、Equals |
IsNot、Not |
other
類型 |
---|
IgnoringCase、IgnoresCase、OrderBy、And、Or |
</>復制代碼
@Query("{"customer":"Chuck Wagon","type":?0}")
List findChucksOrders(String t);
</>復制代碼
@Query中給定的JSON將會與所有的Order文檔進行匹配,并返回匹配的文檔,這里的type屬性映射成“?0”,這表明type屬性應該與查詢方法的第0個參數相等,如果有多個參數,則"?1".....
混合自定義的功能
</>復制代碼
package springmvc.orders.db;
import java.util.List;
import springmvc.bean.Order;
public interface OrderOperations {
List findOrdersByType(String t);
}
</>復制代碼
package springmvc.orders.db;
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;
import springmvc.bean.Order;
public class OrderRepositoryImpl implements OrderOperations {
@Autowired
private MongoOperations mongo;
//將混合實現注入MongoOperations
@Override
public List findOrdersByType(String t) {
String type =t.equals("Net")?"2":t;
Criteria where=Criteria.where("type").is(type);
Query query=Query.query(where);
return mongo.find(query, Order.class);
}
}
</>復制代碼
package springmvc.orders.db;
import java.util.List;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import springmvc.bean.Order;
//繼承OrderOperations接口
public interface OrderRepository extends MongoRepository,OrderOperations {
List findByCustomer(String c);
List findByCustomerLike(String c);
List findByCustomerAndType(String c, String t);
List findByCustomerLikeAndType(String c, String t);
@Query("{"customer":"Chuck Wagon","type":?0}")
List findChucksOrders(String t);
}
</>復制代碼
package springmvc.web;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import springmvc.bean.Order;
import springmvc.orders.db.OrderRepository;
@Controller
public class HomeController {
@Autowired
MongoOperations mongo;
@Autowired
OrderRepository orderRepository;
@RequestMapping(value = { "/", "index" }, method = RequestMethod.GET)
public String index() {
List list=orderRepository.findOrdersByType("2");
System.out.println(list.size());
return "index";
}
}
</>復制代碼
以上這些關聯起來的關鍵點是OrderRepositoryImpl,這個名字前半部分與OrderRepository相同,只是添加了一個“Impl”后綴。如果想更改該后綴,可以在MongoConfig類中更改為自己理想的后綴
</>復制代碼
@EnableMongoRepositories(basePackages = "springmvc.orders.db",repositoryImplementationPostfix="Stuff")
更多內容可以關注微信公眾號,或者訪問AppZone網站
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/64888.html
摘要:每個條件必須引用一個屬性,并且還可以指定一種比較操作。如果省略比較操作符的話,那么這暗指是一種相等比較操作。 Spring-data對MongoDB進行了很好的支持,接下來就講解一下關于Spring對MongoDB的配置和一些正常的使用 我下面的工程使用的是Spring的Java配置的方式和Maven構建 具體的工程代碼大家可以訪問我的Github地址:https://github.c...
摘要:安裝基本是一路下一步,需要注意的地方小胖網上找了幾張圖來說明。這里可以自定選擇需要安裝的東西小胖選擇完全安裝,隨便你們選擇安裝路徑但是需要注意不要選擇一個叫的東西,否則可能要很長時間都一直在執行安裝,是一個圖形界面管理工具。 Overview: 環境 前言 效果圖 mongdb安裝 代碼涉及知識點 關于windows的cmd下執行python文件顯示中文亂碼的問題 總結 0.環境 ...
摘要:后端好書閱讀與推薦系列文章后端好書閱讀與推薦后端好書閱讀與推薦續后端好書閱讀與推薦續二幾個月又過去了,又讀了幾本書,同時為了深切體會到某些書里面的要點還專門做了一個小項目,這里就把讀書與小項目過程中的一些心得體會記錄一下。 后端好書閱讀與推薦系列文章:后端好書閱讀與推薦后端好書閱讀與推薦(續)后端好書閱讀與推薦(續二) 幾個月又過去了,又讀了幾本書,同時為了深切體會到某些書里面的要點還...
摘要:后端好書閱讀與推薦系列文章后端好書閱讀與推薦后端好書閱讀與推薦續后端好書閱讀與推薦續二幾個月又過去了,又讀了幾本書,同時為了深切體會到某些書里面的要點還專門做了一個小項目,這里就把讀書與小項目過程中的一些心得體會記錄一下。 后端好書閱讀與推薦系列文章:后端好書閱讀與推薦后端好書閱讀與推薦(續)后端好書閱讀與推薦(續二) 幾個月又過去了,又讀了幾本書,同時為了深切體會到某些書里面的要點還...
閱讀 3898·2021-11-24 11:14
閱讀 3340·2021-11-22 13:53
閱讀 3904·2021-11-11 16:54
閱讀 1598·2021-10-13 09:49
閱讀 1238·2021-10-08 10:05
閱讀 3413·2021-09-22 15:57
閱讀 1768·2021-08-16 11:01
閱讀 984·2019-08-30 15:55