irpas技术客

java mongodb orm 实现-基于mongodb-driver开发的ORM(二:连接维护和主键自增)_好一个大布丁_java mongodb orm

大大的周 1459

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

上篇文章说到,通过mongodb-driver原生包进行开发,封装易用的接口,降低使用门槛,去除冗余的代码。使得项目更简洁

一、:连接维护(编码/解码) 二、:自定义-主键自增Ticket

一:连接维护(编码/解码)

1.1 连接client的维护

private final Map<String, MongoCollection<Document>> collections = new ConcurrentHashMap<>(); public MongoCollection<Document> getCollection(String database, String collection) { String key = this.getDbKey(database, collection); MongoCollection<Document> db = collections.get(key); if (db == null) { MongoDatabase dbs = mongoClient.getDatabase(database); db = dbs.withCodecRegistry(DEFAULT_CODEC_REGISTRY).getCollection(collection); collections.put(key, db); } return db; }

在获取一个连接的时候,查看是当前是否已经有过这样的Collection,有直接通过对应的key 进行查询返回,若没有,通过mongoclient 创建一个MongoDatabase。mongodb创建连接的时候,需要注册一个encoder和decoder,也就是我们常说的编码器和解码器。

1.2:编码器和解码器 mongodb 能够将存储的bson转为java 中的pojo实体entity。需要给定编码器和解码器。在连接pipeline中,我们需要给定如下的codeProvider。其中PojoCodecProvider通过ClassModel抽象为注册的pojo提供编解码器。

CodecProvider[] array = new CodecProvider[]{ new ValueCodecProvider(), new DBRefCodecProvider(), new DocumentCodecProvider(new DocumentToDBRefTransformer()), new DBObjectCodecProvider(), new BsonValueCodecProvider(), new GeoJsonCodecProvider(), PojoCodecProvider.builder().automatic(true).build(), };

通过builder 方法创建一个Builder,这样可以在创建final类型的的CodecProvider。当automatic 设置为true时,表示通过任何class 进行查询的时候,系统都会为本class 创建一个classmodelcodecProvider,否则需要手动注册具体的class 。

二、:自定义-主键自增Ticket

2.1 mongodb 中的主键 在MongoDB中,_id字段是集合的主键,以便可以在集合中唯一地标识每个文档。_id字段包含唯一的ObjectID值。默认情况下,在集合中插入文档时,如果您没有在字段名称中添加带有_id的字段名称,则MongoDB将自动添加一个Object id字段 在本项目《m-db》中,我们将mongodb 主键进行重写,通过一个自增功能实现。

在mongodb中,没有主键自增功能,需要我们手动实现一个,巧的时mongodb 有$inc 这样的自增插入操作,利用此方法。封装一个自增的标记注解,使得主键自增变得很方便。

例如 userinfo中,uid 是一个自增字段,所以,只需要在uid上进行标记mongoId。然后tick 为true即可 2.2 主键自增原理

前面说到,通过mongodb 的$inc操作能够实现字段自增,受此启发,创建一个TickId这样的表,结构如下,其中key表示某个实体,也就是表名和字段名字的一个组合,value 为自增的值,因此,只需要在添加的数据的时候,检测当前字段上是否有标记自增的功能,若有,实现自增。

@MongoDocument(table = "mdb_tick") public class TickId extends AbstractMongoPo { @Indexed(unique = true, name = "key") @MongoId(name = "key", root = true) private String key; private long value; }

实现原理如下,构建架构为{key:tablename,$inc:{value:1}} 这样的document,然后返回增长后的值。

private synchronized long _nextId(String name) { Document document = new Document(); document.put("key", name); Document up = new Document(); up.put("$inc", new Document("value", 1)); MongoCollection<Document> collection = mongoCollectionManager.getCollection(TickId.class); Document result = collection.findOneAndUpdate(document, up); if (result == null) { document.put("value", 1); collection.insertOne(document); return 1; } return result.getInteger("value"); }


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #JAVA #mongodb #orm #连接c