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测试
编写完成,我们启动服务,在浏览器中首先输入:
这里我们设置了端口为8888
http://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/1
http://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
*/
@Configuration
public 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上了。
源码地址