MongoDB学习笔记【part4】SpringBoot集成MongoDB、MongoTemplate开发CURD

一、Spring Boot 集成 Mongodb

spring-data-mongodb 提供了 MongoTemplateMongoRepository 两种方式访问mongodb,MongoRepository 操作简单,但 MongoTemplate 更加灵活,我们在项目中可以灵活使用这两种方式操作mongodb。

第一步,引入依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.10.1</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>
第二步,配置 application.properties
spring.data.mongodb.uri=mongodb://192.168.3.100:27017/testdb
第三步,添加实体

添加 @Document 注解,可以把一个实体类映射成一个文档。

添加 @Id 注解,将该属性映射为 mongodb 的 _id 字段。

@Data
@Document("User")
public class User {

    @Id
    private String id;
    private String name;
    private Integer number;
    private String position;
    
}
第四步,启动容器和MongoDB客户端
  1. 若没有安装 mongodb 的镜像,则需要安装镜像,然后执行 docker run <容器名称> 创建一个 mongo 容器,带端口号和其他具体配置的创建请参考 MongoDB学习笔记【part1】概念与安装
  2. 若之前已经创建,则跳过上一步,直接执行 docker start <容器名称> 来启动之前停止运行的容器。
  3. 启动后执行 docker exec -it <数据库名称> /bin/bash 以守护模式进入容器终端。
  4. 接着执行 mongosh 进入 mongoDB 客户端。
第五步,添加测试类
@SpringBootTest
class MongodemoApplicationTests {

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 1.添加
     */
    @Test
    public void createUser(){
        User user = new User();
        user.setName("parker");
        user.setNumber(7);
        user.setPosition("striker");
        User insert_user = mongoTemplate.insert(user);

        System.out.println(insert_user);
    }
    
}
第六步,测试成功

template会返回带 _id 的新实体:

User(id=63cba6483a54a937e410d3bd, name=parker, number=7, position=striker)
到 linux 上查看,插入成功。

在这里插入图片描述


二、MongoTemplate 的常用方法

方法说明
mongoTemplate.findAll(User.class);查询User文档的全部数据
mongoTemplate.findById(, User.class);查询User文档id为的数据
mongoTemplate.find(query, User.class);根据query内的查询条件查询
mongoTemplate.upsert(query, update, User.class);修改
mongoTemplate.remove(query, User.class);删除
mongoTemplate.insert(User);新增
Qurey 对象

基本使用方法:创建一个query对象(用来封装所有条件对象),再创建一个criteria对象(用来构建条件)。

方法说明
criteria.and(“key”).is(“条件”);精准条件
criteria.and(“key”).regex(“条件”);模糊条件
query.addCriteria(criteria);封装条件
Criteria gt = Criteria.where(“key”).gt(“条件”);大于(需创建新的criteria)
Criteria lt = Criteria.where(“key”).lt(“条件”);小于(需创建新的criteria)
query.addCriteria(new Criteria().andOperator(gt,lt));封装大于、小于条件
query.with(new Sort(Sort.Direction.ASC, “age”). and(new Sort(Sort.Direction.DESC, “date”)))排序

注:一个query中只能有一个 andOperator() ,若要传多个参数可以传入Criteria数组。


三、使用 MongoTemplate 进行CURD

1.插入一条数据
    /**
     * 1.添加
     */
    @Test
    public void createUser(){
        User user = new User();
        user.setName("parker");
        user.setNumber(7);
        user.setPosition("striker");
        User insert_user = mongoTemplate.insert(user);

        System.out.println(insert_user);
    }
    

template会返回带 _id 的新实体。

2.查询所有数据
    /**
     * 2.查询所有
     */
    @Test
    public void findAll(){
        List<User> list = mongoTemplate.findAll(User.class);
        System.out.println(list);
    }
3.通过 id 查询
    /**
     * 3.通过id查询
     */
    @Test
    public void findById(){
        User user = mongoTemplate.findById("63cba6483a54a937e410d3bd", User.class);
        System.out.println(user);
    }

成功打印数据库中数据 User(id=63cba6483a54a937e410d3bd, name=parker, number=7, position=striker) 。

4.条件查询
    /**
     * 4.条件查询
     */
    @Test
    public void findUserList(){
        // select * from User where name="parker" and number=7
        Query query = new Query(Criteria.where("name").is("parker").and("number").is(7));
        List<User> users = mongoTemplate.find(query, User.class);
        System.out.println(users);
    }
5.模糊查询
    /**
     * 5.模糊查询
     */
    @Test
    public void findUserList2(){
        // select * from User where name like "park"
        //模糊查询的条件
        String name = "par";
        //构建正则表达式
        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> users = mongoTemplate.find(query, User.class);
        System.out.println(users);
    }
6.分页查询
/**
 * 6.分页查询
 */
@Test
public void findUserPage() {

    //模拟分页参数构造
    int pageNo = 1;
    int pageSize = 5;
    //模拟条件构造
    String name = "";
    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> users = mongoTemplate.find(query.skip((pageNo-1)*pageSize).limit(pageSize),User.class);
    System.out.println(users);
}
7.修改
/**
 * 7.修改
 */
@Test
public void updateUser(){
    //根据id查询
    User user = mongoTemplate.findById("63cba6483a54a937e410d3bd", User.class);
    //模拟修改值
    user.setNumber(15);
    user.setPosition("midfield");
    //调用方法实现修改
    Query query = new Query(Criteria.where("_id").is(user.getId()));
    Update update = new Update();
    update.set("number",user.getNumber());
    update.set("position",user.getPosition());
    UpdateResult upsert = mongoTemplate.upsert(query, update, User.class);
    //返回的upsert对象可以通过getModifiedCount来查看影响的行数
    long count = upsert.getModifiedCount();
    System.out.println(count);
}

调用的 MongoTemplate 方法为 upsert ,不是 update ,无混淆!upsert 方法返回一个对象,可以通过该对象查看成功修改了多少行。

8.删除
/**
 * 8.删除
 */
@Test
public void deleteUser(){
    Query query = new Query(Criteria.where("_id").is("63cba6483a54a937e410d3bd"));
    DeleteResult deleteResult = mongoTemplate.remove(query, User.class);
    //返回的upsert对象可以通过getDeletedCount来查看影响行数
    long count = deleteResult.getDeletedCount();
    System.out.println(count);
}

remove 方法返回一个对象,可以通过该对象查看成功删除了多少行。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Parker7

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

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

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

打赏作者

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

抵扣说明:

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

余额充值