取得领先
VMware 提供培训和认证,以加速您的进步。
了解更多欢迎来到新的一期 你可能不需要另一个库 (YMNNALFT)! 自 2016 年以来,我花了很多时间在 我的 Spring Tips 视频 中阐明(或者尝试阐明!)Spring 生态系统中一些更巨大的机会。 然而,今天,我以不同的精神来到你身边,希望专注于那些小而有时隐藏的瑰宝,它们可以做一些了不起的事情,并且可能会让你免于额外的第三方依赖及其隐含的复杂性。
我认为我第一次使用 Spring,早在 15 年前,是 JdbcTemplate
,它消除了直接使用 JDBC 令人瞠目结舌且冗长的工作。 你可能知道,JDBC 代表“Just Don't Break, Compiler!”(别坏,编译器!),它旨在通过提供一个 API 来测试 JVM 中每个方法 65535 字节字节码的限制,该 API 始终需要比这更多的代码行才能做基本的事情。
因此,现在宣布。 我被告知 JDBC 实际上是 Java 数据库连接 API。 继续...
当时我无法将 Spring 用作项目中的框架,但我可以将 Spring 作为一种库引入。 最初我引入它是为了访问 JdbcTemplate
,以及各种 *Template
对象作为一个整体的概念。
模板对象是控制反转原则的一个很好的例子。 你让模板对象完成 90% 的工作,并为其提供一个回调,以便在模板需要你对某些事情的输入时调用。 模板反转了应用程序流程; 它们做一些繁琐的事情,然后仅在需要做你想做的事情时才让你参与。 它们有点像迷你框架。
JdbcTemplate
是 Java 生态系统中最著名的模板之一,这是有充分理由的。 JDBC 是 Java 生态系统中用于处理 SQL 数据库的低级 API。 它功能强大,并且已经统治了数十年。 但归根结底,它是非常低级的。 你自己编写这段代码走不了多远。
当时的替代方案是脆弱的技术,例如 Hibernate、Apache OJB、任何各种轻微不兼容的 JDO 实现、iBatis,或者 - 天啊! - EJB 1.x 或 2.x 持久实体 bean。 其中大多数对我试图做的工作来说太重了。 我喜欢 iBatis(并且继续喜欢它的 继任者 MyBatis),但我发现仅使用 JdbcTemplate
就可以走得很远。
JdbcTemplate
是一个丰富的类安排和各种用于处理 SQL 数据库的抽象的一部分。 如今,Spring 开发人员甚至可以使用 JDBC 的非阻塞、响应式替代方案:R2DBC。 唉,今天大多数数据访问逻辑都使用 JDBC(如果不是直接使用,则间接使用),所以让我们看看一个例子。
在 Spring Initializr 上的 JDBC - org.springframework.boot
: spring-boot-starter-jdbc
在 Spring Initializr 上的 H2 - com.h2database
: h2
这是代码
package bootiful.data;
import lombok.SneakyThrows;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.util.FileCopyUtils;
import javax.sql.DataSource;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.List;
@SpringBootApplication
public class BootifulApplication {
public static void main(String[] args) {
SpringApplication.run(BootifulApplication.class, args);
}
@Bean
DataSource dataSource() {
return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build();
}
@SneakyThrows
private String loadSql() {
Resource resource = new ClassPathResource("/initialization.sql");
try (Reader r = new InputStreamReader(resource.getInputStream())) {
return FileCopyUtils.copyToString(r);
}
}
@Bean
ApplicationListener<ApplicationReadyEvent> ready(DataSource dataSource) {
return event -> {
String sql = loadSql();
String[] names = new String[] { "Spencer", "Violetta", "Madhura", "Yuxin", "Stéphane", "Dr. Syer" };
JdbcTemplate template = new JdbcTemplate(dataSource);
template.execute(sql);
for (var name : names) {
template.update("insert into CUSTOMER(name) values(?)", name);
}
List<Customer> results = template.query("select * from CUSTOMER",
(resultSet, i) -> new Customer(resultSet.getInt("id"), resultSet.getString("name")));
results.forEach(System.out::println);
};
}
}
如果您不介意卷起袖子并使用一些 SQL(为什么会介意?SQL 是真棒!),那么您会感觉在使用 JDBC 模块中的 JdbcTemplate
和各种命令类时就像在家里一样。 如果没有,Spring 会继续在您今天使用 JOOQ、Hibernate、JPA、MyBatis、Spring Data JPA、Spring Data JDBC 等以 JDBC 为中心的数据访问技术的丰富集成来满足您的需求,还有很多其他选择。
你喜欢这种一览即见的宝石方法吗? 你学到什么了吗? 和往常一样,我很想听到你的消息,所以 请在 Twitter 上发表意见 (@starbuxman) ! 我将带着另一期 YMNNALFT 回来,所以一定要不错过。