MongoDB是一个强大、灵活,且易于扩展的通用型数据库。MongoDB是C++编写的文档型数据库,有着丰富的关系型数据库的功能,并在4.0以后添加了事务支持。html
随着存储数据量不断的增长,开发者面临一个困难:如何扩展数据库?而扩展数据库分为横向扩展和纵向扩展,纵向扩展就是使用计算能力更强大的机器,它的缺点就是:机器性能的提高有物理极限的制约,并且大型机一般都是很是昂贵的,而MongoDB的设计采用的是横向扩展的模式,面向文档的数据模型使它很容易的在多台服务器上进行数据分割。MongoDB能自动处理夸集群的数据和负载,自动从新分配文档,这样开发者就能集中精力编写应用程序,而不须要考虑若是扩展的问题。java
MongoDB的安装简单来讲分为两种:git
推荐使用第二种,直接使用MongoDB镜像安装到Docker上,这样带来的好处是:github
因此本文将重点介绍MongoDB在Docker上的安装和使用。web
若是想要直接在物理机安装Docker,能够查看我以前的一篇文章《MongoDB基础介绍安装与使用》:www.cnblogs.com/vipstone/p/…spring
在Docker上安装软件通常须要两步:mongodb
下载镜像,须要到镜像市场:hub.docker.com/,如要要搜索的软件“m…docker
docker pull mongo:latest数据库
使用命令:安全
docker run --name mongodb1 -p 27018:27017 -d mongo:latest
使用“docker images”查看镜像名称和标签,以下图:
容器装载成功以后,就可使用Robo 3T客户端进行链接了,是不须要输入用户名和密码的,以下图:
表示已经链接成功了。
Robo 3T为免费的链接MongoDB的数据库工具,能够去官网下载:robomongo.org/download
若是是生成环境,没有用户名和密码的MongoDB是很是不安全的,所以咱们须要开启身份认证。
咱们仍是用以前下载的镜像,从新装载一个容器实例,命令以下:
docker run --name mongodb2 -p 27019:27017 -d mongo:latest --auth
其中“--auth”就是开启身份认证。
装载完身份认证成功容器以后,咱们须要进入容器内部,给MongoDB设置用户名和密码。
docker exec -it <容器id/名称> bash
mongo admin
db.createUser({ user: 'admin', pwd: 'admin', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });
建立的用户名为“admin”密码为“admin”,指定的数据库为“admin”。
这个时候,咱们使用Robo 3T 输入相应的信息进行链接,以下图:
表示已经链接成功了。
上面咱们用“admin”帐户使用了系统数据库“admin”,一般在生成环境咱们不会直接使用系统的数据库,这个时候咱们须要本身建立本身的数据库分配相应的用户。
docker exec -it <容器id/名称> bash
use testdb
若是没有testdb就会自动建立数据库。
db.createUser({ user: 'admin', pwd: 'admin', roles: [ { role: "readWrite", db: "testdb" } ] });
其中 role: "readWrite" 表式给用户赋值操做和读取的权限,固然增长索引、删除表什么的也是彻底没有问题的。
到目前为止咱们就可使用admin/admin操做testdb数据库了。
删除容器:docker container rm <容器id/名称>
中止容器:docker stop <容器id/名称>
启动容器:docker start <容器id/名称>
查看运行是容器:docker ps
查询全部的容器:docker ps -a
Spring Boot项目集成MyBatis前两篇文章已经作了详细的介绍,这里就不作过多的介绍,本文重点来介绍MongoDB的集成。
在pom.xml添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
复制代码
在application.properties添加以下配置:
spring.data.mongodb.uri=mongodb://username:pwd@172.16.10.79:27019/testdb
复制代码
import java.io.Serializable;
public class User implements Serializable {
private Long id;
private String name;
private int age;
private String pwd;
//...略set、get
}
复制代码
import com.hello.springboot.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
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.stereotype.Component;
import java.util.List;
@Component
public class UserDao {
@Autowired
private MongoTemplate mongoTemplate;
/** * 添加用户 * @param user User Object */
public void insert(User user) {
mongoTemplate.save(user);
}
/** * 查询全部用户 * @return */
public List<User> findAll() {
return mongoTemplate.findAll(User.class);
}
/** * 根据id 查询 * @param id * @return */
public User findById(Long id) {
Query query = new Query(Criteria.where("id").is(id));
User user = mongoTemplate.findOne(query, User.class);
return user;
}
/** * 更新 * @param user */
public void updateUser(User user) {
Query query = new Query(Criteria.where("id").is(user.getId()));
Update update = new Update().set("name", user.getName()).set("pwd", user.getPwd());
mongoTemplate.updateFirst(query, update, User.class);
}
/** * 删除对象 * @param id */
public void deleteUserById(Long id) {
Query query = new Query(Criteria.where("id").is(id));
mongoTemplate.remove(query, User.class);
}
}
复制代码
import com.hello.springboot.dao.IndexBuilderDao;
import com.hello.springboot.dao.UserDao;
import com.hello.springboot.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
@RestController
@RequestMapping("/")
public class UserController {
@Autowired
private UserDao userDao;
@RequestMapping("/")
public ModelAndView index() {
User user = new User();
user.setId(new Long(1));
user.setAge(18);
user.setName("Adam");
user.setPwd("123456");
userDao.insert(user);
ModelAndView modelAndView = new ModelAndView("/index");
modelAndView.addObject("count", userDao.findAll().size());
return modelAndView;
}
}
复制代码
<html>
<head>
<title>王磊的博客</title>
</head>
<body>
Hello ${count}
</body>
</html>
复制代码
到此为止已经完成了MongoDB的集成,启动项目,输入“http://localhost:8080/”去数据库查看插入的数据吧。
正常插入数据库以下图:
细心的用户可能会发现,虽然MongoDB已经集成完了,但插入数据库的时候user的id是手动set的值,接下来咱们来看怎么实现MongoDB中的id自增。
MongoDB 实现id自增和Spring Boot JPA相似,是在数据库建立一张表,来记录表的“自增id”,只须要保证每次都增长的id和返回的id的原子性,就能保证id实现“自增”的功能。
有了思路以后,接下来咱们来看具体的实现方案。
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "IndexBuilder")
public class IndexBuilder {
@Id
private String id;
private Long seq;
//..省略get、set方法
}
复制代码
其中collection = "IndexBuilder"是指数据库的集合名称,对应关系型数据库的表名。
import com.hello.springboot.entity.IndexBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;
import static org.springframework.data.mongodb.core.FindAndModifyOptions.options;
import static org.springframework.data.mongodb.core.query.Criteria.where;
import static org.springframework.data.mongodb.core.query.Query.query;
@Component
public class IndexBuilderDao {
@Autowired
private MongoOperations mongo;
/** * 查询下一个id * @param collectionName 集合名 * @return */
public Long getNextSequence(String collectionName) {
IndexBuilder counter = mongo.findAndModify(
query(where("_id").is(collectionName)),
new Update().inc("seq", 1),
options().returnNew(true).upsert(true),
IndexBuilder.class);
return counter.getSeq();
}
}
复制代码
User user = new User();
user.setId(indexBuilderDao.getNextSequence("user"));
//...其余设置
复制代码
核心代码:indexBuilderDao.getNextSequence("user") 使用“自增”的id,实现id自增。
到此为止,已经完成了MongoDB的自增功能,若是使用正常,数据库应该是这样的:
数据库的IndexBuilder就是用来记录每一个集合的“自增id”的。
MongoDB集成的源码:github.com/vipstone/sp…