7

您好,我们正在启动一个项目,我们必须在使用 Spring JDBCTemplates、iBatis/myBatis 或 Hibernate 作为我们的持久层之间做出决定。我或多或少熟悉他们两个的概念,但我想知道人们目前倾向于使用什么。

我的要求是:

  • 让一切尽可能简单
  • 易于学习和使用
  • 高性能
  • 最佳开发人员生产力
  • 必须与 Spring 3 一起使用

如前所述,我们希望一切都尽可能简单。我的偏好倾向于 iBatis/myBatis,因为它看起来更易于使用,而且我们不需要真正的 OR Mapper。但我真的很期待向使用这些框架的人学习。

4

5 回答 5

5

我建议您查看针对 spring/hibernate/ibatis 和 JPA(2) 的minuteproject逆向工程解决方案,因为它可以满足您的开发需求。它还没有生成的一件事是 jdbctemplate。

在选择一项技术之前,我将回顾您所有适合分钟项目方法的观点。

  • 保持一切尽可能简单:让 minuteproject 为您生成在 iBatis(sqlMaps)、Hibernate(hbm 文件)、JPA(orm 文件或注释实体)中持久化所需的代码。但是所有额外的框架集成:spring 配置,一个全面的 DAO 堆栈(不限于基本的 CRUD 操作)。它可以对应 20% 到 40% 的应用程序工件和时间。
  • 易于学习和使用:您的模型成为您的技术教程!从生成的内容中学习。您当然可以根据您的特定需要对其进行扩展。
  • 高性能:在 Spring/hibernate 或 Spring/JPA 的分钟项目轨道中:分钟项目提供与 orm 产品集成的 ehcache 配置生成。它提供了先进的 dao 层,您只需参考即可。
  • 最佳的开发人员生产力:它可以帮助您专注于您的实际业务,而不是所有繁琐的 orm / dao 任务。它使技术学习曲线变平。
  • 必须与 Spring 3 一起使用:spring 工件与 2.5+ 兼容

但能判断的最好的是你,所以在你的模特身上试一试。要快速了解启动 /bin/start-console.(cmd/sh) 的可能性,请指向您的数据库并选择生成轨道。如果您的数据库是(mysql、db2、oracle、hsqldb 有默认值,例如 hibernatedialect 预设),通常应该需要几分钟。要更高级地使用配置(它适用于所有数据库)。

关于使用哪种技术,我个人对所有这些技术都有生产经验,但我认为像 hibernate 这样的 orm 框架的双向方面是单向 sqlmap 的强项。它节省了配置,图形导航很直观。

好东西:转义特殊字符(例如 ')包含在 orm 框架中。这是您在 sqlmap 中执行本机 sql 时通常会遇到的问题,例如插入 lastname = 'o'hara'...

我会选择 Hibernate(在您提到的选择中),但选择JPA2(如果您将其包括在内)。如果您想要真正的额外生产力,请在其中集成可编译标准 API 的querydsl

于 2011-07-07T21:40:16.770 回答
4

我曾与 Ibatis 和 Hibernate 合作过。Ibatis 简单明了。如果您不小心,Hibernate 可能会变得复杂,但它对您有很大帮助。spring-jdbc 比原始 JDBC 更好。

Hibernate 最大的优势是能够映射到不同的数据库。您甚至可以关闭模​​式前缀。您可以选择使用内存数据库进行测试,或者让开发人员使用与生产目标不同的本地数据库(例如,如果您的目标是 Oracle 并且许可证是一个问题),或者能够针对多个数据库。使用 Hibernate 可以轻松交换 id 生成器。使用 Hibernate 原生 SQL 是一种选择,但使用 Ibatis 则别无选择。

此外,很难甚至不可能保持 Ibatis 映射文件干燥。如果您有多个具有不同 where 子句的查询,则会导致 cut-n-paste。有了 Hibernate,就没有那么多重复了。

顺便说一下,Ibatis 和 Hibernate 都有声明式缓存机制。当然,Hibernate 的参与度要高得多。

spring-jdbc 分享了我为 Ibatis 列出的所有缺点。另外我认为它没有缓存机制。它的主要好处是 JDBC 对象没有被很好地隐藏,因此如果需要,您可以更轻松地直接访问它们。

Spring 集成了所有三种替代方案,spring 支持不是差异化因素。

还有一件事:Hibernate 与人工键配合得很好。它可以管理复合业务密钥,但工作量更大。Ibatis 和 spring-jdbc 还不够复杂,不足以让这个问题对他们产生影响。

如果您的开发人员谨慎而彻底,并且您可以保持方法简单(例如,使用每个请求的会话,不保留从一个会话到下一个会话的任何对象,以及使用人工密钥),那么请使用 Hibernate。如果您决定不需要 Hibernate 提供的数据库抽象,或者您不信任开发人员提供的锋利工具,那么请使用 Ibatis。记住 spring-jdbc 作为后备执行需要裸机 jdbc 调整的特定查询。

顺便说一句,Grails 和 GORM 使 Hibernate 更容易进行试验,因为设置时间要少得多,Grails 从内存数据库开始,您无需编写映射文件就可以过关。

于 2011-07-07T19:34:26.487 回答
2

为了这两个目标: - 让一切尽可能简单 - 易于学习和使用

MyBatis 和 JdbcTemplate 都可以正常工作。它们都只是提供了一个高级 API 来使用 SQL 访问您的数据库。

您将使用 MyBatis 保存代码,因为它将能够完成大部分映射(从结果集到对象),并且如果您使用映射器(将方法映射到 sql 语句的动态接口),您将保存对象。

另一方面,您可能会使用 JdbcTemplate 获得最佳性能,因为手动编码映射比内省更快。

关于“最佳开发人员生产力”。Hibernate 比 MyBatis/JdbcTemplate 更有效率,但它需要更多的技能和经验,否则你的工作效率会非常低。

它们都与 Spring 3 很好地集成在一起

于 2011-07-07T19:06:43.253 回答
2

除了 ORM 之外,Hibernate 还为您提供了映射原生 SQL 查询的简便方法,而 iBatis 仅提供 SQL 映射。因此,使用 Hibernate,您有更多选择,并且可以在需要时使用 ORM 或本机 SQL。出于这个原因,我更喜欢 Hibernate。

Hibernate 绝对可以很好地与 Spring 集成。iBatis 可能也可以,但我从未使用过这样的集成。

这是我的两分钱。如果有人有不同的意见,请发布另一个答案。

于 2011-07-07T15:52:57.313 回答
0

由于没有表示层,而且听起来大部分业务规则都在持久层之外,我的建议是 Spring 的 JDBCTemplate。虽然我在使用 Hibernate 和 Spring 之前使用 ibatis 的经验远远超过了我使用 ibatis 的经验,但我提供以下建议的原因。

Hibernate - 虽然 hibernate 是一个出色的持久性框架,但它需要有经验的人才能充分利用 hibernate。一些开发人员将 hibernate 视为一个黑匣子,他们对 HQL 粗心并导致大量性能问题。由于您正在寻找一个易于理解和理解的持久层 - 我会避免这种情况。 但是,如果你不使用 hibernate,你就会失去 hibernate开箱即用的简单缓存系统。在您的数字提示中没有缓存系统很糟糕,因此我会考虑将其集成到任何其他对性能很重要的解决方案中。

Spring -Spring 的 JDBCTemplates 对于大多数人来说应该很容易理解。它不是一种新技术或框架,Spring 的目标是让事情更容易使用。由于您的需求之一是 Spring3,我假设你们团队中的大多数人已经熟悉依赖注入、行映射器和 DTO 的概念?无论您选择什么解决方案,我都会利用Spring 的事务测试工具。最后,使用 JDBCTemplates 调试性能问题比使用 hibernate 容易得多。

iBatis - 由于我对 iBatis 的经验很少,如果您的团队对该工具有积极的经验,我只会建议通过 JDBCTemplates 进行此操作。对于其他两个来说,这是一个不太受欢迎的解决方案,但它看起来确实是一个不错的中间立场。

于 2011-07-07T17:59:45.667 回答