領先一步
VMware 提供培訓和認證,以加速您的進展。
了解更多歡迎來到另一期的您可能不需要另一個函式庫 (YMNNALFT)!自 2016 年以來,我花了很多時間在 我的 Spring Tips 影片 中闡明(或試圖闡明!)Spring 生態系統中一些更龐大的機會。然而,今天,我以不同的精神來到這裡,希望專注於那些做著奇妙事情的小而有時隱藏的瑰寶,它們可能會讓您免於額外的第三方依賴及其隱含的複雜性。
我認為我對 Spring 的第一個用途,是在 15 年多前,是 JdbcTemplate
,它消除了直接使用 JDBC 時令人咋舌且冗長的工作。 您可能知道,JDBC 代表 "Just Don't Break, Compiler!",它的設計目的是通過提供一個始終需要比更多程式碼行才能做基本事情的 API,來測試 JVM 方法中每個方法 65535 位元組的位元組碼限制。
最新消息。我被告知 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 非常棒!),那麼您會在使用 JdbcTemplate
和 JDBC 模組中的各種命令類別時感到賓至如歸。 如果沒有,Spring 繼續滿足您今天的需求,為以 JDBC 為中心的數據訪問技術提供豐富的集成,例如 JOOQ、Hibernate、JPA、MyBatis、Spring Data JPA、Spring Data JDBC 以及其他許多選項。
您喜歡這種一目瞭然的方式嗎? 您學到了什麼嗎? 與往常一樣,我很想收到您的來信,所以 請在 Twitter (@starbuxman) 上發聲! 我將帶回另一期的YMNNALFT,所以請務必不要錯過。