spring-data-mongodb中的MongoTemplate與MongoRepository及推薦


SpringData支持兩種關系數據存儲技術:

JDBC
JPA

● SpringData 方法定義JPA規范:

 

1. 不是隨便聲明的,而需要符合一定的規范
2. 查詢方法以find | read | get開頭
3. 涉及條件查詢時,條件的屬性用條件關鍵字連接
4. 要注意的是:條件屬性首字母需要大寫
5. 支持屬性的級聯查詢,但若當前類有符合條件的屬性則優先使用,而不使用級聯屬性,若需要使用級聯屬性,則屬性之間使用_強制進行連接

(一)、MongoRepository
 

1.使用Spring Data MongoDb Repository可以使你不用寫相關的查詢組合語句,它會內部為我們實現這樣的一個類。 
2.只要你按規定定義好接口名就可以免去你寫查詢組合語句。 
3.要有主鍵值才可以用save(有就更新,沒有就插入)。所以就算沒有ID也增加這個字段是好的。(id要是String才會自動為你生面ID號(保存時可以沒有值),int 要你自己做惟一處理和輸入值) 
4.DATE不能作為主鍵使用。 


Repository 接口是 Spring Data 的一個核心接口,它不提供任何方法,開發者需要在自己定義的接口中聲明需要的方法 

public interface Repository<T, ID extends Serializable> { } 
Spring Data可以讓我們只定義接口,只要遵循 Spring Data的規范,就無需寫實現類。  
與繼承 Repository 等價的一種方式,就是在持久層接口上使用 @RepositoryDefinition 注解,並為其指定 domainClass 和 idClass 屬性,兩種方式沒有區別。

Repository 提供了最基本的數據訪問功能,其幾個子接口則擴展了一些功能。它們的繼承關系如下:

Repository: 僅僅是一個標識,表明任何繼承它的均為倉庫接口類
CrudRepository: 繼承 Repository,實現了一組 CRUD 相關的方法 
PagingAndSortingRepository: 繼承 CrudRepository,實現了一組分頁排序相關的方法 
MongoRepository: 繼承 PagingAndSortingRepository,實現一組 mongodb規范相關的方法

自定義的 XxxxRepository 需要繼承 MongoRepository,這樣的 XxxxRepository 接口就具備了通用的數據訪問控制層的能力(CURD的操作功能)。

 MongoRepository的缺點是不夠靈活,MongoTemplate可以用來補充,對mongodb本身熟悉的話,你會發現使用MongoTemplate更加游刃有余,它更加接近原生的mongodb命令。

(二)、MongoTemplate(跟Mybatis類似)

MongoTemplate是數據庫和代碼之間的接口,對數據庫的操作都在它里面。

MongoTemplate核心操作類:Criteria和Query 

  • Criteria類:封裝所有的語句,以方法的形式查詢。
  • Query類:將語句進行封裝或者添加排序之類的操作。
1.MongoTemplate實現了interface MongoOperations。
2.MongoDB documents和domain classes之間的映射關系是通過實現了MongoConverter這個interface的類來實現的。
3.MongoTemplate提供了非常多的操作MongoDB的方法。 它是線程安全的,可以在多線程的情況下使用。
4.MongoTemplate實現了MongoOperations接口, 此接口定義了眾多的操作方法如"find", "findAndModify", "findOne", "insert", "remove", "save", "update" and "updateMulti"等。
5.MongoTemplate轉換domain object為DBObject,缺省轉換類為MongoMappingConverter,並提供了Query, Criteria, and Update等流式API。

因為我們大都和spring一起使用,所以推薦參考https://docs.spring.io/spring-data/mongodb/docs/2.0.14.RELEASE/reference/html/#mongo.query。

public class MongoApp {

  private static final Log log = LogFactory.getLog(MongoApp.class);

  public static void main(String[] args) {

    MongoOperations mongoOps = new MongoTemplate(new MongoClient(), "database"); 
Person p
= new Person("Joe", 34); // Insert is used to initially store the object into the database.
mongoOps.insert(p); log.info(
"Insert: " + p); // Find
p = mongoOps.findById(p.getId(), Person.class);
log.info(
"Found: " + p); // Update
mongoOps.updateFirst(query(where("name").is("Joe")), update("age", 35), Person.class);
p
= mongoOps.findOne(query(where("name").is("Joe")), Person.class);
log.info(
"Updated: " + p); // Delete
mongoOps.remove(p);
// Check that deletion worked
List<Person> people = mongoOps.findAll(Person.class);
log.info(
"Number of people = : " + people.size());
mongoOps.dropCollection(Person.
class);
}
}
@Configuration
public class AppConfig {

  public @Bean MongoClient mongoClient() {
      return new MongoClient("localhost");
  }

  public @Bean MongoTemplate mongoTemplate() {
      return new MongoTemplate(mongoClient(), "mydb");
  }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM