IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    对比Spring Boot中的JdbcClient与JdbcTemplate

    程序猿DD发表于 2024-01-10 13:30:49
    love 0

    本文我们一起看看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;
    }

    增删改查的实现对比

    如果您学习过程中如遇困难?可以加入我们超高质量的Spring技术交流群,参与交流与讨论,更好的学习与进步!更多Spring Boot教程可以点击直达!,欢迎收藏与转发支持!

    查询的实现对比

    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来操作数据库。那么您觉得怎么样呢?留言区一起聊聊~

    欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源


沪ICP备19023445号-2号
友情链接