JdbcTemplate的使用

虽说 JdbcTemplate 使用的情况不多,但是 Spring 在 JDBC 上对数据库做了封装,将 dataSource 注入 JdbcTemplate,使用更加方便。

JdbcTemplate实例

在这里需要引入 spring-boot-starter-jdbc 的依赖,在6.1节中已经讲过类似的,这里不再重复。新建数据表 t_user,SQL 语句如下所示。

CREATE TABLE t_user(
   ID INT(16) NOT NULL AUTO_INCREMENT COMMENT 'ID',
   USERNAME VARCHAR(32) NOT NULL COMMENT '姓名',
   PASSWORD VARCHAR(32) NOT NULL COMMENT '密码',
   PRIMARY KEY (ID)
)ENGINE=InnoDB DEFAULT CHARSET=UTF8 COMMENT='用户表';

对应的实体类代码如下所示。

package com.springBoot.dataSource.pojo;

public class User {
   private int id;
   private String username;
   private String password;
   //set and get
}

单次更新测试类代码

package com.springBoot.dataSource.test;
@SpringBootApplication
@SpringBootTest
//@PropertySource(value = "classpath:application.properties",ignore ResourceNotFound = true)
@RunWith(SpringRunner.class)
public class ShowDataSource {
   @Autowired
   JdbcTemplate jdbcTemplate;
   @Test
   public void testJdbcTemplate() throws SQLException {
      DataSource dataSource=applicationContext.getBean(DataSource. class);
      jdbcTemplate=new JdbcTemplate(dataSource);
      String sql="insert into t_user values(1,?,?)";
      jdbcTemplate.update(sql,"tom","123");
   }
}

上面的代码只是一个更新的实例,更多的方法没有展示,这里只是为了说明如何使用 JdbcTemplate。在上面的代码中,我们使用 Spring 的注入功能,将 dataSource 注册到 JdbcTemplate,然后可以使用 JdbcTemplate 的方法。在这里不需要考虑连接信息,只需要写 SQL 语句与传递 SQL 参数即可,最终效果如图6.2所示。

image 2024 03 31 17 35 03 174
Figure 1. 图6.2 新增数据库效果

批量处理

在 JdbcTemplate 中,每次运行 SQL 程序都会新建立一次数据库连接。建立连接比较浪费资源。有时面对同一种逻辑,我们希望在一次连接过程中执行多条 SQL,其实这也是支持的。下面是一个实例。

@Test
public void testBatchUpdate() throws SQLException {
      DataSource dataSource=applicationContext.getBean(DataSource. class);
   jdbcTemplate=new JdbcTemplate(dataSource);
   String sql="insert into t_user values(?,?,?)";
   List<Object[]> list=new ArrayList<>();
   list.add(new Object[]{2,"B","234"});
   list.add(new Object[]{3,"C","345"});
   list.add(new Object[]{4,"D","456"});
   jdbcTemplate.batchUpdate(sql,list);
}

最终,通过数据库,可以查看效果,如图6.3所示。

image 2024 03 31 17 36 08 596
Figure 2. 图6.3 新增数据库效果

JdbcTemplate原理说明

JdbcTemplate 提供了五类方法,其方法与说明如表6.1所示。

image 2024 03 31 17 36 52 601
Figure 3. 表6.1 JdbcTemplate的主要方法及说明

对于这五类方法,可以参考上文的实例进行使用。在上文的示例中可以看到,重要的是对 SQL 的书写,然后调用 API。

讲到这里,读者应该对 JdbcTemplate 有了基本的了解。在程序中,我们可以写自己的业务逻辑,但为了更好地拓展应用,还需了解一些底层的基本原理,加深对 JdbcTemplate 的理解。

首先,JdbcTemplate 是一个模板方法。JDBC 是比较原始的操作数据库方式,可以满足用户的基本需求,但在使用时需要自己管理,程序比较冗余。Spring 对此进行封装,构建抽象层,在抽象层提供了许多使用 JDBC 的模板与驱动模块。

然后,我们来看 JdbcTemplate 的继承关系,如图6.4所示。

image 2024 03 31 17 38 05 243
Figure 4. 图6.4 JdbcTemplate关系图

从图中可以看到 JdbcTemplate 继承了 JdbcAccessor 和实现接口 JdbcOperations。进入 JdbcAccessor 类中,可以看到在这个基类中,主要有以下几个方法,如图6.5所示。

image 2024 03 31 17 39 00 741
Figure 5. 图6.5 JdbcAccessor的方法

从图中可以看到,这里主要是对 DataSource 进行配置与管理。再让我们看看 JdbcOperations 接口。在这个接口中,更多的是方法的重载,用于定义通过 JDBC 操作数据库的基本方法。

最后,通过继承基类与实现接口,Jdbc Template 完成对 JDBC 的封装,这种做法不仅提高了数据库开发的效率,而且为应用开发提供了灵活性。