當您在您的應用程式中建立了一個新的ObjectContentMapper,您可以使用這個元件來插入、更新、删除和檢索對象。
本文章的基本操作僅使用注解方式
- 對象準備
User:
//@Node 作用于類,使用注解政策,必須在類對象進行注解聲明
@Node
public class User {
//@Field 聲明類對象屬性是否适用注解政策,如果屬性不進行聲明,則ocm對象将不管理該對象的該屬性,path=ture 指定該節點的路徑,如果不設定則ocm.save()會抛出異常
@Field(path = true)
private String path;
@Field
private String name;
@Field
private int age;
@Field
private String sex;
@Field
private String address;
//@Bean 屬性映射到一個對象
@Bean
private Job job;
//@Collection 屬性可以映射到一個集合
@Collection
private List<Education> educations;
public User(){
}
public User(String path, String name, int age, String sex, String address) {
this.path = path;
this.name = name;
this.age = age;
this.sex = sex;
this.address = address;
}
//todo setter and getter
}
Job:
@Node
public class Job {
@Field
private String name;
@Field
private String company;
@Field
private Date start;
@Field
private Date end;
//todo setter and getter
}
Education:
@Node
public class Education {
@Field
private String school;
@Field
private Date start;
@Field
private Date end;
public Education() {
}
public Education(String school, Date start, Date end) {
this.school = school;
this.start = start;
this.end = end;
}
//todo setter and getter
}
ObjectContentManager 對象初始化
Repository repository = JcrUtils.getRepository();
SimpleCredentials cred = new SimpleCredentials("admin", "admin".toCharArray());
Session session = repository.login(cred);
List<Class> classes = new ArrayList<>();
//對象使用的所有類對象必須注冊到AnnotationMapperImpl,否則查詢時,找不到類對應的ClassDescriptor,會抛出異常
classes.add(User.class);
classes.add(Job.class);
classes.add(Education.class);
Mapper mapper = new AnnotationMapperImpl(classes);
ocm = new ObjectContentManagerImpl(session, mapper);
- 插入 insert
public void save() {
User user = new User("/user/tom", "tom", 20, "male", "四川省成都市");
Job job = new Job();
job.setName("java 工程師");
job.setCompany("螞蟻金服");
Calendar calendar = Calendar.getInstance();
calendar.set(2018, 2, 20);
Date date = calendar.getTime();
job.setStart(calendar.getTime());
user.setJob(job);
List<Education> educations = new ArrayList() {
{
add(new Education("四川大學", date, date));
add(new Education("複旦大學", date, date));
add(new Education("清華大學", date, date));
}
};
user.setEducations(educations);
ocm.insert(user);
//在不開啟事務的情況下: 在插入、删除或更新之後,可以調用ocm.save()方法将更改持久化到JCR存儲庫中。
ocm.save();
}
- 查詢 search
ObjectContentMapper 對于查詢接口封裝得很豐富,如:根據路徑,根據Query對象,Query包含過濾器對象Filter
注意query查詢有個問題,就是對于類似 user.name= ’tom’ and job.company=‘螞蟻金服’ 是無法查詢處結果的。
@Test
public void pathSearch() {
User user = (User) ocm.getObject("/user");
Assert.assertEquals(user.getPath(), "/user");
System.out.println(user.getName());
}
@Test
public void searchWithQuery() {
QueryManager queryManager = ocm.getQueryManager();
Filter filter = queryManager.createFilter(User.class);
filter.addEqualTo("name", "tom");
filter.addGreaterThan("age", 20);
Query query = queryManager.createQuery(filter);
Collection collection = ocm.getObjects(query);
}
//Searching a single object
@Test
public void searchWithFilter() {
QueryManager queryManager = ocm.getQueryManager();
Filter filter = queryManager.createFilter(User.class);
filter.addEqualTo("name", "tom");
Query query = queryManager.createQuery(filter);
List<User> users = (List<User>) ocm.getObjects(query);
}
//Searching a collection
@Test
public void searchCollection() {
QueryManager queryManager = ocm.getQueryManager();
Filter filter = queryManager.createFilter(User.class);
filter.setScope("/user/node/");
filter.addEqualTo("name", "tom");
Query query = queryManager.createQuery(filter);
Collection collection = ocm.getObjects(query);
}
//Searching with an iterator
@Test
public void searchIterator() {
QueryManager queryManager = ocm.getQueryManager();
Filter filter = queryManager.createFilter(User.class);
filter.setScope("/user/node//");
Query query = queryManager.createQuery(filter);
Iterator iterator = ocm.getObjectIterator(query);
}
- 删除 delete
remove(String path)
remove(Object object)
remove(Query query)
- 更新 update
@Test
public void update(){
User user = (User) ocm.getObject("/user/tom");
user.setName("tom->Jerry");
ocm.update(user);
user = (User) ocm.getObject("/user/tom");
System.out.println(user.getName());
}
PS:
1.ocm查詢,可以根據路徑将查詢到的資料轉換成目标類。比對上屬性就設定值,沒有比對上則為空值,不會抛出異常
2.ocm查詢,将資料轉換成對象,都是利用的反射。
3.ocm查詢,對于查詢結果添加了緩存層,節點路徑作為緩存鍵