MongoDB:原來我如此簡單

爲何要使用 MongoDB

  1. 張三大學畢業設計題目是《XXX博客論壇》,他在存儲用戶評論的時候遇到了一個問題:這些評論數據量很是大,可是價值不是很大,若是存儲在 MySQL 數據庫中就會浪費性能。java

  2. 李四在工做過程當中遇到一個需求:在審批模塊中,每個公司均可以自定義請假類型,例如調休、出差等。至關於給每一個公司維護一個本身的數據字典。mysql

張三的痛點是存儲的博客評論數據量大可是價值不大,不適合使用Mysql存儲。李四的痛點是須要維護一個數據字典,不適合用關係型數據局。爲了解決張三和李四的痛點,這個時候非關係型文檔型數據庫 MongoDB 閃亮登場。spring

MongoDB 介紹

1. 什麼是 MongoDB

MongoDB是一個跨平臺的,面向文檔的數據庫,是當前NoSQL數據庫產品中最熱門的一種。它介於關係數據庫和非關係數據庫之間,是非關係數據庫當中功能最豐富,最像關係數據庫的產品。sql

2. MongoDB 特色

MongoDB 最大的特色是他支持的查詢語言很是強大,其語法有點相似於面向對象的查詢語言,幾乎能夠實現相似關係數據庫單表查詢的絕大部分功能,並且還支持對數據創建索引。它是一個面向集合的,模式自由的文檔型數據庫。具體特色總結以下:
(1)面向集合存儲,易於存儲對象類型的數據
(2)模式自由
(3)支持動態查詢
(4)支持徹底索引,包含內部對象
(5)支持複製和故障恢復
(6)使用高效的二進制數據存儲,包括大型對象(如視頻等)
(7)支持 Python,Java,C,Javascript,Perl及 C++ 語言的驅動程序
(9)文件存儲格式爲 BSON(一種 JSON 的擴展)mongodb

3. MongoDB 結構

MongoDB 的邏輯結構是一種層次結構。主要由:文檔 (document)、集合(collection)、數據庫 (database) 這三部分組成的。
(1)MongoDB 的文檔,至關於關係數據庫中的一行記錄。
(2)多個文檔組成一個集合,集合至關於關係數據庫的表。
(3)多個集合邏輯上組織在一塊兒,就是數據庫。docker

4. MongoDB 與 MySQL 數據庫邏輯結構概念的對比

MongoDB MySQl
數據庫(database) 數據庫(database)
集合(Collection 表(table)
文檔(document) 行(row)
主鍵,MongoDB默認將_id設爲主鍵 主鍵
索引 索引

5.MongoDB 層次結構以下圖

安裝 MongoDB

1. Docker安裝MongoDB

啓動MongoDB服務數據庫

docker run -itd --name mongo -p 27017:27017 mongo --auth

注:1. 若是是購買的服務器,請將安全組的27017端口打開。 2. -p 27017:27017 :容器服務的 27017 端口映射到服務器的27017端口。外部能夠直接經過服務器 ip:27017 訪問到 mongodb 的服務。
--auth:須要密碼才能訪問。編程

2. 建立帳戶

##進入到容器內部
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')

3. Navicat 客戶端鏈接 MongoDB

建立數據庫安全

SpringBoot 整合 MongoDB

1. 添加依賴

<!-- MongoDB-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>        
</dependency>

2. 修改 SpringBoot 配置文件

spring:
  data:
    mongodb:
      uri: mongodb://root:123456@localhost:27017/test

帳戶:root
密碼:123456
數據庫:testspringboot

3. 建立實體類

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

4. 建立 Repository

@Repository
public interface CommonAccountRepository extends MongoRepository<CommonAccount, String> {

    //獲取該公司的全部經常使用收款人帳戶
    List<CommonAccount> getByCompanyId(Integer companyId);

}

extends MongoRepository:經過繼承 MongoRepository 能夠使用它不少經常使用的方法。

5. 建立 Service

public interface CommonAccountService {

    //獲取該公司的收款帳戶
    List<CommonAccount> getCommonAccount(Integer companyId);

    //添加收款帳戶
    void addCommonAccount(CommonAccount commonAccount);

    //更新收款帳戶
    void updateCommonAccount(CommonAccount commonAccount);

    //刪除收款帳戶
    void deleteCommonAccount(String id);

}

6. Service 實現類

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);
    }
}

7. 去除 _class 列

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;
    }
}

8. 測試

@Test
    void mongoTest() {
        CommonAccount commonAccount = new CommonAccount();
        commonAccount.setPayer("張三").setBank("交通銀行").setBankBranch("北京路分行")
                .setBankNum("61262663265362").setCompanyId(100);
        commonAccountService.addCommonAccount(commonAccount);
    }

微信公衆號:eclipse編程。專一於編程技術分享,堅持終身學習。

相關文章
相關標籤/搜索