Spring Boot中的JdbcClient与JdbcTemplate使用对比分析

 更新时间:2024年01月17日 08:46:02   作者:程序猿DD  
这篇文章主要介绍了Spring Boot中的JdbcClient与JdbcTemplate使用对比分析,一起看看Spring Boot 中 JdbcClient 和 JdbcTemplate 之间的差异

引言

以下内容使用的Java和Spring Boot版本为:

  • Java 21
  • Spring Boot 3.2.1

假设我们有一个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);
}

其中,涵盖了我们常见的数据CRUD操作。

下面就来一起看看,分别使用 JDBC Client 和 JDBC Template 的实现。

初始化对比

JdbcTemplate的初始化:

private final JdbcTemplate jdbcTemplate;
public CustomerJdbcTemplateService(JdbcTemplate jdbcTemplate){
  this.jdbcTemplate = jdbcTemplate;
}

JdbcClient的初始化;

private final JdbcClient jdbcClient;
public CustomerJdbcClientService(JdbcClient jdbcClient){
  this.jdbcClient = jdbcClient;
}

增删改查的实现对比

查询的实现对比

getAllCustomer查询返回集合数据的实现对比:

// jdbcTemplate实现
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实现
public List<Customer> getAllCustomer(){
  return jdbcClient.sql("select id, name, lastname, birthday from customer").query(Customer.class).list();
}

getCustomerById查询返回单条数据的实现对比:

// jdbcTemplate实现
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实现
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插入数据的实现对比

// jdbcTemplate实现
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实现
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更新数据的实现对比

// jdbcTemplate实现
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实现
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删除数据的实现对比

// jdbcTemplate实现
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实现
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");
}

总结

上面我们分别演示了JdbcClient 和 JdbcTemplate从初始化到真正执行增删改查操作的代码样例。总体上来说,JdbcClient的实现更为简洁方便。如果不考虑其他ORM框架的情况下,在未来的Spring Boot版本中,我会更偏向于选择JdbcClient来操作数据库。

以上就是Spring Boot中的JdbcClient与JdbcTemplate使用对比分析的详细内容,更多关于Spring Boot JdbcClient对比JdbcTemplate的资料请关注脚本之家其它相关文章!

相关文章

  • java删除文件时总是返回false,删不掉的解决方案

    java删除文件时总是返回false,删不掉的解决方案

    这篇文章主要介绍了java删除文件时总是返回false,删不掉的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • JDBC连接Mysql的5种方式实例总结

    JDBC连接Mysql的5种方式实例总结

    JDBC是Java DataBase Connectivity技术的简称,是一种可用于执行 SQL语句的Java API,下面这篇文章主要给大家介绍了关于JDBC连接Mysql的5种方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • JAVA大作业之图书管理系统实现全解

    JAVA大作业之图书管理系统实现全解

    随着网络技术的高速发展,计算机应用的普及,利用计算机对图书馆的日常工作进行管理势在必行,本篇文章手把手带你用Java实现一个图书管理系统,大家可以在过程中查缺补漏,提升水平
    2022-01-01
  • 解读SpringBoot中addCorsMappings配置跨域与拦截器互斥问题的原因

    解读SpringBoot中addCorsMappings配置跨域与拦截器互斥问题的原因

    这篇文章主要介绍了解读SpringBoot中addCorsMappings配置跨域与拦截器互斥问题的原因,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java读取properties配置文件时,出现中文乱码的解决方法

    Java读取properties配置文件时,出现中文乱码的解决方法

    下面小编就为大家带来一篇Java读取properties配置文件时,出现中文乱码的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • Java调用Shell命令和脚本的实现

    Java调用Shell命令和脚本的实现

    这篇文章主要介绍了Java调用Shell命令和脚本的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Java实战之客户信息管理系统

    Java实战之客户信息管理系统

    这篇文章主要介绍了Java实战之客户信息管理系统,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • SpringMVC结构简介及常用注解汇总

    SpringMVC结构简介及常用注解汇总

    这篇文章主要介绍了SpringMVC结构简介及常用注解汇总,帮助大家更好的理解和学习使用SpringMVC,感兴趣的朋友可以了解下
    2021-03-03
  • Java比较对象大小两种常用方法

    Java比较对象大小两种常用方法

    这篇文章主要介绍了Java比较对象大小两种常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • swing组件JScrollPane滚动条实例代码

    swing组件JScrollPane滚动条实例代码

    这篇文章主要介绍了swing组件JScrollPane滚动条实例代码,分享了两个相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02

最新评论