SpringBoot整合MongoDB

背景

大数据领域的MongoDB在实际开发中有很多应用,基于文档的存储结构和关系型数据库有很大的区别,下面来通过SpringBoot整合MongoDB来理解一下这个数据库

注:MongoDB中数据表叫集合Collection,一条记录叫文档Document

以下为SpringBoot项目配置

SpringBoot整合MongoDB

POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>mongodb</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mongodb</name>
    <description>mongodb</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <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.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

YML

spring:
  data:
    mongodb:
      host: 192.168.0.1
      port: 27017
      username: root
      password: root
      database: test
      authenticationDatabase: test

#spring:
#  data:
#    mongodb:
#      uri: mongodb://192.168.61.4:27017/test

server:
	port: 80

MongoDB实体类

@Document(“t_his_curve_highway”) 表示这条记录Document插入MongoDB中的t_his_curve_highway的Collection中

@Indexed 表示该字段为索引

@Field(“highway_id”) 表示该字段对应到MongoDB中的Collection中字段名为highway_id

import com.baomidou.mybatisplus.annotation.TableField;
import lombok.*;
import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

import java.io.Serializable;

@Data
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@Document("t_his_curve_highway")
public class StaCharHisCurveHighwayDto implements Serializable {

    /**
     * highwayId
     */
    @Indexed
    @Field("highway_id")
    private String highwayId;

    /**
     * recDate
     */
    @Field("rec_date")
    private String recDate;

    /**
     * curveCode
     */
    @Field("curve_code")
    private String curveCode;

    /**
     * curveData
     */
    @Field("curve_data")
    private String curveData;

    /**
     * recId
     */
    @TableField("recId")
    private String recId;

    /**
     * day
     */
    @Transient
    private Integer day;

}

MongoDB接口

import com.xxx.job.dto.HighwayDto;
import java.util.List;

public interface MongoDBRepository {

    void saveHighwayData(List<HighwayDto> highwayDtoList);
    
}

MongoDB接口实现类

使用MongoTemplate实现MongoDB批量插入数据功能

import com.xxx.job.dto.HighwayDto;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.springframework.data.mongodb.core.BulkOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.data.util.Pair;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@Component
@Slf4j
public class MongoDBRepositoryImpl implements MongoDBRepository {

    //注入MongoTemplate
    @Resource
    private MongoTemplate mongoTemplate;

    /**
     * 添加数据
     *
     * @param staCharHisCurveHighwayDtoList
     */
    @Override
    public void saveStaCharHisCurveHighwayData(List<HighwayDto> highwayDtoList) {
	    
	    log.info("Highway正在写入mongodb数据库,数量 {} ", highwayDtoList.size());
	
	    List<Pair<Query, Update>> updateList = new ArrayList<>(highwayDtoList.size());
	
		//bulkOps批量操作
	    BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, HighwayDto.class);
	    
	    //处理List
	    highwayDtoList.forEach(data -> {
	    	//匹配id的数据
	        Query query = new Query(new Criteria("id").is(data.getId()));
	        Update update;
	        Document doc = new Document();
	        //把数据写入doc
	        mongoTemplate.getConverter().write(data, doc);
	        //用doc生成update对象
	        update = Update.fromDocument(new Document("$set", doc));
	        Pair<Query, Update> updatePair = Pair.of(query, update);
	        updateList.add(updatePair);
	    });
	
		//upsert = update + insert
	    operations.upsert(updateList);
		
		//执行
	    operations.execute();
	
	}
	
}

效果

MongoDB数据库表Collection

在这里插入图片描述

MongoTemplate增删改查测试用例

实体

package com.example.mongodb.entity;

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

import java.io.Serializable;

/**
 * @description: user
 * @author: zj
 * @date: 2022-07-28 10:22
 */
@Data
@Document("User")
public class User implements Serializable {

    @Id
    private String id;
    private String name;
    private Integer age;
    private String email;
    @Field("create_date")
    private String createDate;

}


测试用例

在SpringBoot中Test文件夹下编写测试用例使用Mongo Template实现数据的增删改查

package com.example.mongodb.test;

import com.example.mongodb.entity.User;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

/**
 * @description: mongo template
 * @author: zj
 * @date: 2022-07-28 10:24
 */
@SpringBootTest
class MongoTemplateTest {

    @Resource
    private MongoTemplate mongoTemplate;

    //添加
    @Test
    public void createUser() {
        User user = new User();
        user.setAge(23);
        user.setName("test2");
        user.setEmail("4922001@qq.com");
        user.setCreateDate(String.valueOf(new Date()));
        User user1 = mongoTemplate.insert(user);
        System.out.println(user1);
    }

    //查询所有
    @Test
    public void findUser() {
        List<User> userList = mongoTemplate.findAll(User.class);
        System.out.println(userList);
    }

    //根据id查询
    @Test
    public void getById() {
        User user =
                mongoTemplate.findById("60534ac7548d761b193cf2d7", User.class);
        System.out.println(user);
    }

    //条件查询
    @Test
    public void findUserList() {
        Query query = new Query(Criteria
                .where("name").is("test")
                .and("age").is(20));
        List<User> userList = mongoTemplate.find(query, User.class);
        System.out.println(userList);
    }

    //模糊查询
    @Test
    public void findUsersLikeName() {
        String name = "est";
        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);
    }

    //分页查询
    @Test
    public void findUsersPage() {
        String name = "est";
        int pageNo = 1;
        int pageSize = 10;

        Query query = new Query();
        String regex = String.format("%s%s%s", "^.*", name, ".*$");
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        query.addCriteria(Criteria.where("name").regex(pattern));
        int totalCount = (int) mongoTemplate.count(query, User.class);
        List<User> userList = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), User.class);

        Map<String, Object> pageMap = new HashMap<>();
        pageMap.put("list", userList);
        pageMap.put("totalCount",totalCount);
        System.out.println(pageMap);
    }

    //修改
    @Test
    public void updateUser() {
        User user = mongoTemplate.findById("5ffbfa2ac290f356edf9b5aa", User.class);
        user.setName("test_1");
        user.setAge(25);
        user.setEmail("493220990@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 result = mongoTemplate.upsert(query, update, User.class);
        long count = result.getModifiedCount();
        System.out.println(count);
    }

    //删除操作
    @Test
    public void delete() {
        Query query =
                new Query(Criteria.where("_id").is("5ffbfa2ac290f356edf9b5aa"));
        DeleteResult result = mongoTemplate.remove(query, User.class);
        long count = result.getDeletedCount();
        System.out.println(count);
    }
}


效果

在这里插入图片描述

MongoRepository增删改查测试用例

使用MongoRepository实现MongoDB的增删改查

MongoRepository

实现MongoRepository接口

package com.example.mongodb.repository;

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

/**
 * @description: mongo repository
 * @author: zj
 * @date: 2022-07-28 11:06
 */
@Repository
public interface UserRepository extends MongoRepository<User, String> {

}


测试用例

通过MongoRepository实现MongoDB的Collection的增删改查

package com.example.mongodb.test;

import com.example.mongodb.entity.User;
import com.example.mongodb.repository.UserRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.*;

import java.util.List;

/**
 * @description: mongo repository
 * @author: zj
 * @date: 2022-07-28 11:08
 */
@SpringBootTest
class MongoRepositoryTest {

    @Autowired
    private UserRepository userRepository;

    //添加
    @Test
    public void createUser() {
        User user = new User();
        user.setAge(12);
        user.setName("李四");
        user.setEmail("323332200@qq.com");
        User userRes = userRepository.save(user);
        System.out.println(userRes);
    }

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

    //id查询
    @Test
    public void getById() {
        User user = userRepository.findById("5ffbfe8197f24a07007bd6ce").get();
        System.out.println(user);
    }

    //条件查询
    @Test
    public void findUserList() {
        User user = new User();
        user.setName("张三");
        user.setAge(20);
        Example<User> userExample = Example.of(user);
        List<User> userList = userRepository.findAll(userExample);
        System.out.println(userList);
    }

    //模糊查询
    @Test
    public void findUsersLikeName() {
        //创建匹配器,即如何使用查询条件
        ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
                .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
                .withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写
        User user = new User();
        user.setName("三");
        Example<User> userExample = Example.of(user, matcher);
        List<User> userList = userRepository.findAll(userExample);
        System.out.println(userList);
    }

    //分页查询
    @Test
    public void findUsersPage() {
        Sort sort = Sort.by(Sort.Direction.DESC, "age");
        //0为第一页
        Pageable pageable = PageRequest.of(0, 10, sort);
        //创建匹配器,即如何使用查询条件
        ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
                .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
                .withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写
        User user = new User();
        user.setName("三");
        Example<User> userExample = Example.of(user, matcher);
        //创建实例
        Example<User> example = Example.of(user, matcher);
        Page<User> pages = userRepository.findAll(example, pageable);
        System.out.println(pages);
    }

    //修改
    @Test
    public void updateUser() {
        User user = userRepository.findById("5ffbfe8197f24a07007bd6ce").get();
        user.setName("张三_1");
        user.setAge(25);
        user.setEmail("883220990@qq.com");
        User save = userRepository.save(user);
        System.out.println(save);
    }

    //删除
    @Test
    public void delete() {
        userRepository.deleteById("5ffbfe8197f24a07007bd6ce");
    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BirdMan98

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

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

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

打赏作者

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

抵扣说明:

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

余额充值