JdbcTemplate介绍和使用

458 阅读6分钟

JdbcTemplate

JdbcTemplate 是 Spring JDBC 核心包(core)中的核心类,它可以通过配置文件、注解、Java 配置类等形式获取数据库的相关信息,实现了对 JDBC 开发过程中的驱动加载、连接的开启和关闭、SQL 语句的创建与执行、异常处理、事务处理、数据类型转换等操作的封装。我们只要对其传入SQL 语句和必要的参数即可轻松进行 JDBC 编程。JdbcTemplate 的全限定命名为 org.springframework.jdbc.core.JdbcTemplate,它提供了大量的查询和更新数据库的方法,如下表所示。

image.png

什么是JdbcTemplate

JDBC作为Java访问数据库的API规范,统一了各种数据库的访问方式。但是,直接在Java程序中使用JDBC还是非常复杂和繁琐的。所以Spring对JDBC进行了更深层次的封装,而JdbcTemplate就是Spring提供的一个操作数据库的便捷工具。它主要是实现了数据库连接的管理,我们可以借助JdbcTemplate来执行所有数据库操作,例如插入、更新、删除和从数据库中检索数据,并且有效避免直接使用JDBC带来的烦琐编码。

Spring Boot作为Spring的集大成者,自然会将JdbcTemplate集成进去。Spring Boot针对JDBC的使用提供了对应的Starter包:spring-boot-starter-jdbc,它其实就是在Spring JDBC上做了进一步的封装,方便在 Spring Boot 项目中更好地使用JDBC。

1、JdbcTemplate的特点

  • 速度快,相对于ORM框架,JDBC的方式是最快的。
  • 配置简单,Spring封装的,除了数据库连接之外,几乎没有额外的配置。
  • 使用方便,就像DBUtils工具类,只需注入JdbcTemplate对象即可。

2、JdbcTemplate的几种类型的方法

JdbcTemplate虽然简单,功能却非常强大。它提供了非常丰富、实用的方法,归纳起来主要有以下几种类型的方法:

(1)execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句。

(2)update、batchUpdate方法:用于执行新增、修改与删除等语句。

(3)query和queryForXXX方法:用于执行查询相关的语句。

(4)call方法:用于执行数据库存储过程和函数相关的语句。

总的来说,新增、删除与修改三种类型的操作主要使用update和batchUpdate方法来完成。query和queryForObject方法中主要用来完成查询功能。execute方法可以用来执行任意的SQL、call方法来调用存储过程。

Spring Boot集成JdbcTemplate

Spring Boot集成JDBC很简单,需要引入依赖并做基础配置即可。接下来,我们就以一个具体的例子来学习如何利用Spring的JdbcTemplate进行数据库操作。

第一步,添加依赖配置

首先,项目pom.xml 配置文件中增加 JDBC等相关依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
</dependency>

上面的示例,在pom.xml文件中引入spring-boot-starterjdbc依赖。同时,项目中使用 MySQL作为数据库,因此项目中需要引入MySQL驱动包。spring-boot-starter-jdbc则直接依赖于HikariCP和spring-jdbc。

  • HikariCP是Spring Boot 2.0默认使用的数据库连接池,也是传说中最快的数据库连接池。
  • spring-jdbc是Spring封装对JDBC操作的工具包。

第二步,创建数据库及表结构

首先创建jdbctest测试数据库,然后再创建student表。包括id、name、sex、age等字段,对应的SQL脚本如下:

DROP TABLE IF EXISTS `student`;

CREATE TABLE `student` (

          `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',

          `name` varchar(32) DEFAULT NULL COMMENT '姓名',

          `sex` int DEFAULT NULL,

          `age` int DEFAULT NULL,

          PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

第三步,配置数据源

在application.properties配置MYSQL数据库连接相关配置。具体配置如下:

spring:
  application:
    name: test-jdbcPool
  datasource:
    username: roo
    password: 123456
    url: jdbc:mysql://localhost:3306/mytest?useSSL=false&charsetEncoding=utf8
    driver-class-name: com.mysql.jdbc.Driver
    hikari:                                                                                                                                                                                                                                                                
      maximum-pool-size: 10  # 最大连接数
      minimum-idle: 5 # 最小空闲数
      connection-timeout: 2000 # 获取连接超时时间; 默认30s
      pool-name: my-test-hikari # 连接池名称
      idle-timeout: 600000 # 空闲超时时间;默认是十分钟;空闲时间超过设定时间则会被回收
      auto-commit: true # 是否自动提交
      max-lifetime: 1800000 # 最大存活时间,默认30分钟
     # connection-test-query: SELECT 1  # 连接数据库后测试语句
      validation-timeout: 1000 #
      # schema: 设置模式,例如 postgresql 有模式这个概念

上面的示例,数据库连接配置非常简单,包括数据库连接地址、数据库用户名、密码以及数据驱动,无需其他额外配置。在Spring Boot 2.0中,com.mysql.jdbc.Driver已经过期,推荐使用com.mysql.cj.jdbc.Driver。

第四步,使用JdbcTemplate

上面已经就把JdbcTemplate整合到Spring Boot项目中,并创建好数据。接下来创建一个单元测试类JdbcTests,验证JdbcTemplate操作数据库。示例代码如下:

@RunWith(SpringRunner.class)

@SpringBootTest

class JdbcTests {

    @Autowired

    JdbcTemplate jdbcTemplate;


    @Test

    void querytest() throws SQLException {

        List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from student ");

        System.out.println(list.size());

        Assert.assertNotNull(list);

        Assert.assertEquals(1,list.size());

    }

}

上面是简单使用JdbcTemplate的测试示例,Spring的JdbcTemplate是自动配置的。使用@Autowired将JdbcTemplate注入到需要的bean中即可直接调用。

运行Run Test或在方法上右键|Run ‘querytest’,运行测试方法。运行结果如下图所示:

image.png

如上图所示,单元测试方法queryTest运行成功,并输出相应的结果。说明JdbcTemplate已经连接上数据库,并成功执行了数据查询操作。

以上就把JdbcTemplate整合到Spring Boot 项目中了。

常用CURD操作

大致使用以下三个方法:1.execute方法,用于直接执行SQL语句2.update方法,用户新增修改删除操作3.query方法,用于查询方法

代码演示

String sql = "CREATE TABLE `user` (\n" +
"  `id` int(11) NOT NULL AUTO_INCREMENT,\n" +
"  `user_name` varchar(255) DEFAULT NULL,\n" +
"  `pass_word` varchar(255) DEFAULT NULL,\n" +
"  PRIMARY KEY (`id`)\n" +
") ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;\n" +
"\n";
jdbcTemplate.execute(sql);
return "创建User表成功";

---

String sql = "INSERT INTO USER (USER_NAME,PASS_WORD) VALUES ('dalaoyang','123')";
int rows= jdbcTemplate.update(sql);
return "执行成功,影响"+rows+"行";

---

int rows= jdbcTemplate.update("INSERT INTO USER (USER_NAME,PASS_WORD) VALUES (?,?)",userName,passWord);
return "执行成功,影响"+rows+"行";

---

int rows= jdbcTemplate.update("UPDATE USER SET PASS_WORD = ? WHERE ID = ?",passWord,id);
return "执行成功,影响"+rows+"行";

---

int rows= jdbcTemplate.update("DELETE FROM  USER  WHERE ID = ?",id);
return "执行成功,影响"+rows+"行";

---

String sql =
"INSERT INTO USER (USER_NAME,PASS_WORD) VALUES (?,?)" ;
List<Object[]> paramList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
    String[] arr = new String[2];
    arr[0] = "zhangsan"+i;
    arr[1] = "password"+i;
    paramList.add(arr);
}
jdbcTemplate.batchUpdate(sql,paramList);
return "执行成功";

---

List<User> list= jdbcTemplate.query(sql,new User(),new Object[]{userName});
return list;

---


String sql = "SELECT * FROM USER WHERE ID = ?";
Map map= jdbcTemplate.queryForMap(sql,id);
return map;

---

String sql = "SELECT * FROM USER WHERE ID = ?";
User user= jdbcTemplate.queryForObject(sql,new User(),new Object[]{id});
return user;

测试方法介绍

使用execute方法创建User表

使用update方法,传入参数sql语句,直接执行插入操作

使用update方法,传入sql语句和对应字段值,进行插入操作

使用update方法,传入sql语句和对应字段值,进行修改操作

使用update方法,传入sql语句和对应字段值,进行删除操作

使用batchUpdate方法,传入sql和参数集合,进行批量更新

使用query方法,传入sql,实体对象,查询参数,这里就用到了实体类重写的mapRow方法

使用queryForMap方法,传入sql和参数,返回Map

使用queryForObject方法,传入sql,实体对象,查询参数,返回User实体类,这里也用到了实体类重写的mapRow方法