mongodb学习笔记二

来源:互联网 发布:java怎么写游戏 编辑:程序博客网 时间:2024/05/18 03:38

1、Springboot与MongoDB集成

我们走在Springboot的helloworld基础上,加上MongoDB的引用。首先我们要知道MongoDB的数据库连接地址书写格式为:
mongodb://[username:password@]host1[:port1][,host2[:port2],…[,hostN[:portN]]][/[database][?options]]
可以看到,这里是支持多机器集群使用的,我们这里使用的是本地环境为:
mongodb://localhost:27017/test

2、集成步骤

2.1 在pom文件中加入MongoDB的Springboot依赖:

<!--引入MongoDB依赖-->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-data-mongodb</artifactId>        </dependency>

2.2 修改application.yml配置文件如下:

spring:  application:  #应用名称    name: helloworld  data:    mongodb:      uri: mongodb://localhost:27017/test

2.3 创建测试文件 MongoDBController

package com.nmm.study.controller;import com.mongodb.BasicDBObject;import com.mongodb.DBObject;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.mongodb.core.MongoTemplate;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;/** * @description 测试 * @date 2017/11/26 * @author Niemingming */@Controller@RequestMapping("/mongo")public class MongoDBController {    /**     * @description MongoDB的数据库操作工具类     * @date 2017/11/26     * @author Niemingming     */    @Autowired    private MongoTemplate mongoTemplate;    /**     * @description 插入操作     * 我们创建一个mongotest集合并插入name和age两个field     * @date 2017/11/26     * @author Niemingming     */    @ResponseBody    @RequestMapping("/insert/{name}/{age}/{id}")    public String insert(@PathVariable String name,@PathVariable int age,@PathVariable String id){        //构建数据对象        DBObject data = new BasicDBObject("name",name);        data.put("age",age);        data.put("_id",id);        //改行代码,如果没有集合mongotest,会自动创建一个,然后插入数据,为了方便修改,我们将id设置为前台录入。        mongoTemplate.insert(data,"mongotest");        return "success";    }    /**     * @description 修改,根据id修改内容     * @date 2017/11/26     * @author Niemingming     */    @ResponseBody    @RequestMapping("/update/{id}/{name}/{age}")    public String update(@PathVariable String id,@PathVariable String name ,@PathVariable int age){        //构建查询条件        DBObject query = new BasicDBObject("_id",id);        //构建修改对象        DBObject data = new BasicDBObject("name",name);        data.put("age",age);        //这里获取集合执行更新操作,要特别说明的是第三个参数,表示是是否执行upsert操作,如果为true,表示会在更新时        //检查是否由记录,如果没有执行插入操作,否则执行更新操作。如果为false,则只做更新操作。        mongoTemplate.getCollection("mongotest").update(query,data,true,false);        return "success";    }    /**     * @description 执行删除操作。     * @date 2017/11/26     * @author Niemingming     */    @ResponseBody    @RequestMapping("/remove/{id}")    public String remove(@PathVariable String id ){        DBObject query = new BasicDBObject("_id",id);        mongoTemplate.getCollection("mongotest").remove(query);        return "success";    }    /**     * @description 查询所有记录     * @date 2017/11/26     * @author Niemingming     */    @ResponseBody    @RequestMapping("/findAll")    public String findAll(){        //返回所有的查询记录        return mongoTemplate.getCollection("mongotest").find().toArray().toString();    }}

2.4测试

编写完成,我们启动服务,在浏览器中首先输入:

这里我们设置了端口为8888http://localhost:8888/mongo/insert/lisi/22/1可以看到返回success

我们执行查询操作查看:

http://localhost:8888/mongo/findAll返回[{ "_id" : "1" , "_class" : "com.mongodb.BasicDBObject" , "name" : "lisi" , "age" : 22}]

可以看到,数据已经插入进去了。这里会看到多了个_class字段,这个字段是mongodb的java版加进去的,如果不想要,我们下面会介绍如何去掉该字段。
执行修改操作:

http://localhost:8888/mongo/update/1/wangwu/32返回:success查询http://localhost:8888/mongo/findAll返回:[{ "_id" : "1" , "name" : "wangwu" , "age" : 32}]

删除操作:

http://localhost:8888/mongo/remove/1查询:http://localhost:8888/mongo/findAll返回[]

2.5MongoDBjava客户端增加_class字段去除方法:

方法一:不使用mongoTemplate做直接插入,通过获取集合后执行插入方法,修改插入方法如下:

 @ResponseBody    @RequestMapping("/insert/{name}/{age}/{id}")    public String insert(@PathVariable String name,@PathVariable int age,@PathVariable String id){        //构建数据对象        DBObject data = new BasicDBObject("name",name);        data.put("age",age);        data.put("_id",id);        //改行代码,如果没有集合mongotest,会自动创建一个,然后插入数据,为了方便修改,我们将id设置为前台录入。        mongoTemplate.getCollection("mongotest").insert(data);        return "success";    }

这时在执行上面插入查询操作

http://localhost:8888/mongo/insert/lisi/22/1http://localhost:8888/mongo/findAll[{ "_id" : "1" , "name" : "lisi" , "age" : 22}]

可以看到,没有多出的_class字段。
方法二:修改MongoDB的配置信息,自己创建MappingMongoConverter对象。创建MongoConfiguration类:

package com.haier.alertmanager.configuration;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.mongodb.MongoDbFactory;import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;import org.springframework.data.mongodb.core.convert.MappingMongoConverter;import org.springframework.data.mongodb.core.mapping.MongoMappingContext;/** * @description mongo配置类,用于去掉java自动生成的_class字段 * @date 2017/11/16 * @author Niemingming */@Configurationpublic class MongoConfiguration {    @Autowired    private MongoDbFactory mongoDbFactory;    @Autowired    private MongoMappingContext mongoMappingContext;    @Bean    public MappingMongoConverter mappingMongoConverter(){        DefaultDbRefResolver refResolver = new DefaultDbRefResolver(mongoDbFactory);        MappingMongoConverter converter = new MappingMongoConverter(refResolver,mongoMappingContext);        //将默认的mapper类型设置为null,这样就不会再库中生成额外字段。        converter.setTypeMapper(new DefaultMongoTypeMapper(null));        return converter;    }}

我们将默认的类型设置为null,之后在使用mongoTemplate.insert()时,也不会在插入_class字段了。
代码已经上传到GitHub上了。
源码地址

原创粉丝点击