天天看点

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查询,对于查询结果添加了缓存层,节点路径作为缓存键

继续阅读