目录
[一、 使用mongoTemplate操作3步骤](#一、 使用mongoTemplate操作3步骤)
[二、使用 MongoRepository操作4步骤](#二、使用 MongoRepository操作4步骤)
- spring-data-mongodb提供了MongoTemplate与MongoRepository两种方式访问mongodb
- MongoRepository操作简单,MongoTemplate操作灵活,我们在项目中可以灵活适用这两种方式操作mongodb,MongoRepository的缺点是不够灵活,MongoTemplate正好可以弥补不足。
1、使用MongoTemplate
2、使用MongoRepository
一、 使用mongoTemplate操作3步骤
1.引入starter依赖
java<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>2.配置文件yaml增加mongodb连接信息
spring.mongodb.uri=mongodb://8.160.170.126:27018/test
3.在使用的地方直接注入MongoTemplate对象
@Autowired private MongoTemplate mongoTemplate;
创建一个对象
java
// 添加lombok依赖
/*<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency> */
@Data
@NoArgsConstructor
@AllArgsConstructor //pojo类对应的集合(首字母小写):
//@Document(value = "Actor")
public class Actor {
// @Id //当前属性和mongodb集合中的主键是对应的
// private String aaaid; //id 对应mongodb中集合的_id字段有一个对应关系:mongotemplate
private String id;
private String actorName;
private Boolean gender;
private Date birth;
}
新增
新建测试类,引入mongoTemplate
新增可以使用save或 insert
java
@SpringBootTest // 和启动类同包,可以不加classes属性,(classes = MongoDemoApplication.class)
public class TemplateTest{
@Autowired
private MongoTemplate mongoTemplate;
@Test
public void testInsert() {
// mongoTemplate.insert(new Actor("3","刘德华insert",true,new Date()));
Actor actor = new Actor();
actor.setId("1");
actor.setActorName("刘德华");
mongoTemplate.save(actor);
}
}


批量新增
java
@Test
public void testBatchInsert() {
List<Actor> actors = new ArrayList<Actor>();
actors.add(new Actor("11", "Jerry", false, new Date()));
actors.add(new Actor("13", "Andy", false, new Date()));
actors.add(new Actor("14", "jack", false, new Date()));
actors.add(new Actor("15", "Tom", false, new Date()));
mongoTemplate.insert(actors, Actor.class);
}

修改
#新增:可以使用insert、save方法
1、insert只能做添加,不能做修改,可以批量添加数据
2、save既可以做添加,也可以做修改,如果我们要使用save修改集合中某个字段的值,其它字段保持原来的值,必须是先查询出来,然后修改,最后写回去。
java
@Test
public void testModify(){
Actor actor = mongoTemplate.findById("3", Actor.class);
actor.setActorName("刘德华insert_modiyf");
mongoTemplate.save(actor);
}

删除
删除:
and 关系: Criteria.where("gender").is(false).and("actorName").is("张敏")
or关系: Criteria criteria=new Criteria(); criteria.orOperator(Criteria2,Criteria2,...)
java
@Test
public void testDelete(){
Criteria criteria=new Criteria();
criteria.orOperator(Criteria.where("_id").is("1"),Criteria.where("actorName").is("关之琳"));
Query query=new Query(criteria);
DeleteResult remove = mongoTemplate.remove(query, Actor.class);
System.out.println(remove.getDeletedCount()); // 打印删除个数
}
更新
java
@Test
public void testUpdate() {
Query query = new Query(Criteria.where("gender").is(true));
Update update = new Update();
// 增加年龄字段 为 19
update.set("age", 19);
// mongoTemplate.upsert(query, update, Actor.class);
// mongoTemplate.updateFirst(query, update, Actor.class);
mongoTemplate.updateMulti(query, update, Actor.class);
}

查询
java
@Test
public void testQuery(){
// Actor actor = mongoTemplate.findById("15", Actor.class);
// System.out.println(actor);
//
// List<Actor> all = mongoTemplate.findAll(Actor.class);
// for (Actor actor1 : all) {
// System.out.println(actor1);
// }
// Query query=new Query(Criteria.where("age").is(19));
// List<Actor> actors = mongoTemplate.find(query, Actor.class);
// for (Actor actor : actors) {
// System.out.println(actor);
// }
String result = String.format("%s%s%s", ".*", "j", ".*");
Pattern pattern=Pattern.compile(result,Pattern.CASE_INSENSITIVE);
Query query=new Query(Criteria.where("actorName").regex(pattern));
List<Actor> actors = mongoTemplate.find(query, Actor.class);
for (Actor actor : actors) {
System.out.println(actor);
}
}
分页查询
java
//分页查询
@Test
public void testQueryPage() {
int pageNum = 1;
int size = 3;
Query query = new Query(Criteria.where("gender").is(false));
long total = mongoTemplate.count(query, Actor.class);
List<Actor> actors = mongoTemplate.find(query.skip((pageNum - 1) * size).limit(size), Actor.class);
for (Actor actor : actors) {
System.out.println(actor);
}
Map<String, Object> map = new HashMap<String, Object>();
map.put("total", total);
map.put("rows", actors);
System.out.println(total);
}
二、使用 MongoRepository操作4步骤
1、导入starter依赖
2、配置文件增加mong连接配置
3、使用xxxRepository继承 MongoRepository<实体对象,主键类型>
public interface ActorRepository extends MongoRepository<Actor,String>
4、在使用的地方注入代理对象ActorRepository
新增
java
@Test
public void testInsert(){
// actorRepository.insert(new Actor("16","repos 1",true,new Date()));
// actorRepository.save(new Actor("17","repos 2",true,new Date()));
List<Actor> actorList=new ArrayList<Actor>();
actorList.add(new Actor("40","周润发2",true,new Date()));
actorList.add(new Actor("41","周星驰2",true,new Date()));
actorList.add(new Actor("42","李连杰2",true,new Date()));
// actorRepository.insert(actorList);
actorRepository.saveAll(actorList);
}

删除
java
@Test
public void testDelete(){
// actorRepository.deleteById("6ad88ab9dee946d789218d2b");
Actor actor = new Actor();
actor.setId("32");
actorRepository.delete(actor);
}

修改
java
@Test
public void testUpdate(){
Actor actor=new Actor();
actor.setId("31");
actor.setActorName("刘德华modify");
actorRepository.save(actor);
}

查询
java
@Test
public void testQuery(){
// Actor actor = actorRepository.findById("30").get();
// System.out.println(actor);
Actor actor=new Actor();
//actor.setGender(true);
actor.setActorName("j");
ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
//.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
.withMatcher("actorName", ExampleMatcher.GenericPropertyMatchers.startsWith())
.withIgnoreCase(false); //改变默认大小写忽略方式:忽略大小写
Example<Actor> example=Example.of(actor,matcher);
List<Actor> all = actorRepository.findAll(example);
for (Actor actor1 : all) {
System.out.println(actor1);
}
}

分页查询
java
@Test
public void testPage() {
int pageNum = 0; // 起始页从0开始
int pagesize = 3;
Actor actor = new Actor();
actor.setGender(true);
Example<Actor> example = Example.of(actor);
// Pageable pageable= PageRequest.of(pageNum,pagesize, Sort.by("id").descending());
Pageable pageable = PageRequest.of(pageNum, pagesize);
Page<Actor> page = actorRepository.findAll(example, pageable);
System.out.println("总记录数:" + page.getTotalElements());
System.out.println("总页数:" + page.getTotalPages());
System.out.println("当前页列表数据:");
for (Actor actor1 : page.getContent()) {
System.out.println(actor1);
}
}


注意:构建的分页对象,起始页从0开始