由于两者都用于与数据库交互,因此它们用于相同的目的。请详细解释。
xmakbtuz1#
Hibernate是在JDBC之上编写的许多框架之一,旨在使您的应用程序更容易使用JDBC与数据库交换数据。
JDBC是将Java应用程序连接到关系数据库的标准方式。
String
您可以直接从自己的Java代码中调用JDBC命令。很多人都这样做。
但是,编写SQL代码和检索结果可能会导致冗长的编码。许多人编写了许多Java框架来帮助生成嵌入式SQL代码和检索结果。这些框架是在JDBC之上编写的,代表您进行JDBC调用。很多人使用这些。其中一些框架实现了标准中定义的接口。Jakarta Persistence,以前称为 Java Persistence API(JPA),是一个非常流行的标准。请参见specification。另一个这样的标准是Java Data Objects (JDO)。Hibernate是 Jakarta Persistence 规范的实现。其他实现包括EclipseLink、OpenJPA等。请参见What is a JPA implementation?。请注意,这些实现可能会提供超出标准要求的功能。请注意,所有这些框架,包括Hibernate,都使用JDBC。您必须提供特定于特定数据库引擎的JDBC driver,以便使用这些框架,如Hibernate。其他框架已经在 Jakarta Persistence 标准之外产生。有些是非常流行的,如Jdbi,JOOQ,MyBatis和Spring Data。我们有database migration工具也使用JDBC,如Flyway和Liquibase。
wlp8pajw2#
JDBC和Hibernate都是为了同一个目的而使用的,都是为了与数据库进行交互,但是,它们都有自己的方法与数据库进行交互,另外,它们都有自己的概念我们先来谈谈ORM:对象关系Map(ORM)是一种通过将对象状态Map到数据库列来开发和维护对象与关系数据库之间的关系的功能。它能够轻松地处理各种数据库操作,如插入,更新,删除等。ORM框架以下是ORM机制上的各种框架:-
java.sql包含JDBC API的类和接口,如下所示:1.驱动器接口1.连接接口1.对帐单接口
bq3bfh9z3#
问题不是要么-要么,而是选项是
选择取决于数据库在应用程序中的位置。如果应用程序只考虑数据库的持久性,或者它甚至不关心RDBM使用了什么,你通常会选择一些ORM工具。通常有一种观点认为,使用ORM可以牺牲一些灵活性和控制,而不是需要更少的代码。这方面 * 和后果 * 在下面插入和选择数据的示例场景中进行了说明。在 pure SQL 中,
RDBM
insert into customer(cu_first_name,cu_last_name) values ('Mike Y.','Batis'); insert into customer(cu_first_name,cu_last_name) values ('Henry','Iber-Nate'); insert into customer(cu_first_name,cu_last_name) values ('John D.','Beece'); commit; select * from customer;
在代码片段中,我使用Groovy来使代码更加紧凑,并集中于差异。所有脚本都设置了连接并定义了数据:
def data = [ [first : 'Mike Y.', last : 'Batis'], [first : 'Henry', last : 'Iber-Nate'], [first : 'John D.', last : 'Beace'], ]
普通JDBC
def stmt = con.prepareStatement("insert into customer (cu_first_name,cu_last_name) values (?,?)") data.each { stmt.setString(1,it.first) stmt.setString(2,it.last) stmt.executeUpdate() } con.commit() stmt.close() stmt = con.prepareStatement("""select cu_id, cu_first_name, cu_last_name from customer where cu_id between ? and ?""") stmt.setInt(1,1) stmt.setInt(2,3) def rs = stmt.executeQuery() while(rs.next()) { println "cu_id= ${rs.getInt(1)} fname= ${rs.getString(2)} lname= ${rs.getString(3)}" } rs.close() stmt.close()
JDBC模板
String insertQuery = "insert into customer (cu_first_name,cu_last_name) values (?,?)"; data.each { jdbcTemplate.update(insertQuery, it.first, it.last); } def sql = """select cu_id, cu_first_name, cu_last_name from customer where cu_id between ? and ?""" def list = jdbcTemplate.queryForList(sql, 1, 3); println list
休眠
Session session = sessionFactory.getCurrentSession() session.beginTransaction(); data.each { Customer cu = new Customer(fname: it.first, lname: it.last) session.save(cu); } List result = session.createQuery("from Customer where cu_id between :from and :to") .setParameter("from", 1) .setParameter("to", 3) .list() result.each {println "selecting Customer id: ${it.id} fname: ${it.fname} lname: ${it.lname}"}
摘要
使用普通的JDBC,你有一个完全的控制,但你需要关心一切,单独设置绑定变量,关闭结果集和语句。在JDBCTemplate中,您仍然使用相同的SQL,但开销要小得多,并且资源会自动关闭。在Hibernate中,你根本不需要写INSERT,SELECT可能以from开头-你不需要关心列。(请注意,其他选项native query和criteria query也可用)后台发生的事情取决于数据库-我在这里讨论的是Oracle RDBMS。JDBC代码导致INSERT语句的一个 parse 被执行了 * 三 * 次,然后 * 关闭了 *。在JDBCTemplate和Hibernate中,INSERT语句被解析、执行和关闭 * 三次 *。这同样适用于SELECT语句。这听起来像是一个很大的性能差异,但是(至少在Oracle中)关闭的游标通常保持缓存状态,因此下一次解析可以非常有效地完成。(aka soft parse)
JDBC
JDBCTemplate
Hibernate
INSERT
SELECT
from
Oracle
3条答案
按热度按时间xmakbtuz1#
tl;dr
Hibernate是在JDBC之上编写的许多框架之一,旨在使您的应用程序更容易使用JDBC与数据库交换数据。
JDBC
JDBC是将Java应用程序连接到关系数据库的标准方式。
String
对象中的文本编写。JDBC将该命令传递给数据库。您可以直接从自己的Java代码中调用JDBC命令。很多人都这样做。
基于JDBC构建框架
但是,编写SQL代码和检索结果可能会导致冗长的编码。许多人编写了许多Java框架来帮助生成嵌入式SQL代码和检索结果。这些框架是在JDBC之上编写的,代表您进行JDBC调用。很多人使用这些。
其中一些框架实现了标准中定义的接口。Jakarta Persistence,以前称为 Java Persistence API(JPA),是一个非常流行的标准。请参见specification。另一个这样的标准是Java Data Objects (JDO)。
Hibernate是 Jakarta Persistence 规范的实现。其他实现包括EclipseLink、OpenJPA等。请参见What is a JPA implementation?。请注意,这些实现可能会提供超出标准要求的功能。
请注意,所有这些框架,包括Hibernate,都使用JDBC。您必须提供特定于特定数据库引擎的JDBC driver,以便使用这些框架,如Hibernate。
其他框架已经在 Jakarta Persistence 标准之外产生。有些是非常流行的,如Jdbi,JOOQ,MyBatis和Spring Data。
我们有database migration工具也使用JDBC,如Flyway和Liquibase。
wlp8pajw2#
JDBC和Hibernate都是为了同一个目的而使用的,都是为了与数据库进行交互,但是,它们都有自己的方法与数据库进行交互,另外,它们都有自己的概念
我们先来谈谈ORM:
对象关系Map(ORM)是一种通过将对象状态Map到数据库列来开发和维护对象与关系数据库之间的关系的功能。它能够轻松地处理各种数据库操作,如插入,更新,删除等。
ORM框架以下是ORM机制上的各种框架:-
什么是JDBC?JDBC允许程序与数据库进行交互,API允许从Java程序中执行SQL语句,JDBC API允许从数据库中更新、插入、删除或获取数据,简而言之,我们称之为CRUD(创建、读取、更新和删除)
java.sql包含JDBC API的类和接口,如下所示:
1.驱动器接口
1.连接接口
1.对帐单接口
1.行集接口
要了解这些类和接口中的每一个,我建议您阅读Graham、汉密尔顿Rick Cattell和Maydene Fisher合著的《JDBC Access with Java》一书
bq3bfh9z3#
问题不是要么-要么,而是选项是
选择取决于数据库在应用程序中的位置。
如果应用程序只考虑数据库的持久性,或者它甚至不关心
RDBM
使用了什么,你通常会选择一些ORM工具。通常有一种观点认为,使用ORM可以牺牲一些灵活性和控制,而不是需要更少的代码。
这方面 * 和后果 * 在下面插入和选择数据的示例场景中进行了说明。
在 pure SQL 中,
在代码片段中,我使用Groovy来使代码更加紧凑,并集中于差异。
所有脚本都设置了连接并定义了数据:
普通JDBC
JDBC模板
休眠
摘要
使用普通的
JDBC
,你有一个完全的控制,但你需要关心一切,单独设置绑定变量,关闭结果集和语句。在
JDBCTemplate
中,您仍然使用相同的SQL,但开销要小得多,并且资源会自动关闭。在
Hibernate
中,你根本不需要写INSERT
,SELECT
可能以from
开头-你不需要关心列。(请注意,其他选项native query和criteria query也可用)后台发生的事情取决于数据库-我在这里讨论的是
Oracle
RDBMS。JDBC代码导致
INSERT
语句的一个 parse 被执行了 * 三 * 次,然后 * 关闭了 *。在JDBCTemplate和Hibernate中,
INSERT
语句被解析、执行和关闭 * 三次 *。这同样适用于
SELECT
语句。这听起来像是一个很大的性能差异,但是(至少在Oracle中)关闭的游标通常保持缓存状态,因此下一次解析可以非常有效地完成。(aka soft parse)