Spring Boot简明教程之数据访问(一):JDBC Template

Spring Boot简明教程之数据访问(一):JDBC Template


我们在之前已经介绍了有关Spring Boot对于Web开发的一些支持,但是如果整个应用要想实现动态的数据交换,对于数据库的操作是必不可少的。本文将介绍Spring Boot通过JdbcTemplate 进行数据库操作的示例。

创建项目:

大体上和我们的第一篇文章: SpringBoot简明教程之快速创建第一个SpringBoot应用相同,但是当我们在选择需要加载的所需要的组建的时候,除了选择所需要的Web组件外,还需要选择SQL类组件中的MySQL和JDBC.

在这里插入图片描述

或者,在创建好以后,在pom.xml中手动添加

<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<scope>runtime</scope>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

准备数据库环境

对于MySQL数据库部分的安装,请看这篇博客:史上最简单MYSQL教程详解(基础篇)之初识MySQL数据库以及环境配置,这里就不再赘述。

执行命令,创建数据库:

CREATE DATABASE springboot;

编写配置文件

在application.yml中进行如下配置:

spring:
  datasource:
    username: 你的MySQL用户名,默认为:root
    password: 你的MySQL密码,默认为空
    url: jdbc:mysql://127.0.0.1:3306/springboot
    driver-class-name: com.mysql.jdbc.Driver

然后,我们测试一下该数据是否成功:

@RunWith(SpringRunner.class)
@SpringBootTest
public class Springboot06ApplicationTests {

	@Autowired
	DataSource dataSource;

	@Test
	public void contextLoads() throws SQLException {
		System.out.println(dataSource.getClass());   //打印获取到的数据源

		Connection connection = dataSource.getConnection();
		System.out.println(connection);    //打印连接
		connection.close();                //关闭连接
	}

}

然后,右键run"contextLoads":

在这里插入图片描述

成功获取到了连接,证明配置正确。

为啥我们获取到是class com.zaxxer.hikari.HikariDataSource?这是因为SpringBoot的数据源是自动配置的。在 SpringBoot 2.0 中,支持以下数据源:

  • org.apache.tomcat.jdbc.pool.DataSource
  • HikariDataSource
  • BasicDataSource

Spring Boot2.0开始,按照 HikariCP -> Tomcat pooling -> Commons DBCP2 优先顺序来选择最后实际使用哪个数据源,默认的就是:Hikari。但是在Spring Boot 1.0-2.0以前的版本默认的数据源是:Tomcat pooling 。在项目加入 spring-boot-starter-jdbc 依赖的时候,就已经包括了默认的数据源的依赖,所以这里自动配置 HikariCP 连接池数据源。

创建数据库

Spring Boot为我们提供了非常的方便的数据库的初始化配置,为我们的开发和部署都提供了极大的便利。它的的具体实现在org/springframework/boot/autoconfigure/jdbc/DataSourceInitializer.class:中,有兴趣的小伙伴可以自行阅读源码~~可我们如何实现数据库的初始化配置呢?下面两种方式都可以:

  1. 我们只需要在类路径(resource目录)下将我们的数据库的执行文件按照下面的方式命名:
schema-*.sql、data-*.sql
默认规则:schema.sql,schema-all.sql;

但是需要注意的是,如果我们的文件命名为:schema-test,那么对应的,我们需要在配置文件中加上如下配置:

spring: 
  datasource:
     platform: test
  1. 在配置文件中,指定我们的数据库执行文件的位置,就不需要按照上面的方式进行命名,例如:
schema:
      - 指定位置

例如:

我们将编写如下的SQL语句,并将其放在resource目录下:

organization.sql

DROP TABLE IF EXISTS `organization`;

CREATE TABLE `organization` (
 `id` bigint(20) NOT NULL PRIMARY KEY AUTO_INCREMENT,
 `active` bit(1) NOT NULL,
 `company_name` varchar(30) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

data.sql

INSERT INTO organization (company_name, active)
VALUES
('JDBC IBM', true),
('JDBC MS', true);

将配置文件修改如下:


spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springboot?useSSL=false
    username: 你的MySQL用户名,默认为:root
    password: 你的MySQL密码,默认为空
    schema: classpath:organization.sql
    initialization-mode: always

直接启动项目:
在这里插入图片描述

启动成功,我们到数据库查看,发现数据表成功创建,且插入成功:

在这里插入图片描述

但需要注意的是:对于initialization-mode它有如下三个参数值:

参数值 说明
ALWAYS 始终初始化数据源(即:每次启动项目都会对数据库进行初始化)
EMBEDDED 对嵌入式数据源启用基本DataSource初始化,并在使用生产数据库时立即关闭。Spring Boot提供自动配置的嵌入式数据库有H2、HSQL、Derby,你不需要提供任何连接配置就能使用
NEVER 不要初始化数据源。

当我们在开发的过程中,可以先设置为ALWAYS,待初始化完成后就更改为NEVER,避免测试数据的丢失。

同时以上配置适用于Spring Boot 2.0以后的版本,对于2.0之前的版本,需要将配置initialization-mode更改为配置spring.datasource.initialize=true,其他配置基本一致。

创建Controller

helloController.java

/**
 * @Author: 公众号: Newtol
 * @Description: 
 * @Date: Created in 20:57 2018/9/19
 */
@RestController
public class HelloController {

    @Autowired
    JdbcTemplate jdbcTemplate;

    @GetMapping("/test")
    public Map<String,Object> hello(){
        List<Map<String,Object>> list = jdbcTemplate.queryForList("SELECT * FROM organization");   //查询数据库中的所有数据
        return list.get(0);   //打印第一条查询结果

    }
}

直接启动项目,访问localhost:9090/test
在这里插入图片描述
数据查询成功。

总结

我们介绍了有关Spring Boot整合JDBC Template,我们使用JDBC Template和直接使用JDBC区别不大,只是JDBC Template将数据库连接方面进行了自己的封装。以及在使用Spring Boot的数据库初始化的过程中一定要注意因为版本的不同而带来的不同配置。

源码地址

源码地址

联系作者

有关转载、错误指正、问题咨询等事宜请扫码关注个人公众号进行联系,更有大量视频学习资源分享
原文地址:https://www.cnblogs.com/newtol/p/10159082.html