栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot整合MongoDB

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot整合MongoDB

SpringBoot集成MongoDB

Spring Data : Spring 的一个子项目。用于简化数据库访问,支持NoSQL 和 关系数据存储。其主要目标是使数据库的访问变得方便快捷。

spring-data-mongodb提供了MongoTemplate和MongoRepository两种方式访问MongoDB,其中MongoTemplate操作灵活而MongoRepository操作简单。项目中可以灵活使用。

(一)、MongoRepository

以Spring Date为中心的方法,基于所有Spring数据项目中众所周知的访问模式,提供更加灵活和复杂的api操作。

使用MongoRepository可以不写相关的查询组合语句,它会内部为我们实现这样的一个类。

按规定定义好接口名就可以免去写查询组合语句。

Repository 接口是 Spring Data 的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法

Spring Data可以允许只定义接口,只要遵循 Spring Data的规范,就无需写实现类。
在持久层接口上使用 @RepositoryDefinition 注解,并为其指定 domainClass 和 idClass 属性,与继承 Repository 等价。

Repository:仅仅是一个标识,表明任何继承它的均为仓库接口类
CrudRepository:继承 Repository,实现了一组 CRUD 相关的方法 
PagingAndSortingRepository:继承 CrudRepository,实现了一组分页排序相关的方法 
MongoRepository:继承 PagingAndSortingRepository,实现一组 mongodb规范相关的方法

(二)、MongoTemplate

MongoTemplate是数据库和代码之间的接口,对数据库的操作都在它里面.

MongoTemplate的两大核心类

Criteria类:封装所有的语句,以方法的形式查询。

Query类:将语句进行封装或者添加排序之类的操作。

MongoTemplate提供了很多操作MongoDB的方法。 它是线程安全的,可以在多线程的情况下使用。

MongoDB documents和domain classes之间的映射关系是通过实现了MongoConverter这个接口来实现的

步骤

1、导入依赖

 
            org.springframework.boot
            spring-boot-starter-data-mongodb
 

2、配置文件添加配置(结合自己应用做修改,这只是基础学习测试)

spring.data.mongodb.uri=mongodb://127.0.0.1:27017/test

3、创建对应实体类

实体类上添加@Document("集合/表名"),id属性由于MongoDB会生成24位的字符串需要设置为String类型且需要添加注解@Id。

4、

方式一、MongoRepository

1、创建数据访问层集成MongoRepository,第一个参数为实体类,后一个为主键ID的类型 

2、编写测试类

   

//注入刚刚定义的数据访问层的接口 
@Autowired
private UserRepository userRepository;

//添加
@Test
void create() {
  User u=new User();
  u.setEmail("123@qq.com");
  u.setAge(21);
  u.setName("xiaowang");
  User user = userRepository.insert(u);
  System.out.println(user);
}
//查询所有
@Test
void find(){
  List users = userRepository.findAll();
  System.out.println(users);
}
//通过id查询
@Test
void findById(){
  //Optional用来解决null判断问题的类
  Optional byId = userRepository.findById("6271dd84dac52a06a5dde65e");
  User user = byId.get();
  System.out.println(byId);
  System.out.println(user);
}
//多条件查询
@Test
void findByCondition(){
   
    User u=new User();
    u.setName("xiaolu");
    u.setAge(21);
    Example userExample =Example.of(u);
    System.out.println(userExample);
    List users = userRepository.findAll(userExample);
    System.out.println(users);
}
//模糊查询
@Test
void findLikeUser(){
   ExampleMatcher exampleMatcher=ExampleMatcher.matching()
       .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)//设置字符串模糊查询规则
       .withIgnoreCase(true);//设置忽略大小写
   User u=new User();
   u.setName("lu");
   u.setEmail("123");
   Example userExample = Example.of(u, exampleMatcher);
   List users = userRepository.findAll(userExample);
   System.out.println(users);
}
//分页查询
@Test
void findByPage(){
  
  Pageable pageable = PageRequest.of(1, 3);
  User u=new User();
  Example userExample = Example.of(u);
  Page userPage = userRepository.findAll(userExample, pageable);
  System.out.println(userPage);
  System.out.println(userPage.getContent());
  System.out.println(userPage.getTotalPages());
}
//更新
@Test
void update(){
  User user = userRepository.findById("627120bf48f3efd7bcb4348b").get();
  user.setEmail("123@qq.com");
  //带id的user save方法会做修改逻辑 不带id 执行添加逻辑
  User save = userRepository.save(user);
  System.out.println(save);
}
//删除
@Test
void delete(){
  userRepository.deleteById("6271e3c3d86e9b3c0b4f4e57");
}

 方式二、MongoTemplate

//注入MongoTemplate
@Autowired
private MongoTemplate mongoTemplate;

//添加
@Test
void create() {
   User user=new User();
   user.setName("xiaodeng");
   user.setAge(21);
   user.setEmail("123@123.com");
   User u = mongoTemplate.insert(user);
   System.out.println(u);
}

//查询所有
@Test
void find(){
  List users = mongoTemplate.findAll(User.class);
  for (User user : users) {
     System.out.println(user);
  }
}

//通过id查询
@Test
void findById(){
  User user = mongoTemplate.findById("627120bf48f3efd7bcb4348b", User.class);
  System.out.println(user);
}

//条件组合查询
@Test
void findByCondition(){
  
  Query query=new Query(
     Criteria.where("name").is("xiaodeng").and("age").is(21)
  );
  List users = mongoTemplate.find(query, User.class);
  for (User user : users) {
    System.out.println(user);
  }
}

//模糊查询
@Test
void findLikeUser(){
  
  String name="deng";
  //正则规则
  String regex=String.format("%s%s%s","^.*",name,".*$");
  //正则表达式
  Pattern pattern=Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
  //创建条件构造器
  Query query=new Query(
     Criteria.where("name").regex(pattern)
  );
  List users = mongoTemplate.find(query, User.class);
  for (User user : users) {
    System.out.println(user);
  }
}

//分页查询
@Test
void findByPage(){
  Integer pageNum=1;
  Integer pageSize=2;
  Query query=new Query();
  //查询记录数 query必须填写可以不构建条件,但不能类似mp直接写null
  long count = mongoTemplate.count(query, User.class);
  //分页  skip为跳过这几条数据意味着开始位置,limit为每页的数据量
  List users = mongoTemplate.find(query.skip((pageNum - 1) * 
                           pageSize).limit(pageSize), User.class);
  for (User user : users) {
    System.out.println(user);
  }
  System.out.println(count);
}

//修改
@Test
void update(){
  Query query=new Query(
     Criteria.where("_id").is("6271223648f3efd7bcb4348c")
  );
  Update update=new Update();
  update.set("name","xiaozuo");
  update.set("age",22);
  update.set("email","123@123.com");
  UpdateResult upsert = mongoTemplate.upsert(query, update, User.class);
  long matchedCount = upsert.getMatchedCount();//影响行数
  System.out.println(upsert);
}

//删除
@Test
void delete(){
  Query query=new Query(
     Criteria.where("_id").is("6271223648f3efd7bcb4348c")
  );
  DeleteResult remove = mongoTemplate.remove(query, User.class);
  long deletedCount = remove.getDeletedCount();//影响行数
  System.out.println(deletedCount);//1 成功 0 失败
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/859876.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号