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"); } }