Skip to content

Spring Boot 整合 MongoDB

安装和启动

docker 方式安装

  1. 拉取镜像
bash
docker pull mongo:7.0.0
  1. 启动容器
bash
docker run -d --restart=always -p 27017:27017 --name mongo -v /data/mongodb/db:/data/db mongo:7.0.0
  1. 连接 mongo
bash
docker exec -it mongo mongosh

命令操作 Mongodb

  1. 文档操作
bash
db.User.insert({name:'lucy',age:20,sex:true})
  1. 查询
bash
db.User.find()
db.User.find({name:'lucy1'})
  1. 修改
bash
db.User.update({age:20}, {$set:{name:100}})
  1. 删除
bash
db.User.remove({})

SpringBoot 整合 MongoDB

MongoRepository 方式

添加 Maven 依赖

xml
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
    </dependencies>

定义 Entity

java
@Data
@Document("user")
public class User {
    @Id
    private ObjectId id;
    private String name;
    private Integer age;
    private String email;
    private Date createDate;
}

定义 Repository

java
@Repository
public interface UserRepository extends MongoRepository<User, ObjectId> {
}

编写测试类

java
@SpringBootTest
public class MongoApplicationTest {

    @Autowired
    private UserRepository userRepository;

    /**
     * 添加
     */
    @Test
    public void add() {
        User user = new User();
        user.setAge(18);
        user.setName("lcd");
        user.setCreateDate(new Date());
        userRepository.save(user);
    }

    /**
     * 查询所有
     */
    @Test
    public void findAll() {
        List<User> list = userRepository.findAll();
        System.out.println(list);
    }

    /**
     * 根据id查询
     */
    @Test
    public void testFindById() {
        Optional<User> optional =
                userRepository.findById(new ObjectId("669dd08552772e355c95e593"));
        boolean present = optional.isPresent();
        if(present) {
            User user = optional.get();
            System.out.println(user);
        }
    }


    /**
     * 条件查询 + 排序
     */
    @Test
    public void testFindCondition() {
        //封装条件
        User user = new User();
        user.setAge(18);
        Example<User> example = Example.of(user);

        Sort sort = Sort.by(Sort.Direction.DESC, "name");

        List<User> list = userRepository.findAll(example, sort);
        System.out.println(list);
    }


    /**
     * 分页查询
     */
    @Test
    public void testPage() {
        //第一页从0开始的
        PageRequest pageable = PageRequest.of(0,2);

        Page<User> page = userRepository.findAll(pageable);

        List<User> list = page.getContent();
        System.out.println(list);
    }

    /**
     * 更新
     */
    @Test
    public void testUpdateUser(){
        //注意:先查询,再更新
        Optional<User> optional = userRepository.findById(
                new ObjectId("669dd08552772e355c95e593")
        );
        if(optional.isPresent()){
            User user = optional.get();
            user.setAge(30);
            //user中包含id,就会执行更新
            userRepository.save(user);
            System.out.println(user);
        }
    }

    /**
     * 删除
     */
    @Test
    public void testDeleteUser(){
        userRepository.deleteById(
                new ObjectId("669dd08552772e355c95e593")
        );
    }
}

application.yml 配置连接信息

yml
spring:
  data:
    mongodb:
      database: test # 数据库名称
      host: 10.13.3.21
      port: 27017

MongoTemplate 方式

java
@SpringBootTest
public class MongoTemplateTest {

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 添加
     */
    @Test
    public void add() {
        User user = new User();
        user.setName("test");
        user.setAge(20);
        user.setCreateDate(new Date());
        mongoTemplate.insert(user);
    }

    /**
     * 查询所有
     */
    @Test
    public void findAll() {
        List<User> list = mongoTemplate.findAll(User.class);
        list.forEach(user->{
            System.out.println(user);
        });
    }

    /**
     * 根据Id查询
     */
    @Test
    public void testFindId() {
        User user = mongoTemplate.findById("669dd33ba0debe5f5000aa02", User.class);
        System.out.println(user);
    }

    /**
     * 条件查询
     */
    @Test
    public void testCondition() {
        // where name=? and age=?
        Criteria criteria =
                Criteria.where("name").is("test").and("age").is(20);
        Query query = new Query(criteria);

        List<User> list = mongoTemplate.find(query,User.class);
        System.out.println(list);
    }

    /**
     * 分页查询
     */
    @Test
    public void testPage() {
        // limit 0,2
        Query query = new Query();
        List<User> list = mongoTemplate.find(query.skip(0).limit(2), User.class);
        list.forEach(user->{
            System.out.println(user);
        });
    }

    /**
     * 更新
     */
    @Test
    public void testUpdateUser() {
        Criteria criteria = Criteria.where("_id").is("669dd33ba0debe5f5000aa02");
        Query query = new Query(criteria);
        Update update = new Update();
        update.set("name", "zhangsan");
        update.set("age", 99);
        UpdateResult result = mongoTemplate.upsert(query, update, User.class);//改一条
        //UpdateResult result = mongoTemplate.updateMulti(query, update, User.class);//改多条
        long count = result.getModifiedCount();
        System.out.println(count);
    }

    /**
     * 删除
     */
    @Test
    public void testRemove() {
        Criteria criteria = Criteria.where("_id").is("669dd33ba0debe5f5000aa02");
        Query query = new Query(criteria);
        DeleteResult result = mongoTemplate.remove(query, User.class);
        long count = result.getDeletedCount();
        System.out.println(count);
    }
}

Released under the MIT License.