继续MongoDB系列博客的第四篇,上一篇记录了使用MongoTemplate进行增删改查的操作,这一片我们使用MongoRepository来实现增删改查操作,各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!
我们使用Jpa的时候通过继承JpaRepository,使用mybatis-plus的时候通过继承BaseMapper或得通用的curd能力,方便我们的操作,同样springboot集成mongo的时候data包中为我们提供了MongoRepository接口,通过继承此接口,也可以直接使用接口提供的curd方法,MongoRepository相比于MongoTemplate 在一些常用简单查询上还是更方便的。
目录
测试环境准备
新增UserRepository类继承MongoRepository接口:
public interface UserRepository extends MongoRepository<User,String> {}
我们在测试类中可以直接注入UserRepository
@Autowired
private UserRepository userRepository;
准备下测试数据:
public User getUser(){
return User.builder().username("zhaoliu").age(10).sex("男").address(
"rizhao").build();
}
public List<User> getUserList(){
User user2 =
User.builder().username("zhangsan").age(20).sex("男").address("jinan").build();
User user3 =
User.builder().username("lisi").age(30).sex("女").address("jinan").build();
List<User> userList = new ArrayList<>();
userList.add(user2);
userList.add(user3);
return userList;
}
public void clearDb(){
userRepository.deleteAll();
}
@Test
public void addTestDatas(){
User user = getUser();
userRepository.insert(user);
List<User> userList = getUserList();
userRepository.insert(userList);
}
insert 操作
@Test
public void insert(){
clearDb();
User user = getUser();
userRepository.insert(user);
List<User> userList = getUserList();
userRepository.insert(userList);
}
save 操作
@Test
public void save(){
clearDb();
userRepository.save(getUser());
userRepository.saveAll(getUserList());
}
delete 操作
@Test
public void delete(){
userRepository.deleteById("60ee9cded82d3d76d2ed2205");
User user = User.builder().id("60ee9cd8d82d3d76d2ed2204").age(300).build();
// 本质还是按照id删除 必须有id 其它参数无所谓
userRepository.delete(user);
User user1 = User.builder().id("60ee4af0771c712494b9ac4d").age(300).build();
List<User> userList = Arrays.asList(user1);
// 删除所有给定实体
userRepository.deleteAll(userList);
// 删除collection中所有数据
userRepository.deleteAll();
}
update 操作
/**
* 没有update相关api
* 修改通过save来实现 save有则修改 没有则新增
*/
@Test
public void update(){
User user = User.builder().id("60ee4af0771c712494b9ac4d").age(30).build();
userRepository.save(user);
}
select 操作
/**
* MongoRepository常用api
* MongoRepository相比于MongoTemplate 在一些常用简单查询上还是更方便的
*/
@Test
public void select(){
Optional<User> user = userRepository.findById("60ee4af0771c712494b9ac4d");
System.out.println(user);
List<User> userList = userRepository.findAll();
System.out.println(userList);
Sort sort = Sort.by(Sort.Direction.DESC,"age");
List<User> userList1 = userRepository.findAll(sort);
System.out.println(userList1);
User user1 = User.builder().id("60ee4af0771c712494b9ac4d").build();
Example<User> example = Example.of(user1);
List<User> userList2 = userRepository.findAll(example);
System.out.println(userList2);
User user2 = User.builder().username("lisi").build();
ExampleMatcher matching =
ExampleMatcher.matching()
.withMatcher("username", ExampleMatcher.GenericPropertyMatchers.contains());
Example<User> example1 = Example.of(user2,matching);
List<User> userList3 = userRepository.findAll(example1);
System.out.println(userList3);
List<User> userList4 = userRepository.findAll(example1, sort);
System.out.println(userList4);
Pageable pageable = PageRequest.of(0,2);
Page<User> userPage = userRepository.findAll(pageable);
System.out.println("---getTotalElements---" + userPage.getTotalElements());// 总记录数
System.out.println("---getTotalPages---" + userPage.getTotalPages());// 总页数
System.out.println("---getNumber---" + userPage.getNumber());// 当前页
System.out.println("---getSize---" + userPage.getSize());// 每页大小
System.out.println("---getContent---" + userPage.getContent()); // 数据
System.out.println("---getNumberOfElements---" + userPage.getNumberOfElements());// 当前页的元素数
}
自定义查询方法
public interface UserRepository extends MongoRepository<User,String> {
List<User> findByUsernameLike(String username);
Page<User> findByUsernameLike(String username, Pageable pageable);
@Query(value = "{_id:?0}")
User findByUserId(String id);
@Query(value = "{'$and':[{username:?0},{age:{'$gt':?1}}]}")
User findByNameAndAge(String username,Integer age);
}
/**
* 自定义查询
* 1.格式:findBy + 属性名 + 规则
* 2.还可以使用@Query注解
*/
@Test
public void select1(){
List<User> userList = userRepository.findByUsernameLike("lisi");
System.out.println(userList);
Pageable pageable = PageRequest.of(0,2);
Page<User> userPage = userRepository.findByUsernameLike("lisi", pageable);
System.out.println("---getTotalElements---" + userPage.getTotalElements());// 总记录数
System.out.println("---getTotalPages---" + userPage.getTotalPages());// 总页数
System.out.println("---getNumber---" + userPage.getNumber());// 当前页
System.out.println("---getSize---" + userPage.getSize());// 每页大小
System.out.println("---getContent---" + userPage.getContent()); // 数据
System.out.println("---getNumberOfElements---" + userPage.getNumberOfElements());// 当前页的元素数
User user = userRepository.findByUserId("60ee4af0771c712494b9ac4e");
System.out.println(user);
User user1 = userRepository.findByNameAndAge("lisi", 25);
System.out.println(user1);
}