Spring Data JDBC介紹及實(shí)現(xiàn)代碼
Spring新增了一個(gè)新的數(shù)據(jù)模塊:Spring Data JDBC。Spring Data JDBC背后的想法是提供對(duì)關(guān)系數(shù)據(jù)庫(kù)的訪問(wèn),而無(wú)需處理JPA的復(fù)雜性。JPA提供延遲加載,緩存和臟跟蹤等功能。果你需要這些功能會(huì)很很棒,但會(huì)讓猜測(cè)JPA的行為比非JPA更難。
延遲加載可能會(huì)在你不需要時(shí)觸發(fā)昂貴的語(yǔ)句,或者它可能會(huì)因異常而失敗。當(dāng)你想要比較一個(gè)實(shí)體的兩個(gè)版本是哪個(gè)變成臟數(shù)據(jù)時(shí),緩存可能會(huì)妨礙你,讓你很難找到所有持久性操作都通過(guò)的那個(gè)點(diǎn)。
Spring Data JDBC目標(biāo)是實(shí)現(xiàn)更簡(jiǎn)單的模型,不會(huì)有緩存,臟數(shù)據(jù)跟蹤或延遲加載。相反,只有在調(diào)用數(shù)據(jù)庫(kù)方法時(shí)才會(huì)發(fā)出SQL語(yǔ)句。方法返回的對(duì)象會(huì)完全加載,不會(huì)有延遲。實(shí)體沒(méi)有“會(huì)話”和代理。所有這些都應(yīng)該使Spring Data JDBC更易于推理。
當(dāng)然,這種更簡(jiǎn)單的方法會(huì)導(dǎo)致約束。
我們來(lái)看一個(gè)簡(jiǎn)單的例子。
首先,我們需要一個(gè)實(shí)體:
class Customer {
@Id
Long id;
String firstName;
LocalDate dob;
}
請(qǐng)注意,不需要getter或setter。如果您意,可以增加。實(shí)際上,唯一的要求是實(shí)體有一個(gè)注釋的屬性Id(即@org.springframework.data.annotation.Id,注意不是javax.persistence,后者是JPA)。
接下來(lái),我們需要聲明一個(gè)存儲(chǔ)庫(kù)。最簡(jiǎn)單的方法是擴(kuò)展CrudRepository:
interface CustomerRepository extends CrudRepository<Customer, Long> {}
最后,我們需要配置ApplicationContext以啟用存儲(chǔ)庫(kù)的創(chuàng)建:
@Configuration
@EnableJdbcRepositories (1)
public class CustomerConfig extends JdbcConfiguration { (2)
@Bean
NamedParameterJdbcOperations operations() { (3)
return new NamedParameterJdbcTemplate(dataSource());
}
@Bean
PlatformTransactionManager transactionManager() { (4)
return new DataSourceTransactionManager(dataSource());
}
@Bean
DataSource dataSource(){ (5)
return new EmbeddedDatabaseBuilder()
.generateUniqueName(true)
.setType(EmbeddedDatabaseType.HSQL)
.addScript("create-customer-schema.sql")
.build();
}
}
讓我們一步一步地解釋。
1. EnableJdbcRepositories可以創(chuàng)建存儲(chǔ)庫(kù)。由于它需要存在一些bean,我們需要其余的配置。
2. 繼承擴(kuò)展的JdbcConfiguration將一些默認(rèn)bean添加到ApplicationContext??梢愿采w其方法以自定義Spring Data JDBC的某些行為?,F(xiàn)在,我們使用默認(rèn)實(shí)現(xiàn)。
3. 真正重要的部分是NamedParameterJdbcOperations,它在內(nèi)部用于向數(shù)據(jù)庫(kù)提交SQL語(yǔ)句。
4. 嚴(yán)格來(lái)說(shuō),事務(wù)管理器不是必需的。不支持跨越多個(gè)SQL語(yǔ)句的事務(wù)。
5. Spring Data JDBC沒(méi)有直接使用DataSource,但是,由于TransactionManager和NamedParameterJdbcOperations需要,將DataSource注冊(cè)為bean是一種確保兩者使用相同實(shí)例的簡(jiǎn)單方法。
這就是一切。現(xiàn)在讓我們測(cè)試玩玩:
@RunWith(SpringRunner.class)
@Transactional
@ContextConfiguration(classes = CustomerConfig.class)
public class CustomerRepositoryTest {
@Autowired CustomerRepository customerRepo;
@Test
public void createSimpleCustomer() {
Customer customer = new Customer();
customer.dob = LocalDate.of(1904, 5, 14);
customer.firstName = "Albert";
Customer saved = customerRepo.save(customer);
assertThat(saved.id).isNotNull();
saved.firstName = "Hans Albert";
customerRepo.save(saved);
Optional<Customer> reloaded = customerRepo.findById(saved.id);
assertThat(reloaded).isNotEmpty();
assertThat(reloaded.get().firstName).isEqualTo("Hans Albert");
}
}
@Query 注解
你可能不會(huì)只使用基本的CRUD方法CrudRepository??梢允褂煤?jiǎn)單的@Query注釋來(lái)指定存儲(chǔ)庫(kù)方法的查詢:
@Query("select id, first_name, dob from customer where upper(first_name) like '%' || upper(:name) || '%' ")
List<Customer> findByName(@Param("name") String name);
請(qǐng)注意,@Param如果使用-parameters標(biāo)志進(jìn)行編譯,則不需要注釋。
如果要執(zhí)行更新或刪除語(yǔ)句,可以使用@Modifying向方法添加注釋。
讓我們創(chuàng)建另一個(gè)測(cè)試以試用新方法。
@Test
public void findByName() {
Customer customer = new Customer();
customer.dob = LocalDate.of(1904, 5, 14);
customer.firstName = "Albert";
Customer saved = customerRepo.save(customer);
assertThat(saved.id).isNotNull();
customer.id= null; (1)
customer.firstName = "Bertram";
customerRepo.save(customer);
customer.id= null;
customer.firstName = "Beth";
customerRepo.save(customer);
assertThat(customerRepo.findByName("bert")).hasSize(2); (2)
}
由于Java對(duì)象與其對(duì)應(yīng)行之間的連接是Id類型,因此設(shè)置Id為null并再次保存它會(huì)在數(shù)據(jù)庫(kù)中創(chuàng)建另一行。
我們正在進(jìn)行不區(qū)分大小寫(例如)搜索,因此,我們找到“Albert”和“Bertram”,但不是“Beth”。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 關(guān)于Spring項(xiàng)目對(duì)JDBC的支持與基本使用詳解
- 詳解springboot采用多數(shù)據(jù)源對(duì)JdbcTemplate配置的方法
- Spring boot 使用JdbcTemplate訪問(wèn)數(shù)據(jù)庫(kù)
- SpringBoot JdbcTemplate批量操作的示例代碼
- Spring Boot中使用JDBC Templet的方法教程
- spring boot tomcat jdbc pool的屬性綁定
- spring boot使用sharding jdbc的配置方式
- springboot使用JdbcTemplate完成對(duì)數(shù)據(jù)庫(kù)的增刪改查功能
- Spring的連接數(shù)據(jù)庫(kù)以及JDBC模板(實(shí)例講解)
- 在Spring中使用JDBC和JDBC模板的講解
相關(guān)文章
Java實(shí)現(xiàn)簡(jiǎn)易計(jì)算器(逆波蘭表達(dá)式)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)易計(jì)算器,逆波蘭表達(dá)式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
Java項(xiàng)目開(kāi)發(fā)中實(shí)現(xiàn)分頁(yè)的三種方式總結(jié)
這篇文章主要給大家介紹了關(guān)于Java項(xiàng)目開(kāi)發(fā)中實(shí)現(xiàn)分頁(yè)的三種方式,通過(guò)這一篇文章可以很快的學(xué)會(huì)java分頁(yè)功能,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02
SpringBoot中使用EasyExcel并行導(dǎo)出多個(gè)excel文件并壓縮zip后下載的代碼詳解
SpringBoot的同步導(dǎo)出方式中,服務(wù)器會(huì)阻塞直到Excel文件生成完畢,在處理大量數(shù)據(jù)的導(dǎo)出功能,本文給大家介紹了SpringBoot中使用EasyExcel并行導(dǎo)出多個(gè)excel文件并壓縮zip后下載,需要的朋友可以參考下2024-09-09
SpringBoot項(xiàng)目中jar發(fā)布獲取jar包所在目錄路徑的最佳方法
在開(kāi)發(fā)過(guò)程中,我們經(jīng)常要遇到上傳圖片、word、pdf等功能,但是當(dāng)我們把項(xiàng)目打包發(fā)布到服務(wù)器上時(shí),對(duì)應(yīng)的很多存儲(chǔ)路徑的方法就會(huì)失效,下面這篇文章主要給大家介紹了關(guān)于SpringBoot項(xiàng)目中jar發(fā)布獲取jar包所在目錄路徑的相關(guān)資料2022-07-07
基于Java將Excel科學(xué)計(jì)數(shù)法解析成數(shù)字
這篇文章主要介紹了基于Java將Excel科學(xué)計(jì)數(shù)法解析成數(shù)字,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09

