Mongodb使用json格式存储数据,不像关系型数据库用记录来表示,它是一种nosql数据库。数据存储用key:value形式存储,这样表示好处就是简单。
在项目中,有一个用户的实体User,他有很多朋友,当然他的朋友也在数据库里,为了建立关系,如果在关系数据库中我们会建立一个关系表UserFriend来表示这2个关系,这样表示的优点是结构清晰,缺点也显而易见,必须多执行一次查询才能获得好友id列表。。。而且要想更新好友关系那就更复杂了点,需要批量删除修改。。。
在mongodb里,就可以直接把好友id以数组形式加到用户信息的一个字段里了,这样在获取用户信息时,好友信息就直接获取,大大减少了查询请求,更新时也可以直接设值。这也就是为什么在互联网应用中倾向于使用nosql而不是关系型数据库的原因!简单、高效!
java的语法似乎不怎么喜欢json格式,通常定义一个对象,用setter和getter来操作数据,比较繁琐,却也不得已而为之!(相对来说,python等脚本语言用json很酷,可以直接用a["key"]来获取和设置字段值)。可惜这个项目已经用java来做了,用python估计不太可能了。
mongodb提供的java driver里,存取数据用DBObject,它使用类似map操作方法,把字段和值一个个put进去,读取的话可以用get方法,当时第一次接触,我就想到了用反射(reflect)来操作,获取pojo的每个字段值然后put到DBObject里,于是就写了个互相转化的方法,后来在项目中也就是这样使用了,可我写的这个方法只能处理简单类,字段只能为Integer,Long,String这集中类型,不支持数组和map。。做了一段时间,才发现我在用nosql
数据库实现关系数据库,因为我确实用了一个usrfriend集合来存储用户好友关系。。。
最近才若有所思的发现,我不该这么做,好友id列表应该直接放到用户信息里的。
在mongodb官网发现有很多第三方工具,其中有个morphia的项目,打开首页(http://code.google.com/p/morphia/),一目了然的看到了如何定义实体以及存储和查找,用了下比我这个方便多了,于是毫不犹豫的开始重构代码。。。
下面介绍下如何使用morphia
1.下载最新版本的morphia-xxx.jar 并且加入的 path里。
2.在pojo类用注解@Entity定义一个实体,用@Embedded定义一个潜入类。
3.可以直接存储数组,和map。非常方便的可以嵌套很多信息。原先要建关系表的,可以统统取消了。只用一个
查询就可以把所有信息返回了,在高并发时非常实用。
4.morphia提供了一个dao可以拓展或者实例化使用,我没有拓展,因为用了spring,有依赖注入关系,而拓展这
个DAO需要Datastore,在构造函数里无法给它。只有在注入完毕后我才可以给它。于是只有这样了
public void afterPropertiesSet() throws Exception {
this.ds = morphia.getDataStore() ;
dao = new DAO<T, String>(clazz, this.ds);
}
5.编写好一些常用接口:
/**
* 增加
*/
public void add(T t){
dao.save(t);
}
/**
* 创建一个查询
*/
protected Query<T> createQuery(){
return dao.createQuery();
}
/**
* 根据_id查询
*/
protected Query<T> createIdQuery(Object _id){
return dao.createQuery().field("_id").equal(_id);
}
/**
* 查找一个实体
*/
protected T findOne(Query<T> q){
return dao.findOne(q);
}
/**
* 根据_id查找
*/
public T findById(ObjectId _id){
return dao.findOne("_id", _id);
}
/**
* 可查找多个实体
*/
protected QueryResults<T> find(Query<T> q){
return dao.find(q);
}
/**
* 返回全部实体
*/
public List<T> getAll(){
return this.find(this.createQuery()).asList();
}
/**
* 分页查找
*/
protected QueryResults<T> find(Query<T> q, Page page){
if(page != null){
q.limit(page.getPageSize()).offset((page.getPageIndex() - 1) *
page.getPageSize());
page.setTotalCount((int) q.countAll());
}
return dao.find(q);
}
/**
* 删除实体
*/
protected void delete(T t){
dao.delete(t);
}
/**
* 根据查询删除
*/
protected void delete(Query<T> q){
dao.deleteByQuery(q);
}
/**
* 根据_id删除
*/
public void delById(ObjectId id){
Query<T> q = this.createIdQuery(id);
dao.deleteByQuery(q);
}
/**
* 更新
*/
protected void update(Query<T> q, UpdateOperations<T> ops){
dao.update(q, ops);
}
/**
* 已知_id进行添加就是更新覆盖
*/
public void update(T t){
dao.save(t);
}
/**
* 创建一个更新操作
*/
protected UpdateOperations<T> createUpdateOperations(){
return dao.createUpdateOperations();
}
这样,在具体使用时,直接定义一个User类,它里面的字段可以使用很多其他类,也可以使用数组,然后直接
save,而query时也会一起带出来,很方便,也可以大大较少数据库请求操作。
分享到:
相关推荐
3. **创建数据和日志目录**: 在`mongodb`目录下,创建`data`存储数据,创建`log`存放日志,并在`log`目录下创建`mongodb.log`。 4. **启动MongoDB服务**: 进入`mongodb/bin`目录,使用`mongod`命令启动MongoDB,...
MongoDB 是一个功能强大且灵活的 NoSQL 数据库,Java 开发者可以使用 MongoDB 来存储和管理数据。通过以上的配置和安装步骤,Java 开发者可以轻松地使用 MongoDB。 知识点总结: * MongoDB 的下载和安装 * MongoDB...
在这个Java操作MongoDB中存储的文件实例中,我们将探讨如何利用GridFS API进行文件的存取。 首先,我们需要在Java项目中引入MongoDB的驱动库。目前,Java驱动通常使用的是MongoDB Java Driver,可以在Maven仓库中...
通过学习上述内容,你将能够熟练地使用MongoDB,并在Java项目中集成MongoDB作为持久化存储。记得参考提供的文档,如"MongoDB设计思想.doc"、"MongoDB教程.pdf"和"mongoDB.txt",这些资源将更详细地阐述MongoDB的各个...
在Java编程环境中,MongoDB是一个广泛使用的文档型数据库,它以JSON格式存储数据,提供了高性能、高可用性和可扩展性。本教程将详细介绍如何使用Java进行MongoDB的基本操作,包括增(添加数据)、删(删除数据)、改...
Geoserver是基于Java开发的一款开源GIS服务器,能够处理大量的空间数据,提供了强大的空间数据存储、处理和发布功能。Geoserver支持多种数据源,包括PostGIS、Oracle Spatial、MongoDB等。 二、MongoDB矢量数据存储...
在Java编程环境中,连接MongoDB数据库通常需要特定的驱动程序,这些驱动程序以JAR(Java Archive)文件的形式提供。...正确理解和使用这些库可以让你轻松地在Java项目中集成MongoDB的功能,实现高效的数据存储和检索。
在Java开发中,MongoDB常被用于处理结构化和半结构化的数据。本篇文章将深入探讨MongoDB如何进行文件存储,特别是针对大文件的处理。 首先,MongoDB提供了GridFS(Grid File System)规范,这是一个用于存储和检索...
在Java编程中,MongoDB是一个常用的NoSQL数据库,它的灵活性和高性能使得它在处理大量非结构化数据时非常受欢迎。本篇文章将详细讲解如何使用Java连接到MongoDB数据库,并进行基本的增删改查操作。 首先,连接...
Java连接MongoDB是一个常见的任务,尤其在大数据处理和分布式存储的场景中。MongoDB是一个流行的文档型数据库系统,而Java是开发服务器端应用的常用语言。在这个“java连接mongodb.zip”压缩包中,包含了实现这一...
在Java开发环境中,我们可以使用Java驱动程序来与MongoDB进行交互,进行数据的存储和检索。本资料将深入讲解如何使用Java实现对MongoDB数据库的操作。 一、MongoDB简介 MongoDB是一个基于分布式文件存储的NoSQL...
1. **创建(CREATE)**:在MongoDB中,数据以文档的形式存储在集合中。以下是如何插入一个文档到名为"myCollection"的集合: ```java MongoCollection<Document> collection = database.getCollection(...
在Java中,你可以使用`DBObject`类来构建要存储的数据结构。创建一个`Map`对象,将数据放入其中,然后将其转换为`DBObject`: ```java Map, String> data = new HashMap(); data.put("key", "value"); DBObject ...
1. `bson-3.9.1.jar`: BSON(Binary JSON)是MongoDB用于存储和传输数据的一种格式。这个库提供了对BSON数据类型的编码和解码功能,使得Java应用程序能够理解和处理MongoDB中的文档结构。BSON是一种轻量级的数据交换...
MongoDB是一种流行的开源、分布式文档数据库,用于存储结构化和半结构化数据。它以其灵活性、高性能和易于扩展性而闻名。在这个主题中,我们将深入探讨MongoDB的安装配置以及如何使用Java进行操作。 首先,让我们看...
在Java编程环境中,MongoDB是一个常用的NoSQL数据库系统,它以JSON格式存储数据,提供了高性能、高可用性和可扩展性。本教程将详细介绍如何使用Java与MongoDB进行交互,包括基本的增删改查(CRUD)操作。首先,我们...
3. `bson-3.4.2.jar`:BSON(Binary JSON)是MongoDB内部使用的数据格式,用于在网络中高效地传输和存储数据。这个库提供了对BSON的解析和序列化功能,是Java驱动与MongoDB通信的重要桥梁。 为了在Java项目中使用...
MongoDB是一个高性能、开源、无模式的文档型数据库,广泛应用于数据存储和处理。在Java环境中,我们通常使用MongoDB的Java驱动程序来实现这种连接。本文将深入探讨如何使用Java API连接MongoDB,并执行基本的操作。 ...
本篇文章将深入讲解如何使用Java来上传MP4文件到MongoDB,并进行下载操作。 首先,我们需要引入MongoDB的Java驱动程序。MongoDB提供了Java驱动库,通过Maven或Gradle可以轻松添加依赖。在Maven的`pom.xml`中,你...