Spring JDBC VS JDBC之间的主要区别是什么?
答案 0 :(得分:22)
让我向您展示一些使用JDBC的简单示例:
final Connection connection = ds.getConnection();
try {
final Statement statement = connection.createStatement();
try {
final ResultSet resultSet = statement.executeQuery("SELECT COUNT(*) FROM Orders");
try {
resultSet.next();
final int c = resultSet.getInt(1);
} finally {
resultSet.close();
}
} finally {
statement.close();
}
} finally {
connection.close();
}
虽然尝试使用资源时效果要好得多:
try (
Connection connection = ds.getConnection();
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT COUNT(*) FROM Orders");
) {
resultSet.next();
final int c = resultSet.getInt(1);
}
当然,您可以提取常用代码并使用模板方法设计模式。实际上,你需要重新发明JdbcTemplate
:
final int c = new JdbcTemplate(ds).queryForInt("SELECT COUNT(*) FROM Orders");
Spring JDBC也提供异常转换(不再检查SQLException
以及数据库/方言之间的差异)和简单的ORM功能。
答案 1 :(得分:2)
1。)Spring jdbc模块是jdbc技术之上的抽象层,该层避免了jdbc编程中使用的样板代码。 2.)Spring ORM模块是顶级ORM工具的抽象层。 3.)当再次使用像hibernate这样的ORM工具时,我们今年春天有一个Boiler板代码,ORM层避免了ORM工具的锅炉板代码。
答案 2 :(得分:1)
Spring框架在顶级JDBC层提供的Spring JDBC值添加
基本上,您不必担心管理和使用基础架构/管道代码,并且完全担心数据及其到对象的映射。
Spring利用模板模式隐藏所有低级细节,同时为扩展钩子提供扩展和使用JDBC。
此外,还有一个定义良好的数据库异常API,与低级JDBC API提供的异常层次结构相比,它真的对开发人员友好
答案 3 :(得分:0)
Spring JDBC?我只知道几个Spring JDBC模板。
它们允许您从Spring容器中访问JDBC功能,与普通JDBC相比,它们提供了一些额外的简化,如连接管理和异常处理。
基本上Spring很难设置,但更容易开发,所以这一切都取决于你正在处理的问题的范围。
答案 4 :(得分:0)
在我看来,JDBC与JDBCTemplate共享一些功能,但是它们可以完全不同。乍一看,我想到的主要差异是:
如果要处理大量数据,例如要在数据库中插入数百万(或数十亿)行记录,则可能要使用JDBC。在不到4分钟的时间内,我通过JDBC和MySQL语句串联将一百万行包含不同信息的行插入到数据库中。相比之下,使用JDBC模板进行同一操作可能要花费我十多分钟。
但是,如果您使用的是JDBC,则与使用JDBC模板相比,必须编写更多的代码才能使操作正确。 Tomasz Nurkiewicz通过代码说明了这一点,而Santosh Gokak提供了使用JDBC的步骤的摘要。但是,在幕后还隐含着另一件事,那就是Spring的配置,因为JDBC模板是Spring框架的一部分。如果您不熟悉Spring的XML /注释配置,事情可能会有些复杂,而JDBC尽管需要更多步骤,但在某种程度上更直观。
答案 5 :(得分:0)
您可以将自己的库用于此类JDBC任务:
附加maven依赖项:
<dependency>
<groupId>com.github.buckelieg</groupId>
<artifactId>db-fn</artifactId>
<version>0.3.8</version>
</dependency>
然后在代码中使用:
DB db = new DB(ds::getConnection);
int result = db.select("SELECT COUNT(*) FROM Orders").single(rs -> rs.getInt(1)).orElse(0);
查看更多here