張三大學畢業設計題目是《XXX博客論壇》,他在存儲用戶評論的時候遇到了一個問題:這些評論數據量很是大,可是價值不是很大,若是存儲在 MySQL 數據庫中就會浪費性能。java
李四在工做過程當中遇到一個需求:在審批模塊中,每個公司均可以自定義請假類型,例如調休、出差等。至關於給每一個公司維護一個本身的數據字典。mysql
張三的痛點是存儲的博客評論數據量大可是價值不大,不適合使用Mysql存儲。李四的痛點是須要維護一個數據字典,不適合用關係型數據局。爲了解決張三和李四的痛點,這個時候非關係型文檔型數據庫 MongoDB 閃亮登場。spring
MongoDB是一個跨平臺的,面向文檔的數據庫,是當前NoSQL數據庫產品中最熱門的一種。它介於關係數據庫和非關係數據庫之間,是非關係數據庫當中功能最豐富,最像關係數據庫的產品。sql
MongoDB 最大的特色是他支持的查詢語言很是強大,其語法有點相似於面向對象的查詢語言,幾乎能夠實現相似關係數據庫單表查詢的絕大部分功能,並且還支持對數據創建索引。它是一個面向集合的,模式自由的文檔型數據庫。具體特色總結以下:
(1)面向集合存儲,易於存儲對象類型的數據
(2)模式自由
(3)支持動態查詢
(4)支持徹底索引,包含內部對象
(5)支持複製和故障恢復
(6)使用高效的二進制數據存儲,包括大型對象(如視頻等)
(7)支持 Python,Java,C,Javascript,Perl及 C++ 語言的驅動程序
(9)文件存儲格式爲 BSON(一種 JSON 的擴展)mongodb
MongoDB 的邏輯結構是一種層次結構。主要由:文檔 (document)、集合(collection)、數據庫 (database) 這三部分組成的。
(1)MongoDB 的文檔,至關於關係數據庫中的一行記錄。
(2)多個文檔組成一個集合,集合至關於關係數據庫的表。
(3)多個集合邏輯上組織在一塊兒,就是數據庫。docker
MongoDB | MySQl |
---|---|
數據庫(database) | 數據庫(database) |
集合(Collection | 表(table) |
文檔(document) | 行(row) |
主鍵,MongoDB默認將_id設爲主鍵 | 主鍵 |
索引 | 索引 |
啓動MongoDB服務數據庫
docker run -itd --name mongo -p 27017:27017 mongo --auth
注:1. 若是是購買的服務器,請將安全組的27017端口打開。 2. -p 27017:27017 :容器服務的 27017 端口映射到服務器的27017端口。外部能夠直接經過服務器 ip:27017 訪問到 mongodb 的服務。
--auth:須要密碼才能訪問。編程
##進入到容器內部 docker exec -it mongo mongo admin ##建立系統管理員 db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]}); ##驗證帳戶密碼 db.auth('admin', '123456') ##建立其餘數據庫 use ems ##在該數據庫下建立其餘帳戶 db.createUser({ user: 'root', pwd: 'abc123456', roles: [ { role: "readWrite", db:"ems" } ] }); ##驗證帳戶密碼 db.auth('root', 'abc123456')
建立數據庫安全
<!-- MongoDB--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
spring: data: mongodb: uri: mongodb://root:123456@localhost:27017/test
帳戶:root
密碼:123456
數據庫:testspringboot
import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; /** * 經常使用收款人 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @Document(collection = "common_account") public class CommonAccount { @Id private String id; //公司id private Integer companyId; //付款人 private String payer; //銀行 private String bank; //分支行 private String bankBranch; //帳號 private String bankNum; }
關鍵註解:1. @Document(collection = "common_account")
@Document表示這是一個集合,當你保存數據的時候若是你沒有建立集合,他會自動給你建立一個名爲 common_account 的集合。2. @Id:隨機生成id
@Repository public interface CommonAccountRepository extends MongoRepository<CommonAccount, String> { //獲取該公司的全部經常使用收款人帳戶 List<CommonAccount> getByCompanyId(Integer companyId); }
extends MongoRepository:經過繼承 MongoRepository 能夠使用它不少經常使用的方法。
public interface CommonAccountService { //獲取該公司的收款帳戶 List<CommonAccount> getCommonAccount(Integer companyId); //添加收款帳戶 void addCommonAccount(CommonAccount commonAccount); //更新收款帳戶 void updateCommonAccount(CommonAccount commonAccount); //刪除收款帳戶 void deleteCommonAccount(String id); }
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.Service; import java.util.List; @Service public class CommonAccountServiceImpl implements CommonAccountService { @Autowired private CommonAccountRepository commonAccountRepository; @Autowired private MongoTemplate mongoTemplate; @Override public List<CommonAccount> getCommonAccount(Integer companyId) { List<CommonAccount> accountList = commonAccountRepository.getByCompanyId(companyId); return accountList; } @Override public void addCommonAccount(CommonAccount commonAccount) { commonAccountRepository.save(commonAccount); } @Override public void updateCommonAccount(CommonAccount commonAccount) { Query query = Query.query(Criteria.where("id").is(commonAccount.getId())); Update update = new Update(); update.set("companyId", commonAccount.getCompanyId()); update.set("payer", commonAccount.getPayer()); update.set("bank", commonAccount.getBank()); update.set("bankBranch", commonAccount.getBankBranch()); update.set("bankNum", commonAccount.getBankNum()); mongoTemplate.updateFirst(query, update, CommonAccount.class); } @Override public void deleteCommonAccount(String id) { commonAccountRepository.deleteById(id); } }
mongoDB 保存數據的時候默認會新增一個 _class 列,以下圖:
添加以下配置,去除_class 列
@Configuration public class MongoConfig { /** * 去掉_class * @param factory * @param context * @param beanFactory * @return */ @Bean public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory factory, MongoMappingContext context, BeanFactory beanFactory) { DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory); MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context); try { mappingConverter.setCustomConversions(beanFactory.getBean(MongoCustomConversions.class)); } catch (NoSuchBeanDefinitionException ignore) { } mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null)); return mappingConverter; } }
@Test void mongoTest() { CommonAccount commonAccount = new CommonAccount(); commonAccount.setPayer("張三").setBank("交通銀行").setBankBranch("北京路分行") .setBankNum("61262663265362").setCompanyId(100); commonAccountService.addCommonAccount(commonAccount); }
微信公衆號:eclipse編程。專一於編程技術分享,堅持終身學習。