JDBC和Hibernate的用途相同吗?

bkhjykvo  于 2023-10-23  发布在  其他
关注(0)|答案(3)|浏览(186)

由于两者都用于与数据库交互,因此它们用于相同的目的。请详细解释。

xmakbtuz

xmakbtuz1#

tl;dr

Hibernate是在JDBC之上编写的许多框架之一,旨在使您的应用程序更容易使用JDBC与数据库交换数据。

JDBC

JDBC是将Java应用程序连接到关系数据库的标准方式。

  • 您可以将SQL命令作为Java String对象中的文本编写。JDBC将该命令传递给数据库。
  • 数据库报告的任何错误都被JDBC Package 为对象,并返回到Java应用程序。
  • 如果SQL在数据库中成功运行,JDBC将从数据库中检索结果,并将该数据作为结果集提供给Java应用程序。

您可以直接从自己的Java代码中调用JDBC命令。很多人都这样做。

基于JDBC构建框架

但是,编写SQL代码和检索结果可能会导致冗长的编码。许多人编写了许多Java框架来帮助生成嵌入式SQL代码和检索结果。这些框架是在JDBC之上编写的,代表您进行JDBC调用。很多人使用这些。
其中一些框架实现了标准中定义的接口。Jakarta Persistence,以前称为 Java Persistence API(JPA),是一个非常流行的标准。请参见specification。另一个这样的标准是Java Data Objects (JDO)
HibernateJakarta Persistence 规范的实现。其他实现包括EclipseLinkOpenJPA等。请参见What is a JPA implementation?。请注意,这些实现可能会提供超出标准要求的功能。
请注意,所有这些框架,包括Hibernate,都使用JDBC。您必须提供特定于特定数据库引擎的JDBC driver,以便使用这些框架,如Hibernate。
其他框架已经在 Jakarta Persistence 标准之外产生。有些是非常流行的,如JdbiJOOQMyBatisSpring Data
我们有database migration工具也使用JDBC,如FlywayLiquibase

wlp8pajw

wlp8pajw2#

JDBC和Hibernate都是为了同一个目的而使用的,都是为了与数据库进行交互,但是,它们都有自己的方法与数据库进行交互,另外,它们都有自己的概念
我们先来谈谈ORM:
对象关系Map(ORM)是一种通过将对象状态Map到数据库列来开发和维护对象与关系数据库之间的关系的功能。它能够轻松地处理各种数据库操作,如插入,更新,删除等。
ORM框架以下是ORM机制上的各种框架:-

  1. Hibernate
  2. TopLink
  3. ORMLite
  4. iBatis
  5. JPOX
    什么是JDBC?JDBC允许程序与数据库进行交互,API允许从Java程序中执行SQL语句,JDBC API允许从数据库中更新、插入、删除或获取数据,简而言之,我们称之为CRUD(创建、读取、更新和删除)

java.sql包含JDBC API的类和接口,如下所示:
1.驱动器接口
1.连接接口
1.对帐单接口

  1. PreparedStatement接口
  2. CallableStatement接口
  3. ResultSet接口
  4. ResultSetMetaData接口
  5. DatabaseMetaData接口
    1.行集接口
    要了解这些类和接口中的每一个,我建议您阅读Graham、汉密尔顿Rick Cattell和Maydene Fisher合著的《JDBC Access with Java》一书
bq3bfh9z

bq3bfh9z3#

问题不是要么-要么,而是选项是

  • 使用JDBC
  • 使用ORM工具,如Hibernate,使用JDBC的封面下

选择取决于数据库在应用程序中的位置。
如果应用程序只考虑数据库的持久性,或者它甚至不关心RDBM使用了什么,你通常会选择一些ORM工具。
通常有一种观点认为,使用ORM可以牺牲一些灵活性和控制,而不是需要更少的代码。
这方面 * 和后果 * 在下面插入和选择数据的示例场景中进行了说明。
pure SQL 中,

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中,你根本不需要写INSERTSELECT可能以from开头-你不需要关心列。(请注意,其他选项native querycriteria query也可用)
后台发生的事情取决于数据库-我在这里讨论的是Oracle RDBMS。
JDBC代码导致INSERT语句的一个 parse 被执行了 * 三 * 次,然后 * 关闭了 *。
在JDBCTemplate和Hibernate中,INSERT语句被解析、执行和关闭 * 三次 *。
这同样适用于SELECT语句。
这听起来像是一个很大的性能差异,但是(至少在Oracle中)关闭的游标通常保持缓存状态,因此下一次解析可以非常有效地完成。(aka soft parse

相关问题