整合JDBC
使用Spring Boot简单操作数据库,可以使用JDBC,而Spring Boot对JDBC进行了封装,从而省去了建立连接,创建Statement等繁琐的操作,只需要使用Sping Boot提供的JdbcTemplate即可
引入依赖
使用JDBC操作数据库,首先需要引入JDBC的启动器依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
然后引入对应的数据库驱动的依赖,这里以MySql为例
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
在引入MySql数据库驱动依赖时,并没有指定版本号,可以看到引入的驱动版本为8.0.23
这是因为Spring Boot的版本自动仲裁机制指定了驱动的版本号,可以看到在Spring Boot的父级依赖中已经指定了MySql数据库的版本号
如果需要修改版本号,可以在引入MySql数据库驱动依赖时指定具体的版本号,或者用以下配置
<properties>
<mysql.version>5.1.49</mysql.version>
</properties>
配置数据源
首先需要配置数据源的url,用户名密码,使用的驱动
spring:
datasource:
url: jdbc:mysql://localhost:3306/test_db?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
username: root
password: 12345
driver-class-name: com.mysql.cj.jdbc.Driver
我们可以以spring.jdbc
为前缀配置JDBC的相关配置,例如以下配置用于配置连接超时时间为10秒
spring:
jdbc:
template:
query-timeout: 10
编写sql语句
自动注入JdbcTemplate
类,然后使用JdbcTemplate
类的方法操作数据库
查询方法使用queryForList
方法,返回值为一个map集合的list,每一个map封装了一行数据的每个列的键值对
增删改操作使用update
方法,返回值为受修改的行数,或者使用无返回值的execute
方法
创建如下的数据表来做测试
create table user
(
id int auto_increment,
age int null,
name varchar(10) null,
address varchar(10) null,
constraint user_pk primary key (id)
);
在测试类中编写测试用例
@SpringBootTest
class SpringDemoApplicationTests {
@Autowired
JdbcTemplate jdbcTemplate;
@Test
void contextLoads() {
int row = jdbcTemplate.update("insert into user (name,age,address) values ('cong',22,'HZ'),('zhang',20,'BJ'),('liu',18,'SZ')");
System.out.println(row);
List<Map<String, Object>> users = jdbcTemplate.queryForList("select * from user");
users.forEach(System.out::println);
}
}
结果如下,第一行显示了插入了3行数据,后面是遍历查询结果的每一行
还可以在查询数据时,使用queryForList
的重载方法,指定返回值的类型来查询某个列
@SpringBootTest
class SpringDemoApplicationTests {
@Autowired
JdbcTemplate jdbcTemplate;
@Test
void contextLoads() {
List<String> users = jdbcTemplate.queryForList("select name from user",String.class);
users.forEach(System.out::println);
}
}
只有一个返回值时,如使用聚合函数,可以使用queryForObject
方法
添加参数
将参数传入sql语句,可以在sql语句中使用?
占位符,然后将参数传入增删改查的重载方法
@SpringBootTest
class SpringDemoApplicationTests {
@Autowired
JdbcTemplate jdbcTemplate;
@Test
void contextLoads() {
Object[] id = {1};
List<Map<String, Object>> users = jdbcTemplate.queryForList("select * from user where id=?", id);
users.forEach(System.out::println);
}
}
这样就会查询到id为1的用户
批量操作
批量对数据库中的数据进行增删改操作,可以使用batchUpdate
方法
@SpringBootTest
class SpringDemoApplicationTests {
@Autowired
JdbcTemplate jdbcTemplate;
@Test
void contextLoads() {
jdbcTemplate.batchUpdate("insert into user (name,age,address) values ('Tom',22,'NY')",
"insert into user (name,age,address) values ('Jim',22,'LA')",
"insert into user (name,age,address) values ('Jack',22,'SAN')");
}
}