JDBC 和 Hibernate 用于相同目的?
JDBC and Hibernate used for same purpose?
因为两者都用于与数据库交互,所以它们是否用于相同的目的。请详细说明。
JDBC 和Hibernate的用途是一样的,就是和数据库交互,但是,每个人都有自己的数据库交互方式,另外,每个人都有自己的概念
先说ORM:
对象关系映射 (ORM) 是一种功能,用于通过将对象状态映射到数据库列来开发和维护对象与关系数据库之间的关系。能够轻松处理各种数据库操作,如插入、更新、删除等
ORM 框架
以下是在ORM机制上运行的各种框架:-
- 休眠
- 顶联
- ORMLite
- iBATIS
- 水痘
什么是JDBC?
JDBC允许程序与数据库交互,API允许从java程序执行SQL语句,JDBCAPI允许是否从数据库中更新、插入、删除或获取数据,简而言之,我们调用了 CRUD(创建、读取、更新和删除)
java.sql 包含 类 和 JDBC API 的接口,如下所示:
- 驱动界面
- 连接界面
- 声明界面
- PreparedStatement 接口
- CallableStatement 接口
- 结果集接口
- ResultSetMetaData 接口
- 数据库元数据接口
- 行集接口
要发现这些 类 和界面中的每一个,我建议阅读一本名为 JDBC Access with Java 的书,作者是 Graham、Hamilton Rick Cattell 和 Maydene Fisher
tl;博士
Hibernate 是在 JDBC 之上编写的众多框架之一,旨在让您的应用使用 JDBC 更轻松地与数据库交换数据。
JDBC
JDBC 是将 Java 应用程序连接到关系数据库的标准方法。
- 您将 SQL 命令作为文本写入 Java
String
对象中。 JDBC 将该命令传送到数据库。
- 数据库报告的任何错误都被 JDBC 包装为对象并返回到您的 Java 应用程序。
- 如果您的 SQL 在数据库中成功运行,JDBC 从数据库中检索结果,并将该数据作为结果集提供给您的 Java 应用程序。
您可以直接从您自己的 Java 代码中调用 JDBC 命令。很多人都这样做。
构建在 JDBC
之上的框架
但是,编写 SQL 代码并检索结果会使编码变得乏味。许多 Java 框架由不同的人编写,以帮助生成嵌入式 SQL 代码和检索结果。这些框架是在 JDBC 之上编写的,代表您进行 JDBC 调用。很多人用这些。
其中一些框架实现了标准中定义的接口。 Jakarta Persistence, formerly known as Java Persistence API (JPA), is a quite popular standard. See specification. Another such standard is Java Data Objects (JDO).
Hibernate is an implementation of Jakarta Persistence. Other implementations include EclipseLink, OpenJPA, and more. See What is a JPA implementation?。请注意,这些实现可能会提供超出标准要求的功能。
请注意,所有这些框架,包括 Hibernate,都在使用 JDBC。您必须提供特定于您的特定数据库引擎的 JDBC driver 才能使用这些框架,例如 Hibernate。
在标准之外还产生了其他框架。有的比较流行,比如JOOQ, MyBatis, and Spring Data.
我们有 database migration tools that also use JDBC, such as Flyway and Liquibase.
问题不是或者,而是选项
- 使用JDBC
- 使用 ORM 工具,例如隐藏在 JDBC 中的 Hibernate
选择取决于数据库在应用程序中的位置。
如果申请
将数据库视为仅 persistence 或者如果它甚至不关心 what RDBM
is used you typically choose
一些 ORM 工具。
通常有一种观点认为,使用 ORM 可以换取一些灵活性和控制,而不是需要更少的代码。
这方面及其后果在下面的插入和选择数据示例场景示例中进行了说明。
在纯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
中你根本不需要写 INSERT
并且 SELECT
可能以 from
开头 - 你不需要关心列。 (请注意,其他选项 native query and criteria query 也可用)
幕后发生的事情取决于数据库 - 我在这里讨论 Oracle
RDBMS。
JDBC 代码导致 parse 的 INSERT
语句被执行 three 次并且比 关闭.
在 JDBCTemplate 和 Hibernate 中,INSERT
语句被解析、执行和关闭 3 次。
同样适用于SELECT
语句。
这听起来像是一个很大的性能差异,但是(至少在 Oracle 中)关闭的游标通常保持缓存状态,因此下一次解析可以非常有效地完成。 (又名 软解析)
因为两者都用于与数据库交互,所以它们是否用于相同的目的。请详细说明。
JDBC 和Hibernate的用途是一样的,就是和数据库交互,但是,每个人都有自己的数据库交互方式,另外,每个人都有自己的概念
先说ORM:
对象关系映射 (ORM) 是一种功能,用于通过将对象状态映射到数据库列来开发和维护对象与关系数据库之间的关系。能够轻松处理各种数据库操作,如插入、更新、删除等
ORM 框架 以下是在ORM机制上运行的各种框架:-
- 休眠
- 顶联
- ORMLite
- iBATIS
- 水痘
什么是JDBC? JDBC允许程序与数据库交互,API允许从java程序执行SQL语句,JDBCAPI允许是否从数据库中更新、插入、删除或获取数据,简而言之,我们调用了 CRUD(创建、读取、更新和删除)
java.sql 包含 类 和 JDBC API 的接口,如下所示:
- 驱动界面
- 连接界面
- 声明界面
- PreparedStatement 接口
- CallableStatement 接口
- 结果集接口
- ResultSetMetaData 接口
- 数据库元数据接口
- 行集接口
要发现这些 类 和界面中的每一个,我建议阅读一本名为 JDBC Access with Java 的书,作者是 Graham、Hamilton Rick Cattell 和 Maydene Fisher
tl;博士
Hibernate 是在 JDBC 之上编写的众多框架之一,旨在让您的应用使用 JDBC 更轻松地与数据库交换数据。
JDBC
JDBC 是将 Java 应用程序连接到关系数据库的标准方法。
- 您将 SQL 命令作为文本写入 Java
String
对象中。 JDBC 将该命令传送到数据库。 - 数据库报告的任何错误都被 JDBC 包装为对象并返回到您的 Java 应用程序。
- 如果您的 SQL 在数据库中成功运行,JDBC 从数据库中检索结果,并将该数据作为结果集提供给您的 Java 应用程序。
您可以直接从您自己的 Java 代码中调用 JDBC 命令。很多人都这样做。
构建在 JDBC
之上的框架但是,编写 SQL 代码并检索结果会使编码变得乏味。许多 Java 框架由不同的人编写,以帮助生成嵌入式 SQL 代码和检索结果。这些框架是在 JDBC 之上编写的,代表您进行 JDBC 调用。很多人用这些。
其中一些框架实现了标准中定义的接口。 Jakarta Persistence, formerly known as Java Persistence API (JPA), is a quite popular standard. See specification. Another such standard is Java Data Objects (JDO).
Hibernate is an implementation of Jakarta Persistence. Other implementations include EclipseLink, OpenJPA, and more. See What is a JPA implementation?。请注意,这些实现可能会提供超出标准要求的功能。
请注意,所有这些框架,包括 Hibernate,都在使用 JDBC。您必须提供特定于您的特定数据库引擎的 JDBC driver 才能使用这些框架,例如 Hibernate。
在标准之外还产生了其他框架。有的比较流行,比如JOOQ, MyBatis, and Spring Data.
我们有 database migration tools that also use JDBC, such as Flyway and Liquibase.
问题不是或者,而是选项
- 使用JDBC
- 使用 ORM 工具,例如隐藏在 JDBC 中的 Hibernate
选择取决于数据库在应用程序中的位置。
如果申请
将数据库视为仅 persistence 或者如果它甚至不关心 what RDBM
is used you typically choose
一些 ORM 工具。
通常有一种观点认为,使用 ORM 可以换取一些灵活性和控制,而不是需要更少的代码。
这方面及其后果在下面的插入和选择数据示例场景示例中进行了说明。
在纯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
中你根本不需要写 INSERT
并且 SELECT
可能以 from
开头 - 你不需要关心列。 (请注意,其他选项 native query and criteria query 也可用)
幕后发生的事情取决于数据库 - 我在这里讨论 Oracle
RDBMS。
JDBC 代码导致 parse 的 INSERT
语句被执行 three 次并且比 关闭.
在 JDBCTemplate 和 Hibernate 中,INSERT
语句被解析、执行和关闭 3 次。
同样适用于SELECT
语句。
这听起来像是一个很大的性能差异,但是(至少在 Oracle 中)关闭的游标通常保持缓存状态,因此下一次解析可以非常有效地完成。 (又名 软解析)