1. 程式人生 > >MongoDB初探及JAVA工具類封裝

MongoDB初探及JAVA工具類封裝

MongoDB 搭建及JAVA工具類封裝

MongoDB 簡介


    MongoDB 旨在為WEB應用提供可擴充套件的高效能資料儲存解決方案。MongoDB 將資料儲存為一個文件,資料結構由鍵值(key=>value)對組成。MongoDB 文件類似於 JSON 物件。欄位值可以包含其他文件,陣列及文件陣列。

基本語法

    基本預發和使用作者不在論述,可參考 菜鳥mongo教程 ,文件上介紹的十分詳細,如果不是為精通了解mongo,基本開發已經足夠。

Mongo伺服器搭建

安裝包下載

    筆者使用的是老版本mac pro, 搭建工作踩坑無數,這裡整理下供使用。好多部落格說採用curl或者brew安裝,但是筆者電腦因升級系統brew安裝xcode失敗,curl下載特別慢,只能採用離線安裝。離線安裝很簡單,直接去網站

mac版本下載地址下載對應安裝的安裝包,解壓配置環境變數即可。
    我下載的版本是3.6.2,解壓後配置環境變數即可。
這裡寫圖片描述

環境變數配置

  • 編輯~/.bash_profile檔案,新增環境變數
export MONGO_PATH=/Users/mantan/Applications/mongodb-osx-x86_64-3.6.2
export PATH=$PATH:$MONGO_PATH/bin
  • 使用source命令是環境變數生效
source ~/.bash_profile

完成上述配置後,環境變數配置成功,可以使用echo檢查下哈。

Mongo基本配置

  • 在mongo根目錄下建如下檔案 data、etc、log,分別用來存放data資料、配置檔案和日誌資訊。
    這裡寫圖片描述
  • 接下來,在data目錄下建db資料夾,存放我們的mongo資料。
    然後在etc目錄下建mongod.conf檔案,內容如下:
dbpath=/Users/mantan/Applications/mongodb-osx-x86_64-3.6.2/data/db
logpath=/Users/mantan/Applications/mongodb-osx-x86_64-3.6.2//logs/mongodb/mongod.log
logappend = true
bind_ip = 127.0.0.1
journal=true
port = 27017
# fork允許後端子程序啟動,終端可以隨便關
fork = true
# 安全許可權,可以先以非授權模式啟動Mongod,新增完使用者db.addUser('root','pwd') ,再開啟auth = true 後,db.auth('root','pwd'),帶密碼登陸 auth = true
  • 接著,在log目錄下建mongodb/mongod.log,用於記錄日誌

到此,配置工作已經完成,馬上起飛,是不是很激動 = - =。

Mongo起飛

  • 使用命令啟動Mongo服務
    mongod --config /Users/mantan/Applications/mongodb-osx-x86_64-3.6.2/etc/mongod.conf
    已經啟動:
    這裡寫圖片描述

  • 進入shell客戶端操作
    執行mongo命令即可進入
    這裡寫圖片描述
    筆者設定了auth使用者登入許可權
    這裡寫圖片描述

### admin管理員使用者
db.createUser({ user: "root", pwd: "root", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] }) 
### 普通資料庫使用者
db.createUser({ user: "youruser2", pwd: "yourpassword2", roles: [{ role: "readWrite", db: "yourdatabase" }] })

下面是我測試建立的collection,特別適合做資料欄位動態轉儲
這裡寫圖片描述
這裡寫圖片描述

JAVA工具類封裝

封裝了Mongo操作的Java抽象類,基本滿足日常開發需求,DAO層整合此基類即可使用能力。貢獻出來,供大家參考,不當之處,評論處補充:

package yonyou.esn.openapi.dao.mongo;

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 yonyou.esn.openapi.util.Page;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

public class MongoBaseDao<T> {
    private static final int DEFAULT_SKIP = 0;
    private static final int DEFAULT_LIMIT = 200;

    /**
     * spring mongodb 整合操作類 
     */
    @Autowired
    protected MongoTemplate mongoTemplate;

    protected String collection;

    /**
     * 通過條件查詢實體(集合)
     *
     * @param query
     */
    public List<T> find(Query query) {
        return mongoTemplate.find(query, this.getEntityClass());
    }

    public List<T> find(Query query, String collectionName) {
        return mongoTemplate.find(query, this.getEntityClass(), collectionName);
    }

    /**
     * 通過一定的條件查詢一個實體
     *
     * @param query
     * @return
     */
    public T findOne(Query query) {
        return mongoTemplate.findOne(query, this.getEntityClass());
    }

    public T findOne(Query query, String collectionName) {
        return mongoTemplate.findOne(query, this.getEntityClass(), collectionName);
    }

    /**
     * 通過條件查詢更新資料
     *
     * @param query
     * @param update
     * @return
     */
    public void update(Query query, Update update) {
        mongoTemplate.findAndModify(query, update, this.getEntityClass());
    }

    public void update(Query query, Update update, String collectionName) {
        mongoTemplate.findAndModify(query, update, this.getEntityClass(), collectionName);
    }

    public void removeById(String id, String collectionName){
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(id));
        mongoTemplate.remove(query, collectionName);
    }

    /**
     * 儲存一個物件到mongodb
     *
     * @param entity
     * @return
     */
    public T save(T entity) {
        mongoTemplate.insert(entity);
        return entity;
    }

    public T save(T entity, String collectionName) {
        mongoTemplate.insert(entity, collectionName);
        return entity;
    }

    /**
     * 通過ID獲取記錄
     *
     * @param id
     * @return
     */
    public T findById(String id) {
        return mongoTemplate.findById(id, this.getEntityClass());
    }

    /**
     * 通過ID獲取記錄,並且指定了集合名(表的意思)
     *
     * @param id
     * @param collectionName
     *            集合名
     * @return
     */
    public T findById(String id, String collectionName) {
        return mongoTemplate.findById(id, this.getEntityClass(), collectionName);
    }

    /**
     * 分頁查詢
     * @param page
     * @param query
     * @return
     */
    public Page<T> findPage(Page<T> page, Query query){
        long count = this.count(query);
        page.setTotal(count);
        int pageNumber = page.getPageNumber();
        int pageSize = page.getPageSize();
        query.skip((pageNumber - 1) * pageSize).limit(pageSize);
        List<T> rows = this.find(query);
        page.setRows(rows);
        return page;
    }

    public Page<T> findPage(Page<T> page, Query query, String collectionName){
        long count = this.count(query, collectionName);
        page.setTotal(count);
        int pageNumber = page.getPageNumber();
        int pageSize = page.getPageSize();
        query.skip((pageNumber - 1) * pageSize).limit(pageSize);
        List<T> rows = this.find(query, collectionName);
        page.setRows(rows);
        return page;
    }

    /**
     * 求資料總和
     * @param query
     * @return
     */
    public long count(Query query){
        return mongoTemplate.count(query, this.getEntityClass());
    }

    public long count(Query query, String collectionName){
        return mongoTemplate.count(query, this.getEntityClass(), collectionName);
    }


    /**
     * 獲取需要操作的實體類class
     *
     * @return
     */
    private Class<T> getEntityClass(){
        Type superclass = this.getClass().getGenericSuperclass();
        Type[] actualTypeArguments = ((ParameterizedType)superclass).getActualTypeArguments();
        return (Class) actualTypeArguments[0];
    }
}