MongoDB初探及JAVA工具类封装

MongoDB 搭建及JAVA工具类封装

  • MongoDB 搭建及JAVA工具类封装
      • MongoDB 简介
      • 基本语法
      • Mongo服务器搭建
        • 安装包下载
        • 环境变量配置
      • Mongo基本配置
      • Mongo起飞
      • JAVA工具类封装

MongoDB 简介


    MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

基本语法

    基本预发和使用作者不在论述,可参考 菜鸟mongo教程 ,文档上介绍的十分详细,如果不是为精通了解mongo,基本开发已经足够。

Mongo服务器搭建

安装包下载

    笔者使用的是老版本mac pro, 搭建工作踩坑无数,这里整理下供使用。好多博客说采用curl或者brew安装,但是笔者电脑因升级系统brew安装xcode失败,curl下载特别慢,只能采用离线安装。离线安装很简单,直接去网站mac版本下载地址下载对应安装的安装包,解压配置环境变量即可。
    我下载的版本是3.6.2,解压后配置环境变量即可。
MongoDB初探及JAVA工具类封装_第1张图片

环境变量配置

  • 编辑~/.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数据、配置文件和日志信息。
    MongoDB初探及JAVA工具类封装_第2张图片
  • 接下来,在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命令即可进入
    MongoDB初探及JAVA工具类封装_第3张图片
    笔者设置了auth用户登录权限
    MongoDB初探及JAVA工具类封装_第4张图片

### admin管理员用户
db.createUser({ user: "root", pwd: "root", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] }) 
### 普通数据库用户
db.createUser({ user: "youruser2", pwd: "yourpassword2", roles: [{ role: "readWrite", db: "yourdatabase" }] })

下面是我测试建立的collection,特别适合做数据字段动态转储
MongoDB初探及JAVA工具类封装_第5张图片

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 find(Query query) {
        return mongoTemplate.find(query, this.getEntityClass());
    }

    public List 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 findPage(Page 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 rows = this.find(query);
        page.setRows(rows);
        return page;
    }

    public Page findPage(Page 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 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 getEntityClass(){
        Type superclass = this.getClass().getGenericSuperclass();
        Type[] actualTypeArguments = ((ParameterizedType)superclass).getActualTypeArguments();
        return (Class) actualTypeArguments[0];
    }
}

你可能感兴趣的:(JAVA,数据库,分布式)