• Java关于MongoTemplate的增删改查实战代码解析(全)


    前言

    关于mongo的相关知识可看我这篇文章:

    1. 依赖

    通过如下找到你想要的依赖包,在这搜索对应的版本号:mvn仓库

    导入相对应的依赖包:

    
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-data-mongodbartifactId>
        <version>2.7.2version>
    dependency>
    
    
    <dependency>
        <groupId>org.mongodbgroupId>
        <artifactId>mongodb-driver-syncartifactId>
        <version>4.7.1version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2. 配置

    可以通过配置文件或者是代码进行重构

    2.1 配置文件

    该配置文件主要用来连接mongo,需要服务器ip地址、用户名、密码等(类似mysql的连接)

    可以通过配置文件,定义其配置参数
    具体参数有如下(将其对应参数写在application.properties即可):
    在这里插入图片描述

    参数描述
    spring.data.mongodb.urimongodb://localhost:27017/testMongoDB
    spring.data.mongodb.hostmongo连接地址
    spring.data.mongodb.port端口号
    spring.data.mongodb.authentication-database验证的数据库
    spring.data.mongodb.username数据库用户名
    spring.data.mongodb.password数据库密码
    spring.data.mongodb.database连接的数据库名

    2.2 配置代码

    和上面的配置差不多,只不过此处用代码加工了下而已

    配置文件定义如下(将其具体隐私使用了xxxx或者yyyy进行表示):mongo.audio.uri=mongodb://xxxxx:yyyyy@127.0.0.1:端口/xxxxx?connectTimeoutMS=10000&socketTimeoutMS=10000

    配置类代码引入:

    @Configuration
    public class MultiMongoTemplate {
        @Primary
        @Bean
        public MongoTemplate audioMongoTemplate(@Value("${mongo.audio.uri}") String uri) {
            MongoTemplate mongoTemplate = new MongoTemplate(new SimpleMongoClientDatabaseFactory(uri));
            setDefaultTypeMapper(mongoTemplate);
            return mongoTemplate;
        }
    
    	// 省略多个数据库的连接地址  
    
        private void setDefaultTypeMapper(MongoTemplate mongoTemplate) {
         if (null == mongoTemplate) {
             return;
         }
    
         MappingMongoConverter converter = (MappingMongoConverter) mongoTemplate.getConverter();
         converter.setTypeMapper(new DefaultMongoTypeMapper(null));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    3. 实体类

    此实体类用在数据库以及代码中
    具体定义如下:

    • @Data的注解可看这篇文章:spring中@Data注解详细解析
    • @AllArgsConstructor : 注解在类上,有参构造
    • @NoArgsConstructor : 注解在类上,无参构造

    其Field注解对应数据库的显示,遵从驼峰规则

    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.ToString;
    import org.springframework.data.annotation.Id;
    import org.springframework.data.mongodb.core.mapping.Document;
    import org.springframework.data.mongodb.core.mapping.Field;
    
    // 没有创建的时候会给数据库自动创建一个collection
    @Document(collection = Collections.SDK_FILE_CONFIG)
    @Data
    @ToString
    @NoArgsConstructor
    public class SdkInfo {
        @Id
        private String id;
    
        @Field("file_name")
        private String fileName;
    
        @Field("file_size")
        private String fileSize;
    
        @Field("create_time")
        private String createTime;
    
        @Field("page")
        private String page;
    
        @Field("size")
        private String size;
    
        @Field("Operator_name")
        private String OperatorName;
    
        @Field("upload_url")
        private String uploadUrl;
    
        @Field("download_url")
        private String downloadUrl;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    查看其数据库显示:
    在这里插入图片描述

    4. 实战

    之后通过代码模块进行连接测试:

    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = MainApplication.class)
    @Slf4j
    public class MongoConnectTest {
    
        private static final Logger logger = LoggerFactory.getLogger(MongoConnectTest.class);
    
        @Autowired
        @Qualifier("audioMongoTemplate")
        private MongoTemplate mongoTemplate;
    
    	// 以下为测试文件的章节
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    关于MongoTemplate的实体类中还有多个函数,以下函数已经够用了

    4.1 查询

    查询显示所有的值
    关于find的具体函数定义如下:
    在这里插入图片描述

    @Test
    public void test1(){
        Query query=new Query();
        List<SdkInfo> configs = mongoTemplate.find(query, SdkInfo.class);
        // 输出整张表对应的某个字段 通过get获取
        configs.forEach(config -> log.info(config.getId()));
        
        // 输出整张表对应的全部值 通过totoString
        configs.forEach(config -> log.info(config.toString()));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    关于findAll的具体函数定义如下:
    在这里插入图片描述
    等同于:

    // 查询mongo全部集合
    @Test
    public void test1(){
        Query query=new Query();
        List<SdkInfo> configs = mongoTemplate.findAll(SdkInfo.class);
        // 输出整张表对应的某个字段值 通过get获取
        configs.forEach(config -> log.info(config.getId()));
    
        // 输出整张表对应的全部值 通过totoString
        configs.forEach(config -> log.info(config.toString()));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    还有一种查询的格式类似这种:

    Query query=new Query();
    query.with(Sort.by(new Sort.Order(Sort.Direction.ASC, "fileSize")));
    
    try (MongoCursor<Document> cursor =
            //指定查询集合
            mongoTemplate.getCollection("sdk_file_config")
                    //组装查询条件
                    .find(query.getQueryObject())
                    //组装排序方式(非必须,可不设置)
                    .sort(query.getSortObject())
                    //设置游标查询不超时
                    .noCursorTimeout(true)
                    //设置批量从数据库中获取的数据量
                    .batchSize(1000)
                    .cursor()) {
        Document doc;
        while (cursor.hasNext()) {
            doc = cursor.next();
            System.out.println(doc.get("download_url"));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    类似这种是获取整一列的值
    如果获取这一列的某个值而已,具体如下:

    @Test
    public void test1(){
        Query query=new Query(Criteria.where("name").is("码农研究僧"));
        List<SdkInfo> configs = mongoTemplate.find(query, SdkInfo.class);
        // 输出整张表对应的全部值 通过totoString
        configs.forEach(config -> log.info(config.toString()));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    如果获取满足条件的一行数据

    @Test
    public void test4(){
        Query query=new Query();
        SdkInfo configs = mongoTemplate.findOne(query, SdkInfo.class);
    
        String id = configs.getId();
        log.info(id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    将其写好的数据,结合java web,放到前端form表单中

    @Override
    public List<Object> showList(String OperatorName) {
        Query query = new Query(Criteria.where("Operator_name").is(OperatorName));
        List<SdkInfo> configs = mongoTemplate.find(query, SdkInfo.class);
        configs.forEach(config -> config.toString());
                List<Object> list = new ArrayList<Object>();
        configs.forEach(config -> {
            Map<String, String> map = new HashMap<>();
            map.put("_id",config.getId());
            map.put("fileName",config.getFileName());
            map.put("fileSize", config.getFileSize());
            map.put("createTime", config.getCreateTime());
            map.put("OperatorName",config.getOperatorName());
            map.put("downloadUrl",config.getDownloadUrl());
            list.add(map);
        });
        return list;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    4.2 插入

    数据库的插入一版都是通过insert
    将其写好的数据一一insert进入

    结合java web开发,传入对应的数据,相对应的插入某些字段值

    @Override
    public void uploadmongo(String fileName, Long fileSize, String getUploadUrl, String getDownloadUrl){
        SdkInfo sdkInfo = new SdkInfo();
        sdkInfo.setCreateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    
        sdkInfo.setFileName(fileName);
        sdkInfo.setOperatorName("码农研究僧");
        sdkInfo.setUploadUrl(getUploadUrl);
        sdkInfo.setDownloadUrl(getDownloadUrl);
        SdkInfo insert = mongoTemplate.insert(sdkInfo);
    
        if(String.valueOf(insert) != null){
            logger.info(String.valueOf(insert));
        }else{
            logger.info("Failed to insert data");
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    4.3 删除

    关于删除,类似mongo的drop删除整个表或者remove删除某一列的数据
    结合javaweb 的form表单,根据获取某个字段值,对应删除正一行数据

    @Override
    public void deletemongo(String id) {
        Query query = new Query(Criteria.where("_id").is(id));
        mongoTemplate.remove(query, SdkInfo.class);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    科普文:一文搞懂jvm实战(四)深入理解逃逸分析Escape Analysis
    shell-运算符
    手把手Java爬虫教学 - 8. 项目2 - 数据库表设计 & 爬虫代码实现
    小程序实现一个全局的loadding效果
    西南民族大学计算机考研资料汇总
    探索ChatGPT在学术写作中的应用与心得
    29.CF1149C [Tree Generator™](httpswww.luogu.com.cnproblemCF1149C) 区间合并线段树
    HBase学习笔记(3)—— HBase整合Phoenix
    R语言基于指定规则、条件删除列表中的元素:使用purrr包的discard函数移除列表数据中的NA值
    云原生架构体系
  • 原文地址:https://blog.csdn.net/weixin_47872288/article/details/126119885