1. 简介
- 对于DAO层,SQL or NoSQL,Spring Boot默认在底层使用 Spring Data 的方式进行统一处理,通过各种xxxTemplate,xxxRepository简化对DAO层的操作。
- 与DAO层有关的starter,使用spring-boot-starter-data-{数据交互产品}进行命名如spring-boot-starter-data-jdbc等。
2.整合原生JDBC(需要导入jdbc模块和对应数据库驱动模块)
2.1 简单配置(映射绑定的是DataSourceProperties)
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: sysadmin
url: jdbc:mysql://localhost:3306/mybatis
效果:默认使用 org.apache.tomcat.jdbc.pool.DataSource
@ConfigurationProperties(
prefix = "spring.datasource"
)
public class DataSourceProperties implements BeanClassLoaderAware, EnvironmentAware, InitializingBean {
private ClassLoader classLoader;
private Environment environment;
private String name = "testdb";
private boolean generateUniqueName;
private Class<? extends DataSource> type;
private String driverClassName;
private String url;
private String username;
private String password;
private String jndiName;
private boolean initialize = true;
private String platform = "all";
private List<String> schema;
private String schemaUsername;
private String schemaPassword;
private List<String> data;
private String dataUsername;
private String dataPassword;
private boolean continueOnError = false;
private String separator = ";";
private Charset sqlScriptEncoding;
private EmbeddedDatabaseConnection embeddedDatabaseConnection;
private DataSourceProperties.Xa xa;
private String uniqueName;
//... ...
}
2.2. 数据源自动配置原理(相关类都在org.springframework.boot.autoconfigure.jdbc下)
-
参考DataSourceConfiguration,根据@ConditionalOnClass即导入的依赖情况和@ConditionalOnProperty(spring.datasource.type)来选择创建哪种数据源,默认使用Tomcat连接池。
(1)Spring Boot默认支持:org.apache.tomcat.jdbc.pool.DataSource/HikariDataSource/BasicDataSource(dbcp和dbcp2)。
(2)自定义数据源的原理@ConditionalOnMissingBean({ DataSource.class}) @ConditionalOnProperty( name = { "spring.datasource.type"} ) static class Generic { Generic() { } @Bean public DataSource dataSource(DataSourceProperties properties) { //建造者模式创建数据源,利用BeanUtil反射创建相应Type的数据源,并绑定相关属性 return properties.initializeDataSourceBuilder().build(); } }
-
DataSourceAutoConfiguration向容器中添加了一个 DataSourceInitializer
(implements ApplicationListener),其作用包括:
(1) runSchemaScripts():应用启动时运行建表语句脚本,这些文件命名模式为schema-*.sql,默认为schema-all.sql。(注意,每次重启时都会删掉同名旧表创建新表。第二次启动前应该删掉这段配置。)private void runSchemaScripts() { List<Resource> scripts = this.getScripts("spring.datasource.schema", this.properties.getSchema(), "schema"); if (!scripts.isEmpty()) { String username = this.properties.getSchemaUsername(); String password = this.properties.getSchemaPassword(); this.runScripts(scripts, username, password); try