整合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

springboot 打包jar找不到sqllite文件地址_mysql

这是因为Spring Boot的版本自动仲裁机制指定了驱动的版本号,可以看到在Spring Boot的父级依赖中已经指定了MySql数据库的版本号

springboot 打包jar找不到sqllite文件地址_spring_02

如果需要修改版本号,可以在引入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行数据,后面是遍历查询结果的每一行

springboot 打包jar找不到sqllite文件地址_spring_03

还可以在查询数据时,使用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);
    }

}

springboot 打包jar找不到sqllite文件地址_jdbc_04

只有一个返回值时,如使用聚合函数,可以使用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的用户

springboot 打包jar找不到sqllite文件地址_jdbc_05

批量操作

批量对数据库中的数据进行增删改操作,可以使用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')");
    }

}