SpringBoot3革新:JdbcClient让JdbcTemplate成为历史,JdbcClient 更强大

科技   2024-10-09 08:03   河北  


前言

SpringBoot 3.2 引入了JdbcClient API组件,该组件用于数据库操作,实际上JdbcClient是在JdbcTemplate的基础上进行了一层封装。

SpringBoot 3.2推出了新的JdbcClient用于数据库操作,JdbcClient对JdbcTemplate进行了封装,并采用了fluent API风格,使得可以进行链式调用。

自此,Spring框架自带的数据库操作方式增加到了四种。

  • JdbcTemplate

  • JdbcClient

  • SpringDataJdbc

  • SpringDataJpa

对于那些不适合采用复杂ORM框架,或者需要手动编写精细SQL语句的场景,可以选择使用JdbcClient来直接操作数据库。但需要注意的是,JdbcClient目前并不支持数据的批量处理以及存储过程的调用。在这些特定需求下,就需要转而使用JdbcTemplate。

JdbcClient是一个轻量级的数据库操作工具,它采用了fluent API的设计风格,使得操作既简单又灵活,同时代码更加易于阅读和维护,完全支持用户编写复杂的SQL语句。

代码示例

引入 JDBCCLIENT

引入 spring-data-jdbc 依赖。在 build.gradle 中增加一行代码:

implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'

直接在Service中注入JdbcClient

@Component
public class DbService {
  @Autowired
  private JdbcClient jdbcClient;
}

数据查询

按照主键查数据:

public MyData findDataById(Long id) {
      return jdbcClient.sql("select * from my_data where id = ?")
              .params(id)
              .query(MyData.class)
              .single();
  }

也可以通过自定义查询条件进行数据查询

public List<MyData> findDataByName(String name) {
      return jdbcClient.sql("select * from my_data where name = ?")
              .params(name)
              .query(MyData.class)
              .list();
  }

同时dbcClient也支持按照参数名进行数据查询

public Integer insertDataWithNamedParam(MyData myData) {
      Integer rowsAffected = jdbcClient.sql("insert into my_data values(:id,:name) ")
              .param("id", myData.id())
              .param("name", myData.name())
              .update();
      return rowsAffected;
  }

数据插入

占位符参数插入数据:

public Integer insertDataWithParam(MyData myData) {
      Integer rowsAffected = jdbcClient.sql("insert into my_data values(?,?) ")
              .param(myData.id())
              .param(myData.name())
              .update();
      return rowsAffected;
  }

通过参数进行数据插入

public Integer insertDataWithNamedParam(MyData myData) {
      Integer rowsAffected = jdbcClient.sql("insert into my_data values(:id,:name) ")
              .param("id", myData.id())
              .param("name", myData.name())
              .update();
      return rowsAffected;
  }

直接将一个对象中的数据插入

public Integer insertDataWithObject(MyData myData) {
      Integer rowsAffected = jdbcClient.sql("insert into my_data values(:id,:name) ")
              .paramSource(myData)
              .update();
      return rowsAffected;
  }


总结

通过上述的示例,我们可以观察到,JdbcClient能够实现基本的数据库操作,从而避免了使用复杂的ORM框架。同时,它的操作方式相较于ORM框架来说更为简单且灵活。JdbcClient所采用的fluent API风格也使得编写和阅读代码变得更加容易。

完整的数据库操作方法示例方法:

@Slf4j
@SpringBootApplication
public class Application implements CommandLineRunner {
 
  @Autowired
  private DbService dbService;
 
  @Override
  public void run(String... args) 
{
      MyData myData = new MyData(1L, "test");
      log.info("insert rows: {}", dbService.insertDataWithObject(myData));
 
      MyData myData2 = new MyData(2L, "test");
      dbService.insertDataWithParam(myData2);
 
      MyData myData3 = new MyData(3L, "author");
      dbService.insertDataWithNamedParam(myData3);
 
      log.info("findDataById: {}", dbService.findDataById(1L));
      log.info("findDataByName: {}", dbService.findDataByName("test"));
      log.info("findDataWithRowMapper: {}", dbService.findDataWithRowMapper());
      log.info("findDataByParamMap: {}", dbService.findDataByParamMap(Map.of("name", "author")));
      log.info("countByName: {}", dbService.countByName("test"));
  }
 
  public static void main(String[] args) {
      SpringApplication.run(Application.class, args);
  }
}


Java技术前沿
专注分享Java技术,包括但不限于 SpringBoot,SpringCloud,Docker,消息中间件等。
 最新文章