当前位置: 首页 > 网络应用技术

放弃Mybatis和JPA,我终于选择了JDBC模板!

时间:2023-03-06 13:17:00 网络应用技术

  因为项目需要选择数据持续性框架,请查看主要的流行和非广泛框架。对于复杂的业务系统,最后的结论是JOOQ通常是最好的。不幸的是,它不是完全免费的。最后,选择JDBC模板sessessence

  Hibernate和Mybatis是两个主流框架,而Jooq和Ebean等小众框架不认识很多人,但它们也具有许多独特的优势。这是JPA存储库的实现。它与Hibernate,Mybatis和Jooq之类的框架没有相同的水平。但是,在介绍了诸如Spring Data JPA之类的框架之后,我们将直接使用JPA API查询更新数据库,就像我们使用mybatis使用Mybatisso一样,此处也将JPA与其他框架进行比较。

  同样,JDBC和其他框架处于同一级别,位于所有持久框架的底部,但有时我们也直接在项目中使用JDBC,而Spring JDBC模板部分消除了使用JDBC的乏味的细节,从而减少了JDBC的细节使用成本,因此Sowe更愿意直接在项目中使用JDBC。

  使用Hibernate时,我们会查询POJO实体类,而不是数据库表,例如HQL语句从用户中选择计数(*)。用户是Java类,而不是数据库表用户。这与ORM的初始理想相符。ORM认为Java程序员使用OO思维方法,并且关系数据库之间的思维方式很大。为了填补对象和关系思维方法的空白,有必要对对象进行映射到关系,然后在Java的对象世界中,程序员可以使用纯思维的对象,查询POJO对象,查询POJO对象,查询该对象条件是对象属性,不再需要具有表与字段之间关系的概念。

  JPA可以被视为冬眠的儿子,并继承了这个想法,完全封装了SQL,因此Java程序员看不到关系的概念,并使用了面向对象的纯粹的想法来重新创建一种新的查询语言,而不是SQL,而不是SQL,而不是例如HQland JPQL等。SupportJPA框架,例如Ebean属于这种类型的框架。

  但是,使用另一种面向对象的查询语言而不是SQL包装SQL,它真的可以使程序员更容易实现长期持久的操作吗?Mybatis的受欢迎程度证明并非如此。至少在大多数情况下,HQL并不比使用SQL.Fir.Fir.fir.fir.fir.fir.fir.fir.fir.fir.fir.fir.fir. hql/jpql等语言更为复杂且难以理解。其次,性能大大降低,速度较慢,内存占据巨大,并且不容易优化。最令人讨厌的事情是,当关系概念被对象的概念替换时,查询的灵活性语言变得贫穷,表达能力比SQL弱得多。当撰写查询语句时,它受到各种限制。一个典型的示例是多表可行的查询。

  无论是冬眠还是JPA,表之间的连接查询,物理类之间的关系都映射了。这样,如果两个实体类之间没有(实现)关系,则可以)加入到查询。这是一件非常烦人的事情,因为我们通常不需要明确定义两个物理类之间的关系实现业务逻辑。如果您使用HQL,只是为了加入,我们必须在两个物理类之间添加编码,并且不可能扭转项目。如果表中没有对外部密钥约束的定义,则反向工程将删除我们添加的相关代码。

  Mybatis是另一种持久框架。它不会打包SQL或创建新的面对象查询语言,而是直接使用SQL作为查询语言,而仅将结果填充到POJO对象中。SQL并不比HQL和JPQL难。查询速度更快。只要数据库支持,您就可以灵活地使用任何复杂的查询。从SQL包装的角度来看,Mybatis比Hibernate和JPA成功。不应将SQL封装并隐藏,以便Java程序员使用SQL学习和入门。这应该是Mybatis的重要原因。

  轻巧耐用的层框架JOOQ也与Mybatis相同。它直接使用SQL作为查询语言。与Mybatis相比,尽管JOOQ的受欢迎程度要低得多,但JOOQ可以使用SQL的灵活性和效率,因为Mybatis.jOOQ也可以使用Java代码来编写SQL语句,使用IDE代码来自动弥补功能,以自动构成功能,自动提示表名和字段名称,减少程序员的内存负担,并在元数据期间编译错误。

  Ebean作为基于JPA的框架,还使用JPQL语言来查询,在大多数情况下,令人讨厌的情况。但是,据说Ebean不排除SQL。您可以使用SQL直接查询,也可以使用JOOQ DSL方法在代码(或JPQL语句?)中构造SQL语句,但是您尚未使用EBEAN,因此特定的详细信息尚不清楚。

  不用说,JDBC模板,它根本没有做ORM,当然,纯SQL查询。使用弹簧框架,您可以将JDBC模板和JPA组合在JPA不容易查询的地方使用JDBC,或者使用JDBC。效率没有得到优化,这减轻了Hibernate/JPA包装SQL造成的麻烦,但我仍然没有看过。

  为了实现复杂的业务逻辑,无论是使用SQL或HQL还是JPQL,我们都必须编写许多简单或复杂的查询句子。ORM无法减少工作的这一部分。如前所述,以对象为导向的语言不一定比SQL容易。通常,业务系统中有许多表。每个表都有许多字段。功能等。写作查询语句通常会成为头痛。

  QueryDSL,JOOQ,EBEAN,甚至Mybatis和JPA都设计了一些功能来帮助开发人员编写查询句子。有人称其为“ DSL样式数据库编程”。这种函数的最早实现可能是queryDSL。数据库的表面结构用于Java类,然后Java程序员可以使用Java的语法构造复杂的查询语句,并使用IDE代码来完成函数。您可以自动提示表名称,字段,字段,字段,字段名称,查询语句的关键字等,成功简化了查询语句的写作,消除了程序员记忆的负担,对各种名称,函数和关键字。

  QueryDSL有很多版本,但是更多的QueryDSL JPA可以帮助开发人员编写JPQL语句。如前所述,正如JPQL语句中提到的SQL灵活和高效的许多限制。LaterJooq和Ebean基本上继承了QueryDSL的思想。Ebean基本上是JPA式ORM框架。尽管它也支持SQL,但尚不清楚其DSL特性是否支持SQL语句写作。在官方网站上看到的示例都是官方网站的所有示例,都是所有示例。用于构建JPQL语句。

  最成功的是Jooq。与QueryDSL不同,JOOQ的DSL编程是帮助开发人员编写SQL语句,放弃ORM的负担概念。Jooq的功能非常小,非常容易学习和使用,并且性能非常好。不像QueryDSL和Ebean,您需要了解复杂的JPA概念和各种奇怪的限制。JOOQ写了普通的SQL语句,但仅将查询结果填充到物理类中(严格来说,JOOQ没有物理类,但是自动生成的记录对象),JOOQ甚至不需要将结果转换为物理类,哪个类别可以允许开发人员根据字段获得结果的值。与JDBC相比,JOOQ将将结果值转换为合适的Java类型,该类型比JDBC更易于使用。

  传统的主流框架几乎没有支持DSL样式,并且在Hibernate中基本没有特征。Mybatis提供了“ SQL语句构造器”,以帮助开发人员构建SQL语句,但比QueryDSL/JOOQ/EBEAN差得多。不能提示它指示名称和字段名称。语法不像SQL。

  JPA的印象很复杂且难以理解。它的元模型API继承了特征。Metamodel API+标准API,并且使用Hibernate JPA 2 MetAmodel发电机,感觉有点QueryDSL JPA。技术层最终意识到了简单而简单的QueryDSL JPA JPA。+querydsl。取而代之的是,建议JPA MetAmodel API+标准API+Hibernate JPA 2 MetAmodel Generator的用法很难理解,也许是因为该解决方案是纯标准JPA解决方案。

  数据库DSL编程的另一个主要卖点是适应性很强。数据库表结构通常在开发过程中经常变化。传统的非DSL编程。字段名称只是一个字符串。如果字段名称或类型更改,则查询语句无关的修改,编译将不会出错,并且很容易被开发人员忽略。它是错误的主要来源。在DSL编程中,该字段被Java属性逆转。在数据库结构更改之后,将汇总查询语句作为Java代码的一部分。提示它修改开发人员,这可以减少大量错误,减轻测试负担,增加软件的软件可靠性和质量。

  Hibernate和JPA使用与中间语言描述查询无关的HQL和JPQL数据库。它们可以在不同的数据库中无缝移植。在SQL上种植具有巨大差异的数据库通常不需要修改代码或仅需要小型代码。如果Ebean不使用本机SQL,并且由JPA开发,那么它也可以在不同的数据库中平稳地移植。

  Mybatis和Jooq直接使用SQL,在跨数据库移植时不可避免地使用SQL语句。在这方面,Mybatis相对较差,只有一个由动态SQL提供的特征。为不同的数据库汇编编写了不同的SQL语句。

  尽管Jooq不能像Hibernate和JPA那样被移植,但它比Mybatis好得多。Jooq的DSL很大一部分很常见。例如,在分页查询中,mySQL的限制/偏置关键字是一个非常方便的描述方法,但是Oracle和SQLServer的SQL不支持它。SQL语句,不修改Oracle和SQLServer不支持限制/offset的Oracle和SQLServer,我们会发现这些语句可以正常使用,因为JOOQ会将限制/偏移转换为等效目标数据库的SQL语句。JOOQ根据目标数据库转换SQL语句的特征,以便在移植不同数据库时,只需要修改一个小的代码,这比Mybatis好得多。

  JDBC模板应该是最糟糕的,并且只能使用标准SQL语句减少移植工作负载。

  一般而言,缝线查询陈述将具有隐藏的安全危害,并很容易被SQL注入攻击。无论是JDBC还是HQL/JPQL,只要拼接查询语句不安全。对于缝合可以解决问题。JPA应使用标准API来解决此问题。

  对于DSL式框架(例如JOOQ),它最终将重新恢复到参数化的SQL中,并将天然免疫SQL注入攻击中。EBEAN还支持DSL编程,并免疫SQL注入攻击。

  这是因为DSL式编程参数查询更容易查询。没有人会缝合字符串。

  大多数人可能不同意。尽管Hibernate和JPA仍然很受欢迎,并且是最主流的持久性框架,但实际上,该包装SQL的纯粹ORM已过时,其好处低于使用它们的成本,应消除它们。尽管Merbatis具有许多优势,它的优势基本上是可用的,其中大多数都更好。MyBatis最大的缺点是很难避免编写XML文件。XML文件很难编写,很容易犯错,并且发现错误并不容易。

  Ebean具有许多不同框架的优势,但它基于JPA。不可避免地,对JPA有各种限制。这是致命的劣势。

  Jooq是一个极端轻巧的框架,是最完美的。突然有一天,一些网络系统同时崩溃了,最后发现JOOQ试验期已经到期。对于开源数据库(例如MySQL),这是JOOQ.的失败。

  最后,我决定选择JDBC模板。

  作者:舍尔曼

  资料来源:https://sementfault.com/a/1190000018472572