当您在您的应用程序中创建了一个新的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查询,对于查询结果添加了缓存层,节点路径作为缓存键