MongoDB是一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库之间的产品,
其主要目标是在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS系统(具有丰富的功能)之间架起一座桥梁,
它集两者的优势于一身。
MongoDB支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型,
也因为他的存储格式也使得它所存储的数据在Nodejs程序应用中使用非常流畅。
既然称为NoSQL数据库,Mongo的查询语言非常强大,其语法有点类似于面向对象的查询语言,
几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
但是,MongoDB也不是万能的,同MySQL等关系型数据库相比,它们在针对不同的数据类型和事务要求上都存在自己独特的优势。
在数据存储的选择中,坚持多样化原则,选择更好更经济的方式,而不是自上而下的统一化。
-
较常见的,我们可以直接用MongoDB来存储键值对类型的数据,
如:验证码、Session等;由于MongoDB的横向扩展能力,
-
也可以用来存储数据规模会在未来变的非常巨大的数据,
如:日志、评论等;
-
由于MongoDB存储数据的弱类型,也可以用来存储一些多变json数据,如:与外系统交互时经常变化的JSON报文。
-
而对于一些对数据有复杂的高事务性要求的操作,如:账户交易等就不适合使用MongoDB来存储。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
-
MongoDB的配置【application.properties】
# MONGODB (MongoProperties)
# Mongo database URI. When set, host and port are ignored.
#spring.data.mongodb.uri=mongodb://root:[email protected]:27017/mongotest
# Mongo server host.
spring.data.mongodb.host=localhost
# Mongo server port.
spring.data.mongodb.port=27017
# Login user of the mongo server.
spring.data.mongodb.username=root
# Login password of the mongo server.
spring.data.mongodb.password=root
# Authentication database name.
spring.data.mongodb.authentication-database=mongotest
# Database name
spring.data.mongodb.database=mongotest
# Fully qualified name of the FieldNamingStrategy to use.
#spring.data.mongodb.field-naming-strategy=
# GridFS database name.
#spring.data.mongodb.grid-fs-database=
# Enable Mongo repositories.
spring.data.mongodb.repositories.enabled=true
# Mongo database URI. When set, host and port are ignored.
#spring.data.mongodb.uri=mongodb://localhost/test
package com.newcapec.dao.domain;
import org.springframework.data.annotation.Id;
/**
* @version V1.0
* @Title: Mongo实体
* @ClassName: com.newcapec.dao.domain
* @Description:
* @author: FLY
* @date:2017/10/17 8:06
*/
public class UserMongoDo {
//id属性是给mongodb用的,用@Id注解修饰
@Id
private String id;
private String name;
private int age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
UserMongoDo that = (UserMongoDo) o;
if (age != that.age) {
return false;
}
if (id != null ? !id.equals(that.id) : that.id != null) {
return false;
}
return name != null ? name.equals(that.name) : that.name == null;
}
@Override
public int hashCode() {
int result = id != null ? id.hashCode() : 0;
result = 31 * result + (name != null ? name.hashCode() : 0);
result = 31 * result + age;
return result;
}
@Override
public String toString() {
return "UserMongoDo{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
-
MongoDB的DAO层【需要继承MongoRepository接口】
-
package com.newcapec.dao.repository.mongo;
import com.newcapec.dao.domain.UserMongoDo;
import org.springframework.data.mongodb.repository.MongoRepository;
/**
* @version V1.0
* @Title: Mongo--DAO层的接口
* @ClassName: com.newcapec.dao.repository.mongo
* @Description: 继承自MongoRepository接口,MongoRepository接口包含了常用的CRUD操作,
* 例如:save、insert、findall等等。我们可以定义自己的查找接口,
* @author: FLY
* @date:2017/10/17 8:09
*/
public interface UserMongoRepository extends MongoRepository<UserMongoDo,String> {
UserMongoDo findByName(String name);
}
package com.newcapec.controller.mongo;
import com.newcapec.dao.domain.UserMongoDo;
import com.newcapec.dao.repository.mongo.UserMongoRepository;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @version V1.0
* @Title:
* @ClassName: com.newcapec.controller.mongo
* @Description:
* @author: FLY
* @date:2017/10/17 8:21
*/
@Api(value = "MONGO服务", description = "基本的MONGO增删改查API")
@RestController
@RequestMapping(value = "/mongo")
public class UserMongoController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private UserMongoRepository userMongoRepository;
@Autowired
private MongoTemplate mongoTemplate;
@ApiOperation(value = "新建用户", notes = "根据UserMongoDo对象创建用户")
@RequestMapping(value = "save",method = RequestMethod.POST)
public String save(){
UserMongoDo userMongoDo = new UserMongoDo();
userMongoDo.setName("张三");
userMongoDo.setAge(20);
userMongoRepository.save(userMongoDo);
logger.info("根据UserMongoDo对象创建用户:{}", userMongoDo);
userMongoDo = new UserMongoDo();
userMongoDo.setName("李四");
userMongoDo.setAge(30);
userMongoRepository.save(userMongoDo);
logger.info("根据UserMongoDo对象创建用户:{}", userMongoDo);
return "ok";
}
@ApiOperation(value = "查询所有UserMongoDo对象", notes = "查询所有UserMongoDo对象")
@RequestMapping(value = "findAll", method = RequestMethod.GET)
public List<UserMongoDo> find(){
List<UserMongoDo> userMongoDoList = userMongoRepository.findAll();
logger.info("查询所有UserMongoDo对象:{}", userMongoDoList);
return userMongoDoList;
}
@ApiOperation(value = "根据姓名查询UserMongoDo对象", notes = "根据姓名查询UserMongoDo对象")
@RequestMapping(value = "findByName", method = RequestMethod.GET)
public UserMongoDo findByName(){
return userMongoRepository.findByName("张三");
}
@RequestMapping("findAllByTemplate")
public List<UserMongoDo> findAllByTemplate(){
return mongoTemplate.findAll(UserMongoDo.class);
}
}
参考来源:http://www.jianshu.com/p/879caef9b0bc