扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
一般比较常见的有JPA、MyBatis、Hibernate、TopLink。
在开江等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站建设、成都做网站 网站设计制作按需开发,公司网站建设,企业网站建设,成都品牌网站建设,全网营销推广,成都外贸网站建设公司,开江网站建设费用合理。
Spring Data的话,实际上它不是一个具体的ORM框架,它只是抽象了各ORM框架的一些通用方法,让开发的时候可以减少很多常用功能的编写,具体的ORM功能,还是需要对接具体的ORM框架,而且它不仅于此,它还支持各种NoSQL的操作,比如MongoDB、Redis之类的。
Casbah过于底层,用起来肯定不爽的。你需要的是一个ORM帮你搞定BSON到case class的转换。
推荐两个:
novus/salat · GitHub 很方便,用起来比reactivemongo要容易点,但是貌似最近没怎么维护了。
ReactiveMongo 顾名思义,所有操作都是reactive的,底层是akka写的。这个出发点是好的,但是具体用起来有点麻烦,好多callbacks,就跟node一样。尤其是写脚本的时候,没得选。这个库维护得还不错。适合在项目中用。
( 1 ) Flask
Flask 确实很“轻”,不愧是 Micro Framework ,从 Django 转向 Flask 的开发者一定会如此感慨,除非二者均为深入使用过
Flask 自由、灵活,可扩展性强,第三方库的选择面广,开发时可以结合自己最喜欢用的轮子,也能结合最流行最强大的 Python 库
入门简单,即便没有多少 web 开发经验,也能很快做出网站
非常适用于小型网站
非常适用于开发 web 服务的 API
开发大型网站无压力,但代码架构需要自己设计,开发成本取决于开发者的能力和经验
各方面性能均等于或优于 Django
Django 自带的或第三方的好评如潮的功能, Flask 上总会找到与之类似第三方库
Flask 灵活开发, Python 高手基本都会喜欢 Flask ,但对 Django 却可能褒贬不一
Flask 与关系型数据库的配合使用不弱于 Django ,而其与 NoSQL 数据库的配合远远优于 Django
Flask 比 Django 更加 Pythonic ,与 Python 的 philosophy 更加吻合
( 2 ) Django
Django 太重了,除了 web 框架,自带 ORM 和模板引擎,灵活和自由度不够高
Django 能开发小应用,但总会有“杀鸡焉用牛刀”的感觉
Django 的自带 ORM 非常优秀,综合评价略强与 SQLAlchemy
Django 自带的模板引擎简单好用,但其强大程度和综合评价略低于 Jinja
Django 自带 ORM 也使 Django 与关系型数据库耦合度过高,如果想使用 MongoDB 等 NoSQL
数据,需要选取合适的第三方库,且总感觉 Django+SQL 才是天生一对的搭配, Django+NoSQL 砍掉了 Django 的半壁江山
Django 目前支持 Jinja 等非官方模板引擎
Django 自带的数据库管理 app 好评如潮
Django 非常适合企业级网站的开发:快速、靠谱、稳定
Django 成熟、稳定、完善,但相比于 Flask , Django 的整体生态相对封闭
Django 是 Python web 框架的先驱,用户多,第三方库最丰富,最好的 Python 库,如果不能直接用到 Django 中,也一定能找到与之对应的移植
Django 上手也比较容易,开发文档详细、完善,相关资料丰富
当今NoSQL领域中有很多有力的竞争者通过多种方式来处理海量数据问题。其中重要的解决方案之一就是MongoDB.MongoDB是面向文档的弱结构化存储方案,使用JSON格式来展现、查询和修改数据。
MongoDB文档相当完备,扩展规模与安装一样简单。它提供冗余、切片、索引以及map/reduce等概念支持。MongoDB的开源社区非常大且非常活跃。MongoDB在很多大型产品中被实际运用,如:Disney, Craigslist, Foursquare, Github 和SourceForge.MongoDB是一个开源项目,由10gen.com建立并维护,该公司由DoubleClick的前任执行人员创立。同时,10gen也提供了极好的商业支持与参与建设。
MongoDB 与 NoSQL: 缺陷与优势
MongoDB作为一个可用NoSQL方案具有很多优势。我刚开始接触nosql数据库了解了一系列基于Java的方案,并且花了大量的时间来弄懂什么是列家族,Hadoop与HBase的关系,ZooKeeper到底是什么。当我终于全部清楚之后,发现Cassandra与HBase确实是对于NoSQL领域非常可靠、可信赖的解决方案。但与其他的解决方案相比,MongoDB让我在能够开始写代码之前,不用理解那么多的概念。
与其他软件相似,MongoDB也存在缺陷。经过一段时间使用MongoDB,我列举经历过并需要注意的一些事情,我成为"Gotchas":
● 不要按照关系型数据库来思考。这很明显,MongoDB使得构建和执行复杂查询变得非常容易。当实际使用的时候,你会主要关注于效率问题(像我一样)。
● MongoDB的索引是二进制的树。如果你不是很熟悉B-tree,可能需要了解一下。这些都涉及到构建符合提供查询条件需求的建立索引的方式。
● 小心的设计索引结构。这涉及到上面提到的B-tree.刚开始我的索引包含文档中的很多字段,以防我会使用到他们。不要犯同样的错误。我有一个很小集合的索引(大约1千万记录)增长到超过17GB的空间,比集合本身还大。你应该不会想要索引一个包含成百上千个实体的列表字段。
● MongoDB采用了非常有意思的方式来实现NoSQL:采用BSON作为存储,JSON作为展示,JavaScript用于管理和Map/Reduce.因此也引起了一些小问题比如这个 (破坏了Number和Long的相等操作),在MongoDB逐渐流行之后,可能会不断的展示出来。
MongoDB, 命令行与驱动
MongoDB基本是使用JavaScript客户端命令行程序来进行复杂任务管理的,如数据整合和简单信息处理,编程都是完全使用JavaScript语言来的。本文中,我们会展示命令行的使用示例。现在有大量的MongoDB客户端产品提供,并且由MongoDB社区来支持驱动。通常每种编程语言都有驱动,并且所有流行的语言都有包括,一些不那么流行的也包含在内。这篇文章展示了使用MongoDB的Java驱动,并使用一个ORM库(MJORM)与之进行比较。
介绍 MJORM: MongoDB的ORM方案
在解决的众多有意思的问题中,最近NoSQL数据存储在开发者中主要的问题趋势就是对象关系映射。对象关系映射就是将传统中保存在关系型数据库中的持久化数据映射为在应用程序中使用的对象。这使得编程语言使用起来更加流畅和自然。
MongoDB面向文档的架构使得它非常适合对象关系映射,因为文档本身就是以对象形式存储的。可惜没有太多的MongoDB的Java对象关系映射库,但是还是有一些,如morphia-(A type-safe Java library for MongoDB), spring-data(SpringData项目的MongoDB实现)
这些ORM库大量使用了注解,因为一些原因对我不适合,其中最重要的就是这些被注解的对象在多个项目中的兼容性问题。这让我开始了mongo-Java-orm 或者 "MJORM" (发音 me-yorm)项目,一个MongoDB的Java对象关系映射项目。MJORM是在MIT许可之下,并且在发布在了google code project.项目采用maven构建,并且maven构件仓库托管于google code版本控制服务器。MJORM的最新可用发布版本为0.15,已经由一些项目使用与生产环境中。
开始使用ORM
加入MJORM 库
Maven的使用者首先应当在pom.xml中加入MJORM的maven仓库,使得MJORM构件可用。
然后加入依赖:
这样就可以在应用中引入MJORM代码。假如没有使用maven,则你需要手动下载MJORM的pom.xml中列举的所有依赖。 建立 POJOs依赖已经导入,可以开始编码了。我们从POJO开始:
我们在这个对象模型中的描述是,作者有ID、姓和名,书有ID、ISNB、标题、描述和作者。 你可能注意到书的id属性是一个字符串,这是为了适应MongoDB的对象ID类型。MongoDB的ID是一个12字节的二进制值显示为一个十六进制的字符串。MongoDB要求集合中的每个文档都必须有一个唯一id,但不要求一定要是ObjectId.目前MJORM只支持ObjectId,并且显示为字符串。 你也可能注意到了Author没有id字段。这是因为Book是它的父文档,因此不需要有id.记住,MongoDB只要求集合中的文档在根级别的id. 创建XML映射文件 下一个步骤就是建立XML映射文件,MJORM能够将MongoDB文档转换为对象。我们为每个文档创建一个对象作为示范,无论将所有的映射放在一个XML文件中还是分开都是可以的。
Author.mjorm.xml:
Book.mjorm.xml:
这些映射文件能够很好的自解释。descriptors 元素是根元素,必须包含在每个映射文件中。在它下面是object元素定义了文档与之对应的类。Object包含的property 元素主要用于描述POJO中的属性以及这些属性如何与MongoDB中的文档想对应。property 元素至少必须包含一个name 属性,这个元素就是POJO和MongoDB的文档中的属性名称。column 属性则是可选的,用于特定一个在MongoDB文档中的可选属性名称。 property 元素当中的id属性应该是对象的唯一识别。一个对象只能有一个property 元素包含id属性。auto 的设置会使得MJORM在持久化时为该属性自动生成一个值。 可以在google code的MJORM项目主页中查看XML映射文件的更多细节描述。 整合POJO与XML我们创建了数据模型以及映射文件,使得MJORM可以从MongoDB序列号以及反序列号POJO.我们可以进行一些有意思的事情了,首先打开MongoDB的链接:
Mongo 对象是由10gen编写的Java驱动提供的。示例中连接了一个本地的MongoDB实例中的mjormIsFun数据库。接下来我们创建MJORM ObjectMapper .目前ObjectMapper 在MJORM中的唯一实现就是XmlDescriptorObjectMapper,使用XML结构描述信息。可能之后会增加对注解或其他结构定义的支持。
建立好了XmlDescriptorObjectMapper 并且加入了映射文件。接下来建立由MJORM提供的MongoDao 对象的实例。
首先我们要获得10gen驱动提供的DB对象实例。然后使用DB和ObjectMapper 建立MongoDao .我们准备开始持久化数据,建立一个Book 然后保存到MongoDB中。
首先建立Book 对象并且填值,然后调用MongoDao 的 createObject 方法,将Book 对象传入"books" 的集合中。MJORM会按照之前的xml映射文件将Book 转换为DBObject (这是10gen的Java驱动使用的基本类型),并保存一个新的文档进"books" 集合。MJORM返回Book对象时,id属性会被填充。请注意,MongoDB默认是不需要在使用前建立数据库或集合的,系统会在需要时自动创建,这可能会造成某些困扰。在MongoDB的命令行中查看Book对象大概如下:
我们来看看假如不用MJORM而直接使用10gen的Java驱动,如何使用createObject 方法:
下面进行对象的查询:
readObject 方法根据给定文档的id从指定的集合中读取文档,转换为对象(再次使用映射文件)并返回。 敏锐的读者会注意到Book还没有指定Author,仍然保存了。这归咎于MongoDB的结构不敏感的特性。我们不能要求集合中的文档包含所有属性(id属性是必须的),所有在MongoDB中没有Author的Book是可以的。我们现在为Book添加一个Author并且更新一下:
现在Book就包含了Author,并且在MongoDB中持久化了。现在在命令行查看了Book:
可以看到持久化的Book中已经包含了author.不使用MJORM来操作一遍:
对于MongoDao 方法的深入讨论已经超出了本文的范围。对于将MJORM有兴趣用于实际项目中的用户强烈建议了解一下MJORM项目提供的相关文档,或者MongoDao 接口提供的相关用法。
java的世界
querydsl
jooq
linq
还有一个叫做Spring Data的开源项目
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流