SpringBoot 시리즈 JDBC 데이터 액세스

SpringBoot 시리즈 JDBC 데이터 액세스

SpringBoot JDBC는 더 잘 이해 도움이 학습자에게 기대하고, 더 일반적으로 사용되는 내용이 블로그와 단순히 실험의 방법으로 소스 코드와 함께 소개입니다

환경을 준비 :

  • 생각
  • 메이븐

먼저 새 프로젝트를 만들 :

새로 만들기 -> 프로젝트 또는 모듈 -> 봄 초기화
그림 삽입 설명 여기
선택과 MySQL의 JDBC 드라이버 등의 테스트를 용이하게하는 방법은 웹으로부터 선택 될 수있다
그림 삽입 설명 여기

프로젝트가 성공적으로 생성 후에는 자동으로 다음과 같은 구성을 동반합니다 :

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

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

새 구성 파일을 만들 Application.yml :

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://127.0.0.1:3306/springboot
    driver-class-name: com.mysql.jdbc.Driver

테스트하기위한 JUnit 테스트 클래스를 만듭니다 :

package com.example.springboot.jdbc;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

@SpringBootTest
class SppringbootJdbcApplicationTests {

    @Autowired
    DataSource dataSource;

    @Test
    public void contextLoads() throws SQLException {
        System.out.println(dataSource.getClass());
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
        connection.close();
    }

}

디버깅을 시작하고 콘솔은 예외 정보를 던졌습니다 발견

Caused by: com.mysql.cj.exceptions.UnableToConnectException: CLIENT_PLUGIN_AUTH is required
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:85)
at com.mysql.cj.protocol.a.NativeAuthenticationProvider.connect(NativeAuthenticationProvider.java:205)
at com.mysql.cj.protocol.a.NativeProtocol.connect(NativeProtocol.java:1340)
at com.mysql.cj.NativeSession.connect(NativeSession.java:157)
at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:956)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826)
... 90 more

原因是我的mysql服务器是5.+版本,而最新版2.2.1默认配置的mysql驱动版本是8.+的,8.+的驱动类是com.mysql.cj.jdbc.Driver,而非com.mysql.jdbc.Driver,所以解决方法还是手动加一下mysql驱动版本

<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.27</version>
            <scope>runtime</scope>
        </dependency>

ok,现在正常测试,测试通过:

class com.zaxxer.hikari.HikariDataSource
2019-12-14 15:47:25.241 INFO 6772 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2019-12-14 15:47:27.403 INFO 6772 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
HikariProxyConnection@23906266 wrapping com.mysql.jdbc.JDBC4Connection@717ed

可以看出2.2.1版本的Springboot默认数据源类是class com.zaxxer.hikari.HikariDataSource,而1.+版本很多都是以org.apache.tomcat.jdbc.pool.DataSource.class为默认数据源类的,具体哪个版本开始改变的不清楚

既然Springboot默认使用hikari数据源,那就可以加上hikari的一些自定义配置

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/springboot?characterEncoding=utf8&useSSL=true
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
    initialization-mode: always
    type: com.zaxxer.hikari.HikariDataSource

    hikari:
      jdbc-url: jdbc:mysql://127.0.0.1:3306/springboot?characterEncoding=utf8&useSSL=true
      minimum-idle: 5
      maximum-pool-size: 15
      auto-commit: true
      idle-timeout: 30000
      pool-name: DatebookHikariCP
      max-lifetime: 1800000
      connection-timeout: 30000
      connection-test-query: select 1

经过调试,属性配置是有起效的
그림 삽입 설명 여기
ok,掌握简单应用之后,还是要跟一下源码,依照经验,找到对应的自动配置类DataSourceAutoConfiguration.java

不需要全部看懂源码,只要找到关键的信息即可,如图在这个自动配置类路其实就可以看出Springboot2.2.1支持的数据源种类有如下:
그림 삽입 설명 여기
点一下DataSourceConfiguration类,里面都是各种DataSource的配置,用了很多@Conditional注解,条件符合才会起效
그림 삽입 설명 여기
然后为什么说2.2.1版本默认是Hikari作为Datasource的?可以看一下项目的依赖图,可以看出默认引入了Hikari的jar
그림 삽입 설명 여기
而且条件都符合,所以HikariDataSource就会进行自动配置
그림 삽입 설명 여기
源码里用import引入了一个DataSourceInitializationConfiguration类,看其命名,应该是个初始化配置类
그림 삽입 설명 여기
挑重点,如图,很明显要用了Spring框架很重要的后置处理器,还有一个DataSourceInitializerInvoker类
그림 삽입 설명 여기
DataSourceInitializerInvoker类是做什么的?看其源码应该是一个初始化操作的监听器类,主要操作由DataSourceInitializer执行
그림 삽입 설명 여기
DataSourceInitializer源码,里面有很多操作都是进行schema脚本的操作,只要非isEnabled就可以执行
그림 삽입 설명 여기
只要两个条件符合就执行,DataSourceInitializationMode属性,看起来是通过配置文件获取的
그림 삽입 설명 여기
getScripts,获取对应的脚本
그림 삽입 설명 여기
读取schema脚本,所以可以看出只要将一些sql文件放在resources即可,默认命令为schema.sql,schema‐all.sql;
그림 삽입 설명 여기
데이터를 통해,이 클래스가하는 것을 확인하는 응용 프로그램의 도움말에 따라 몇 가지 초기 스키마 스크립트를 수행하는 것입니다, 속성을 발견, 당신은 항상 변경할 수 있습니다
그림 삽입 설명 여기

이있는 소스 코드 않지만 대신 수행되지 매립
그림 삽입 설명 여기
뿐만 아니라 키 코드 구성 spring.datasource.schema로부터 정보를 획득하기 위해,

List<Resource> scripts = getScripts("spring.datasource.schema", this.properties.getSchema(), "schema");

그림 삽입 설명 여기

private List<Resource> getResources(String propertyName, List<String> locations, boolean validate) {
        List<Resource> resources = new ArrayList<>();
        for (String location : locations) {
            for (Resource resource : doGetResources(location)) {
                if (resource.exists()) {
                    resources.add(resource);
                }
                else if (validate) {
                    throw new InvalidConfigurationPropertyValueException(propertyName, resource,
                            "The specified resource does not exist.");
                }
            }
        }
        return resources;
    }

위치는 구성이 고정 된 또는 스키마 스크립트를 사용자 정의 할 수 있습니다 분명히 사용할 수 없습니다 스키마 all.sql schema.sql 위치 정보의 문자 유형
그림 삽입 설명 여기

추천

출처www.cnblogs.com/mzq123/p/12041372.html