天天看點

OCM 基本操作

當您在您的應用程式中建立了一個新的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查詢,對于查詢結果添加了緩存層,節點路徑作為緩存鍵

繼續閱讀