IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> java mongodb orm 实现-基于mongodb-driver开发的ORM -> 正文阅读

[大数据]java mongodb orm 实现-基于mongodb-driver开发的ORM

导论:
MongoDB是一个非常有前途的数据库,MongoDB官方对自己的定位是通用数据库,其实这个定位跟MySQL有些像。虽其流行度还远未达到MySQL的水平,但笔者有个可能不恰当的比较,MongoDB就像N年前的MySQL,随着时间的推移,会变得越来越强大,也会越来越流行。

由于基于mongo 官方提供的api使用比较复杂,不方便与业务开发,所以本项目基于官方api进行封装,简化了关于文档的查询,创建以及索引维护。

m-db

English 简体中文

简介

这是个什么?

欢迎使用本项目。

本项目基于mongodb-driver封装开发,极大简化了原生API,使得开发人员专注业务本身。项目采用注解风格模式,简化了类似xml这样的配置。

主要功能

1:简单文档映射
2:内嵌文档映射
3:异步存储。批量存储
4:索引管理

主要功能是否支持是否异步
读操作
写操作
批量读
批量写
索引维护

使用说明

索引管理

一、索引维护

通过注解@Indexed 和@CompoundIndexed 实现简单索引和联合索引的自动创建与维护,简化mongodb 索引的使用和维护

/**
* 联合索引:多个字段组合索引构成
*
*/
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface CompoundIndexed {

  Indexed[] value();

  int order() default -1;

  boolean unique() default true;
}

/**
* 普通索引:为某个字段建立索引
*/
@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Indexed {

  boolean unique() default false;

  String name();

  int order() default -1;
}

/**
* 失效时间索引:本document 具有时效性
*/
@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExpireIndex {

  boolean unique() default false;

  String name() default "";

  int order() default -1;
}


详细使用见IndexTest中,当给每个document 的po类上或字段标记索引时,则索引会进行创建。

创建索引

二、 简单文档使用

简单文档:文档结构简单,字段类型基本为基础数据类型字段。
使用步骤:

2.1 :组装实体类PO对象
/**
 * 一个简单文档
 */
@MongoDocument(table = "user_build")
@CompoundIndexed(value = {@Indexed(name = "uid"), @Indexed(name = "build_id")})
public class BuildPo extends AbstractMongoPo {

    @MongoId(name = "uid")
    private long uid;
    @MongoId(name = "build_id", tick = true)
    @BsonProperty("build_id")
    private long buildId;
    private int x;
    private int y;
    private String type;
    private String name; 

其中通过注解@MongoDocument 数据库名字,指定表名,注解@CompoundIndex 指定用那几个字段作为联合索引
也可以用@Indexed 来单独指定索引,使用@MongoId来指定主键,由于mongodb无法实现类似mysql自增,索引采用此注解来来是否指定主键自增

2.2 添加数据
  public static void addBuild() throws MException {
        BuildPo buildPo = new BuildPo();
        buildPo.setY(6);
        buildPo.setX(7);
        buildPo.setUid(1);
        buildPo.setName("北京SOHO大厦");
        buildPo.setType("高端建筑");
        MongoManager.getInstance().add(buildPo);
    }
2.3 批量添加
    private static void addManyBuild() throws MException {
        List<BuildPo> list = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            BuildPo po = new BuildPo();
            po.setUid(2049);
            po.setX(i);
            po.setY(i);
            list.add(po);
        }
        MongoManager.getInstance().addMany(list);
    }

例如添加之后的数据在mongodb中可以查询到

2.4 查询

查询方式可分为两种,一种是利用@mongoID注解的主键进行查询,一种是通过某个字段进行find 查询


/**
    * 主键查询
    */
   public static void get() throws MException {
       BuildPo b = MongoManager.getInstance().get(BuildPo.class, PrimaryKey.builder("uid", 1), PrimaryKey.builder("build_id", 7));
       System.out.println(b.getBuildId());
   }

   public static void getAll() throws MException {
       List<BuildPo> bs = MongoManager.getInstance().getAll(BuildPo.class, PrimaryKey.builder("uid", 1));
       System.out.println("getAll size=" + bs.size());
   }

 public static void findOne() throws MException {
       BuildPo b = MongoManager.getInstance().findOne(BuildPo.class, Query.builder().and("uid", 1).and("build_id", 7));
       System.out.println(b.getX() + "|" + b.getY());

   }

   public static void findAll() throws MException {
       List<BuildPo> bs = MongoManager.getInstance().findAll(BuildPo.class, Query.builder().and("uid", 1).and("y", 6), QueryOptions.builder().limit(100));
       System.out.println("findAll size=" + bs.size());

   }
2.5 修改

修改一个文档中的某个字段,使用方式如下,例如将查询出来的build 名字进行修改


    public static void update() throws MException {
        BuildPo b = MongoManager.getInstance().get(BuildPo.class, PrimaryKey.builder("uid", 1), PrimaryKey.builder("build_id", 2));
        b.setName("new name build");
        MongoManager.getInstance().update(b);
    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qB7M58hV-1638093207578)(https://github.com/twjitm/m-db-test/blob/main/images/update.jpg?raw=true)]

三、异步:写改

系统支持异步操作。将操作封装为一个task,添加到异步队列中,数据库执行线程会从队列中取得操作任务。

3.1 开启异步操作

 private static void init() {
        mongoManager = new MongoManager("127.0.0.1:27017", true);
    }

3.2 异步操作原理


 private void execute() {
        if (pool.isEmpty()) {
            return;
        }
        pool.forEach((k, v) -> collectionManager.getCollection(k).bulkWrite(v));
        pool.clear();
    }

最后

源码地址

感谢大家对本项目的支持,要是发现有不好的地方,欢迎提交issues。欢迎star 🌟🌟🌟🌟。有问题可以联系我,一起讨论。目前项目还在不断完善中。。。。

作者:twjitm@gmail.com

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-11-29 16:23:14  更:2021-11-29 16:24:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:58:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码