MongoDB初探及JAVA工具類封裝
阿新 • • 發佈:2018-12-24
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];
}
}