SpringBoot集成mongodb——MongoTemplate 与 MongoRepository 两种方式CRUD

SpringBoot集成mongodb

spring-data-mongodb,提供了MongoTemplate 与 MongoRepository 两种方式访问mongodb,MongoRepository操作简单,MongoTemplate操作灵活,我们在项目中可以灵活适用这两种方式操作mongodb ,MongoRepository的缺点是不够灵活,MongoTemplate,正好可以弥补不足。

准备工作:

  1. 引入相关依赖
  2. 核心配置文件中配置mongodb地址
  3. 创建对应的实体类

在这里插入图片描述

1.1 引入相关依赖

pom.xml

<!--SpringBoot 集成 MongoDB起步依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!--lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
<!--用于日期的相关依赖-->
<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
</dependency>

1.2 核心配置文件中配置mongodb地址

application.properties

#MongoDB的相关配置
spring.data.mongodb.uri=mongodb://43.142.*1.203:27017/test

1.3 创建对应的实体类

User.java

package com.guo.mongodb.entity;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Data
@Document("User")   //操作mongodb中对应的集合名称
public class User {
    @Id    //_id自动生成
    private String id;
    private String name;
    private int age;
    private String email;
    private String createDate;
}

2 基于MongoTemplate实现增 删 改 查

//注入MongoTemplate 
@Autowired
private MongoTemplate mongoTemplate;

2.1 添加

// 添加操作
@Test
public void create(){
    User user = new User();
    user.setName("lucy");
    user.setAge(18);
    user.setEmail("888@qq.com");
    User insert = mongoTemplate.insert(user);
    System.out.println(insert);
}
/**
 * > db.User.find()
 * { "_id" : ObjectId("633f91bf8af3283824edb456"), "name" : "lucy", "age" : 18, "email" : "888@qq.com", "_class" : "com.guo.mongodb.entity.User" }
 * >
 */

2.2 查询

2.2.1 查询所有
//查询所有的数据
@Test
public void findAll(){
    List<User> all = mongoTemplate.findAll(User.class);
    System.out.println(all);
}
//[User(id=633f91bf8af3283824edb456, name=lucy, age=18, email=888@qq.com, createDate=null)]

2.2.2 根据id查询
//根据id查询
@Test
public void findById(){
    User user = mongoTemplate.findById("633f91bf8af3283824edb456", User.class);
    System.out.println(user);
}
//User(id=633f91bf8af3283824edb456, name=lucy, age=18, email=888@qq.com, createDate=null)
2.2.3 条件查询

注意:条件查询的构造器导包别导错了

import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

//条件查询
@Test
public void findUserList(){
    //name=lucy and age=18
    Query query = new Query(
            Criteria.where("name").is("lucy")
                    .and("age").is(18));
    List<User> userList = mongoTemplate.find(query, User.class);
    System.out.println(userList);
}
//[User(id=633f91bf8af3283824edb456, name=lucy, age=18, email=888@qq.com, createDate=null)]
2.2.4 模糊查询
//模糊查询   使用正则表达式
@Test
public void findLikeUserList(){
    //name like lucy
    String name = "uc";
    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<User> userList = mongoTemplate.find(query, User.class);
    System.out.println(userList);
}
//[User(id=633f91bf8af3283824edb456, name=lucy, age=18, email=888@qq.com, createDate=null)]

2.2.5 分页查询
//分页查询
@Test
public void findPageUserList(){
    int pageNo = 1;
    int pageSize = 3;
    String name = "uc";
    //条件构造
    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));
    //分页构建
    //查询记录数
    long count = mongoTemplate.count(query, User.class);
    //分页
    List<User> userList = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), User.class);
    System.out.println(count);
    System.out.println(userList);
}
/**
 * 1
 * [User(id=633f91bf8af3283824edb456, name=lucy, age=18, email=888@qq.com, createDate=null)]
 */

2.3 修改


//修改
@Test
public void updataUser(){
    //根据id查询
    User user = mongoTemplate.findById("633f91bf8af3283824edb456", User.class);
    user.setName("tom");
    user.setAge(20);
    user.setEmail("666@qq.com");
    //调用修改方法
    Query query = new Query(Criteria.where("_id").is(user.getId()));
    Update update = new Update();
    update.set("name",user.getName());
    update.set("age",user.getAge());
    update.set("email",user.getEmail());
    UpdateResult upsert = mongoTemplate.upsert(query, update, User.class);
    long modifiedCount = upsert.getModifiedCount();
    System.out.println(modifiedCount);

    //修改后的查询
    User user1 = mongoTemplate.findById("633f91bf8af3283824edb456", User.class);
    System.out.println(user1);
}
/**
 * 1
 * User(id=633f91bf8af3283824edb456, name=tom, age=20, email=666@qq.com, createDate=null)
 */

2.4 删除

根据id指定删除

//删除
@Test
public void deleteUser(){
    Query query = new Query(Criteria.where("_id").is("633f91bf8af3283824edb456"));
    DeleteResult remove = mongoTemplate.remove(query, User.class);
    long deletedCount = remove.getDeletedCount();
    System.out.println(deletedCount);
}
//1

3 基于MongoRepository实现的增 删 改 查

Spring Data提供了对mongodb,数据访问的支持,我们只需要继承MongoRepository类,按照Spring Data规范就可以了

(1). 创建interface,继承MongoRepository接口

创建一个接口继承另一个接口
UserRepository.java

package com.guo.mongodb.repository;

import com.guo.mongodb.entity.User;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends MongoRepository<User,String> {

}

(2). 注入UserRepository

//注入UserRepository 
@Autowired
private UserRepository userRepository;

3.1 添加

  // 添加操作
@Test
public void create(){
    User user = new User();
    user.setName("tom");
    user.setAge(20);
    user.setEmail("666@qq.com");
    User save = userRepository.save(user);
    System.out.println(save);
    User user1 = new User();
    user1.setName("lucy");
    user1.setAge(18);
    user1.setEmail("888@qq.com");
    User save1 = userRepository.save(user1);
    System.out.println(save1);
}
//User(id=633fb0f592443658da0c9ace, name=tom, age=20, email=666@qq.com, createDate=null)

3.2 查询

//查询所有的数据
@Test
public void findAll(){
    List<User> userList = userRepository.findAll();
    System.out.println(userList);
}
//[User(id=633fb0cfb0933b4b66cfc69a, name=lucy, age=18, email=888@qq.com, createDate=null), User(id=633fb0f592443658da0c9ace, name=tom, age=20, email=666@qq.com, createDate=null)]

3.2.1 查询所有
//查询所有的数据
@Test
public void findAll(){
    List<User> userList = userRepository.findAll();
    System.out.println(userList);
}
//[User(id=633fb0cfb0933b4b66cfc69a, name=lucy, age=18, email=888@qq.com, createDate=null), User(id=633fb0f592443658da0c9ace, name=tom, age=20, email=666@qq.com, createDate=null)]
3.2.2 根据id查询
//根据id查询
@Test
public void findById(){
    User user = userRepository.findById("633fb0cfb0933b4b66cfc69a").get();
    System.out.println(user);
}
//User(id=633fb0cfb0933b4b66cfc69a, name=lucy, age=18, email=888@qq.com, createDate=null)
3.2.3 条件查询
//条件查询
@Test
public void findUserList(){
    //name=lucy and age=18
    User user = new User();
    user.setName("lucy");
    user.setAge(18);
    Example<User> example = Example.of(user);
    List<User> userList = userRepository.findAll(example);
    System.out.println(userList);
}
//[User(id=633fb0cfb0933b4b66cfc69a, name=lucy, age=18, email=888@qq.com, createDate=null)]

3.2.4 模糊查询

模糊查询这里需要注意,如果实体中包含多个实体,那么我们在对某个字段做模糊查询的时候,要设置其他字段不处理设置,例如下列设置:

//不对age字段处理
.withIgnorePaths("age")
//模糊查询
@Test
public void findLikeUserList(){
    /**
     * ExampleMatcher.StringMatcher提供了如下枚举
     * CONTAINING 匹配包含的字符串
     * DEFAULT 默认匹配模式
     * ENDING 匹配结尾的字符串
     * EXACT 匹配精确的字符串
     * REGEX 将字符串视为正则表达式进行匹配
     * STARTING 匹配开始的字符串
     */
    ExampleMatcher matcher = ExampleMatcher.matching()
            //包含模式查询
            .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)
            //不对age字段处理
            .withIgnorePaths("age")
            //这个通过ExampleMatcher.GenericPropertyMatcher.of()方法传入ExampleMatcher.StringMatcher.STARTING来模糊匹配开头的字符串
            //.withMatcher("name",ExampleMatcher.GenericPropertyMatcher::startsWith)
            //忽略大小写
            .withIgnoreCase(true);
    User user = new User();
    user.setName("U");  //name中包含u
    Example<User> userExample = Example.of(user, matcher);
    List<User> userList = userRepository.findAll(userExample);
    System.out.println(userList);
}
//[User(id=633fda8d7669085de1223571, name=lucy, age=18, email=888@qq.com, createDate=null)]
3.2.5 分页查询
//分页查询
@Test
public void findPageUserList(){
    //设置分页参数  0代表第一页
    Pageable of = PageRequest.of(0, 3);
    User user = new User();
    user.setAge(20);
    user.setName("tom");
    Example<User> userExample = Example.of(user);
    Page<User> page = userRepository.findAll(userExample, of);
    System.out.println("总数条数:" + page.getTotalElements());
    System.out.println("总页数:"+page.getTotalPages());
    System.out.println("数据集合:"+page.getContent());
}
/**
 * 总数条数:2
 * 总页数:1
 * 数据集合:[User(id=633fd91ecc7c4b46845a3f23, name=tom, age=20, email=666@qq.com, createDate=null), User(id=633fda8d7669085de1223570, name=tom, age=20, email=666@qq.com, createDate=null)]
 */

3.3 修改

//修改
@Test
public void updataUser(){
    //根据id查询
    User user = userRepository.findById("633fd91ecc7c4b46845a3f23").get();
    System.out.println("修改之前的数据:" + user);
    user.setName("mary");
    user.setAge(21);
    user.setEmail("7979@qq.com");
    //save()方法:有id就走修改操作,没有id就走添加操作
    User save = userRepository.save(user);
    System.out.println("修改后的数据为:" + save);
}
/**
 * 修改之前的数据:User(id=633fd91ecc7c4b46845a3f23, name=tom, age=20, email=666@qq.com, createDate=null)
 * 修改后的数据为:User(id=633fd91ecc7c4b46845a3f23, name=mary, age=21, email=7979@qq.com, createDate=null)
 */

3.4 删除

这个删除方法没有返回值,这里通过在MongoDB的客户端通过命令进行查询是否删除成功

//删除
@Test
public void deleteUser(){
    userRepository.deleteById("633fd91ecc7c4b46845a3f23");
}

/**
 * 通过命令查询,程序执行前
 * > db.User.find()  
 * { "_id" : ObjectId("633fd91ecc7c4b46845a3f23"), "name" : "mary", "age" : 21, "email" : "7979@qq.com", "_class" : "com.guo.mongodb.entity.User" }
 * { "_id" : ObjectId("633fda8d7669085de1223570"), "name" : "tom", "age" : 20, "email" : "666@qq.com", "_class" : "com.guo.mongodb.entity.User" }
 * { "_id" : ObjectId("633fda8d7669085de1223571"), "name" : "lucy", "age" : 18, "email" : "888@qq.com", "_class" : "com.guo.mongodb.entity.User" }
 * 程序执行后
 * > db.User.find()
 * { "_id" : ObjectId("633fda8d7669085de1223570"), "name" : "tom", "age" : 20, "email" : "666@qq.com", "_class" : "com.guo.mongodb.entity.User" }
 * { "_id" : ObjectId("633fda8d7669085de1223571"), "name" : "lucy", "age" : 18, "email" : "888@qq.com", "_class" : "com.guo.mongodb.entity.User" }
 * > 
 */

4. Spring Data规范

Spring Data提供了对mongodb,数据访问的支持,我们只需要继承MongoRepository类,按照Spring Data规范就可以了

查询方法以find|read|get开头,涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性需要首字母大写。
目前支持的关键字写法如下:
在这里插入图片描述在这里插入图片描述

(1). 创建interface,继承MongoRepository接口

创建一个接口继承另一个接口
UserRepository.java

(2). 自定义方法需要安装命名规范,只需要创建不需要我们去实现方法,MongoRepository中会根据方法的命名规范帮你实现方法具体的操作.

package com.guo.mongodb.repository;

import com.guo.mongodb.entity.User;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends MongoRepository<User,String> {
//通过hoscode查询数据,并返回类对象
    Hospital getHospitalByHoscode(String hoscode);
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

848698119

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值