Spring?Boot中的JdbcClient與JdbcTemplate使用對比分析
引言
以下內(nèi)容使用的Java和Spring Boot版本為:
- Java 21
- Spring Boot 3.2.1
假設(shè)我們有一個ICustomerService接口:
public interface ICustomerService {
List<Customer> getAllCustomer();
Optional<Customer> getCustomerById(int id);
void insert(Customer customer);
void update(int id, Customer customer);
void delete(int id);
}其中,涵蓋了我們常見的數(shù)據(jù)CRUD操作。
下面就來一起看看,分別使用 JDBC Client 和 JDBC Template 的實現(xiàn)。
初始化對比
JdbcTemplate的初始化:
private final JdbcTemplate jdbcTemplate;
public CustomerJdbcTemplateService(JdbcTemplate jdbcTemplate){
this.jdbcTemplate = jdbcTemplate;
}JdbcClient的初始化;
private final JdbcClient jdbcClient;
public CustomerJdbcClientService(JdbcClient jdbcClient){
this.jdbcClient = jdbcClient;
}增刪改查的實現(xiàn)對比
查詢的實現(xiàn)對比
getAllCustomer查詢返回集合數(shù)據(jù)的實現(xiàn)對比:
// jdbcTemplate實現(xiàn)
private final RowMapper<Customer> rowMapper = (rs, row)
-> new Customer(rs.getInt("id"), rs.getString("name"), rs.getString("lastname"), rs.getDate("birthday"));
public List<Customer> getAllCustomer() {
return jdbcTemplate.query("select id, name, lastname, birthday from customer", rowMapper);
}
// jdbcClient實現(xiàn)
public List<Customer> getAllCustomer(){
return jdbcClient.sql("select id, name, lastname, birthday from customer").query(Customer.class).list();
}getCustomerById查詢返回單條數(shù)據(jù)的實現(xiàn)對比:
// jdbcTemplate實現(xiàn)
public Optional<Customer> getCustomerById(int id) {
Customer customer = null;
try {
customer = jdbcTemplate.queryForObject("select id, name, lastname, birthday from customer where id = ?", rowMapper, id );
} catch (DataAccessException ex){
LOG.error("Data not found. Id parameter: " + id, ex);
}
return Optional.ofNullable(customer);
}
// jdbcClient實現(xiàn)
public Optional<Customer> getCustomerById(int id){
return jdbcClient.sql("select id, name, lastname, birthday from customer where id= :id")
.param("id", id)
.query(Customer.class)
.optional();
}insert插入數(shù)據(jù)的實現(xiàn)對比
// jdbcTemplate實現(xiàn)
public void insert(Customer customer) {
int inserted = jdbcTemplate.update("insert into customer (id, name, lastname, birthday) values (?,?,?,?)",
customer.id(), customer.name(), customer.lastname(),customer.birthday());
Assert.state(inserted == 1 , "An exception error occurred while inserting customer");
}
// jdbcClient實現(xiàn)
public void insert(Customer customer){
int inserted = jdbcClient.sql("insert into customer (id, name, lastname, birthday) values (?,?,?,?)")
.params(List.of(customer.id(), customer.name(), customer.lastname(), customer.birthday()))
.update();
Assert.state(inserted == 1 , "An exception error occurred while inserting customer");
}update更新數(shù)據(jù)的實現(xiàn)對比
// jdbcTemplate實現(xiàn)
public void update(int id, Customer customer) {
int updated = jdbcTemplate.update("update customer set name = ?, lastname = ?, birthday = ? where id = ? ",
customer.name(), customer.lastname(),customer.birthday(), id);
Assert.state(updated == 1 , "An exception error occurred while updating customer");
}
// jdbcClient實現(xiàn)
public void update(int id, Customer customer){
int updated = jdbcClient.sql("update customer set name = ?, lastname = ?, birthday = ? where id = ?")
.params(List.of(customer.name(), customer.lastname(), customer.birthday(), id))
.update();
Assert.state(updated == 1, "An exception error occurred while updating customer");
}delete刪除數(shù)據(jù)的實現(xiàn)對比
// jdbcTemplate實現(xiàn)
public void delete(int id) {
int deleted = jdbcTemplate.update("delete from customer where id = ?", id);
Assert.state(deleted == 1 , "An exception error occurred while deleting customer");
}
// jdbcClient實現(xiàn)
public void delete(int id) {
int deleted = jdbcClient.sql("delete from customer where id = :id").param("id",id).update();
Assert.state(deleted == 1, "An exception error occurred while updating customer");
}總結(jié)
上面我們分別演示了JdbcClient 和 JdbcTemplate從初始化到真正執(zhí)行增刪改查操作的代碼樣例??傮w上來說,JdbcClient的實現(xiàn)更為簡潔方便。如果不考慮其他ORM框架的情況下,在未來的Spring Boot版本中,我會更偏向于選擇JdbcClient來操作數(shù)據(jù)庫。
以上就是Spring Boot中的JdbcClient與JdbcTemplate使用對比分析的詳細(xì)內(nèi)容,更多關(guān)于Spring Boot JdbcClient對比JdbcTemplate的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決Error occurred during initialization o
這篇文章主要介紹了解決Error occurred during initialization of VM Java虛擬機(jī)初始化失敗問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03
Spring Boot + Thymeleaf + Activiti 快速開發(fā)平臺項目 附源碼
這篇文章主要介紹了Spring Boot + Thymeleaf + Activiti 快速開發(fā)平臺項目附源碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
Eclipse插件開發(fā)實現(xiàn)控制臺輸出信息的方法
今天小編就為大家分享一篇關(guān)于Eclipse插件開發(fā)實現(xiàn)控制臺輸出信息的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01
解讀maven項目中Tomcat10與JSTL的問題匯總(Debug親身經(jīng)歷)
這篇文章主要介紹了解讀maven項目中Tomcat10與JSTL的問題匯總(Debug親身經(jīng)歷),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
java中CompletableFuture異步執(zhí)行方法
本文主要介紹了java中CompletableFuture異步執(zhí)行方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
詳解Spring Boot實戰(zhàn)之Filter實現(xiàn)使用JWT進(jìn)行接口認(rèn)證
本篇文章主要介紹了詳解Spring Boot實戰(zhàn)之Filter實現(xiàn)使用JWT進(jìn)行接口認(rèn)證,具有一定的參考價值,有興趣的可以了解一下2017-07-07

