mongodb开发---java方式
java方式操作mongodb数据库常用的两种方式:1.使用spring提供的repository接口;2.使用mongoTemplate工具类。
1.mongoDB与spring boot集成及使用reposity:
注解:
1.@Document : 映射领域模型和文档(类似于mysql中的表)
2.@Id:注解表明这个属性值为文档的id
3.@Field(""):将该字段映射到文档中,并自定义key名
4.@Indexed : 标识需要进行索引的对象
5.@DocumentId : 用于标示实体类中的唯一的属性保存在索引文件中,是当进行全文检索时可以这个
唯一的属性来区分索引中其他实体对象,一般使用实体类中的主键属性
6.@DBRef 对象关联(类似于sql的外键关联,可以关联查询)
1.@Document : 映射领域模型和文档(类似于mysql中的表)
2.@Id:注解表明这个属性值为文档的id
3.@Field(""):将该字段映射到文档中,并自定义key名
4.@Indexed : 标识需要进行索引的对象
5.@DocumentId : 用于标示实体类中的唯一的属性保存在索引文件中,是当进行全文检索时可以这个
唯一的属性来区分索引中其他实体对象,一般使用实体类中的主键属性
6.@DBRef 对象关联(类似于sql的外键关联,可以关联查询)
Repository:
Repository 接口概述
Repository 接口是 Spring Data 的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法
public interface Repository<T, ID extends Serializable> { }
Spring Data可以让我们只定义接口,只要遵循 Spring Data的规范,就无需写实现类。与继承 Repository 等价的一种方式,就是在持久层接口上使用 @RepositoryDefinition 注解,并为其指定 domainClass 和 idClass 属性。如下两种方式是完全等价的。
Repository 接口概述
Repository 接口是 Spring Data 的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法
public interface Repository<T, ID extends Serializable> { }
Spring Data可以让我们只定义接口,只要遵循 Spring Data的规范,就无需写实现类。与继承 Repository 等价的一种方式,就是在持久层接口上使用 @RepositoryDefinition 注解,并为其指定 domainClass 和 idClass 属性。如下两种方式是完全等价的。
Repository 的子接口:
基础的 Repository 提供了最基本的数据访问功能,其几个子接口则扩展了一些功能。它们的继承关系如下:
Repository: 仅仅是一个标识,表明任何继承它的均为仓库接口类
CrudRepository: 继承 Repository,实现了一组 CRUD 相关的方法
PagingAndSortingRepository: 继承 CrudRepository,实现了一组分页排序相关的方法
MongoRepository: 继承 PagingAndSortingRepository,实现一组 mongodb规范相关的方法
自定义的 XxxxRepository 继承 MongoRepository,这样的 XxxxRepository 接口就具备了通用的数据访问
控制层的能力。
自定义接口时和使用jpa自定义的方式一样,例子如下:
//0.相等
public List<Book> findByTitle(@Param("title") String title);
//1.大于 GreaterThan
List<Book> findByAgeGreaterThan(int age);
// 2.小于 LessThan
List<Book> findByAgeLessThan(int age);
// 3.在..之间 Between
List<Book> findByAgeBetween(int start,int end);
// 4.是否非空 IsNotNull,NotNull
List<Book> findByAgeIsNotNull();
// 5.是否为null IsNull Null
List<Book> findByAgeNull();
// 6.模糊查询 like
List<Book> findByTitleLike(String title);
// 7.不包含 NOT,也可以添加分页参数
Page<Book> findByAgeNot(int age,Pageable page);
public List<Book> findByTitle(@Param("title") String title);
//1.大于 GreaterThan
List<Book> findByAgeGreaterThan(int age);
// 2.小于 LessThan
List<Book> findByAgeLessThan(int age);
// 3.在..之间 Between
List<Book> findByAgeBetween(int start,int end);
// 4.是否非空 IsNotNull,NotNull
List<Book> findByAgeIsNotNull();
// 5.是否为null IsNull Null
List<Book> findByAgeNull();
// 6.模糊查询 like
List<Book> findByTitleLike(String title);
// 7.不包含 NOT,也可以添加分页参数
Page<Book> findByAgeNot(int age,Pageable page);
// 8.在进行复杂查询时,使用上面的方法可能不是太好,使用@Query注解来进行负责查询
//:使用的是mongodb原生的查询语句,通过坐标来定义方法的参数
@Query("{ 'name':{'$regex':?2,'$options':'i'}, sales': {'$gte':?1,'$lte':?2}}")
//:使用的是mongodb原生的查询语句,通过坐标来定义方法的参数
@Query("{ 'name':{'$regex':?2,'$options':'i'}, sales': {'$gte':?1,'$lte':?2}}")
public Page<Book> findByNameAndAgeRange(String name,double ageFrom,double ageTo,Pageable page);
//还可以在后面通过fields属性指定要返回的数据字段,如上面的例子修改如下,则只通过Book表里面的name和age
字段构建Book对象。
@Query(value="{ 'name':{'$regex':?2,'$options':'i'}, sales':{'$gte':?1,'$lte':?2}}",fields="{ 'name' : 1, 'age' : 1}")
public Page<Book> findByNameAndAgeRange2(String name,double ageFrom,double ageTo,Pageable page);
@Query(value="{ 'name':{'$regex':?2,'$options':'i'}, sales':{'$gte':?1,'$lte':?2}}",fields="{ 'name' : 1, 'age' : 1}")
public Page<Book> findByNameAndAgeRange2(String name,double ageFrom,double ageTo,Pageable page);
2.使用mongoTemplate
springboot集成mongoTemplate需要导入以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
使用spring parent的版本也有要求,使用1.4.5时不能导入mongoTemplate包,但1.4.3和1.5.1都可以正常导入。
<!-- 增加spring boot热部署:更改代码后自动重启项目 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
使用spring parent的版本也有要求,使用1.4.5时不能导入mongoTemplate包,但1.4.3和1.5.1都可以正常导入。
<!-- 增加spring boot热部署:更改代码后自动重启项目 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<!-- optional=true,依赖不会传递,该项目依赖devtools;之后依赖myboot项目的项目如果想要使用devtools,
需要重新引入 -->
</dependency>
</dependency>
// 创建集合
// DBCollection createCollection = mongoTemplate.createCollection(Person.class);
//判断集合是否存在
// Boolean isExist = mongoTemplate.collectionExists(Person.class);
//删除集合
// mongoTemplate.dropCollection(Person.class);
//插入文档
// Person p = new Person(null, "张三", 23, new Date());
// mongoTemplate.insert(p, collection_name_person);
// mongoTemplate.findById(id, entityClass)
//通过id查找
// p = mongoTemplate.findById("58bb95f41aaa4b05e463c2c4",Person.class,collection_name_person);
// log.info("findById:"+p);
//删除:通过id
// mongoTemplate.remove(p,collection_name_person);
//批量插入
// List<Person> ps1= generatorList();
// mongoTemplate.insert(ps1, Person.class);
//全部取出
// List<Person> ps2 = mongoTemplate.findAll(Person.class, collection_name_person);
//分页查询
// Query q = new Query();
// q.skip(2);
// q.limit(3);
// List<Person> ps3 = mongoTemplate.find(q, Person.class);
//条件查询:query Criteria
// Query q = new Query();
// Criteria c= new Criteria("age");
// c.gt(8);
// q.addCriteria(c);
// List<Person> ps4 = mongoTemplate.find(q, Person.class);
//更新
// mongoTemplate.updateFirst();//进行第一条符合要求的数据更新
// mongoTemplate.updateMulti();//进行更新多行数据
// mongoTemplate.upsert(query, update, entityClass)更新
// mongoTemplate.updateMulti(query, update, entityClass, collectionName) 批量更新
// mongoTemplate.upsert(query, update, entityClass)// 存在则更新,不存在则插入
// mongoTemplate.save(objectToSave, collectionName); 根据id进行替换整个文档
// mongoTemplate.count(query, entityClass, collectionName) 查询总记录数
//删除
// mongoTemplate.dropCollection(entityClass); 删除集合
// mongoTemplate.remove(query, entityClass, collectionName) 删除文档
//查询
// mongoTemplate.findOne();//单个结果查询操作
// mongoTemplate.exists(query, entityClass)判断是否存在
// mongoTemplate.findAllAndRemove(query, entityClass, collectionName) 查出后删除
// mongoTemplate.findAndModify(query, update, entityClass, collectionName) 查出后更新
// mongoTemplate.group(inputCollectionName, groupBy, entityClass) 分组
使用Criteria和query对象进行条件查询
//1
// Query q1 = new Query();
// Criteria c1 = new Criteria();
// c1.where("name");
// c1.is("张三");
// q1.addCriteria(c1);
// Person p = mongoTemplate.findOne(q1, Person.class, collection_name_person);
//2 and条件查询
// Query q2 = new Query();
// Criteria c2 = new Criteria("age");
// c2.gte(20).and("name").is("张三");
// q2.addCriteria(c2);
// List<Person> ps = mongoTemplate.find(q2, Person.class, collection_name_person);
//in查询(转载)
// List<String> authors = Arrays.asList("yinjihuan", "jason");
// query = Query.query(Criteria.where("author").in(authors));
// articles = mongoTemplate.find(query, Article.class);
//or条件查询 没成功
// Query q3 = new Query();
// Criteria c3 = new Criteria("age");
// c3.lte(20);
// Criteria c4 = new Criteria("name");
// c4.is("张三");
// c3.orOperator(c4);
// c3.andOperator(criteria) and操作
// q3.addCriteria(c3);
// List<Person> ps2 = mongoTemplate.find(q3, Person.class, collection_name_person);
其实和查询语句中的设置相类似。