MongoDB是一個強大、靈活,且易於擴展的通用型數據庫。MongoDB是C++編寫的文檔型數據庫,有着豐富的關係型數據庫的功能,並在4.0以後添加了事務支持。html
隨着存儲數據量不斷的增長,開發者面臨一個困難:如何擴展數據庫?而擴展數據庫分爲橫向擴展和縱向擴展,縱向擴展就是使用計算能力更強大的機器,它的缺點就是:機器性能的提高有物理極限的制約,並且大型機一般都是很是昂貴的,而MongoDB的設計採用的是橫向擴展的模式,面向文檔的數據模型使它很容易的在多臺服務器上進行數據分割。MongoDB能自動處理誇集羣的數據和負載,自動從新分配文檔,這樣開發者就能集中精力編寫應用程序,而不須要考慮若是擴展的問題。java
<!--more-->git
MongoDB的安裝簡單來講分爲兩種:github
推薦使用第二種,直接使用MongoDB鏡像安裝到Docker上,這樣帶來的好處是:web
因此本文將重點介紹MongoDB在Docker上的安裝和使用。spring
若是想要直接在物理機安裝Docker,能夠查看我以前的一篇文章《MongoDB基礎介紹安裝與使用》:https://www.cnblogs.com/vipstone/p/8494347.htmlmongodb
在Docker上安裝軟件通常須要兩步:docker
下載鏡像,須要到鏡像市場:https://hub.docker.com/,如要要搜索的軟件「mongo」,選擇官方鏡像「Official」,點擊詳情,獲取相應的下載方法,咱們獲得下載MongoDB的命令以下:數據庫
docker pull mongo:latest安全
使用命令:
docker run --name mongodb1 -p 27018:27017 -d mongo:latest
使用「docker images」查看鏡像名稱和標籤,以下圖:
容器裝載成功以後,就可使用Robo 3T客戶端進行鏈接了,是不須要輸入用戶名和密碼的,以下圖:
表示已經鏈接成功了。
Robo 3T爲免費的鏈接MongoDB的數據庫工具,能夠去官網下載:https://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集成的源碼:https://github.com/vipstone/springboot-example/tree/master/springboot-mybatis-mongodb