基于Spring Boot的数据库初始化(一)

Java 0 7090

基于Spring Boot的数据库初始化(一)

本篇文章介绍了在不使用JPA的情况下如何通过Spring来达到初始化数据库的目的.

为了简化项目的部署步骤, 笔者的lore-blog项目运营后会自动进行数据库的初始化工作, 包括创建数据库初始化数据库中的表. 你唯一要做的就是准备好一个可以正常运行的MySql. 如果你使用Docker容器部署, 那么连数据库也不用准备了.

通过翻阅Spring Boot官方文档Database Initialization章节可以看到Spring介绍了3种初始化数据库的方式:

  1. Initialize a Database Using JPA
  2. Initialize a Database Using Hibernate
  3. Initialize a Database

lore-blog 没有使用JPA而是MyBatis-Plus所以前两个就不用看了, 我们直接看第3个.

Spring Boot can automatically create the schema (DDL scripts) of your DataSource and initialize it (DML scripts). It loads SQL from the standard root classpath locations: schema.sql and data.sql, respectively. In addition, Spring Boot processes the schema-${platform}.sql and data-${platform}.sql files (if present), where platform is the value of spring.datasource.platform. This allows you to switch to database-specific scripts if necessary. For example, you might choose to set it to the vendor name of the database (hsqldb, h2, oracle, mysql, postgresql, and so on).

Spring Boot automatically creates the schema of an embedded DataSource. This behaviour can be customized by using the spring.datasource.initialization-mode property. For instance, if you want to always initialize the DataSource regardless of its type:

spring.datasource.initialization-mode=always

介绍的超级简单, 不过足够了让我们知道有这个功能就可以, 毕竟还有源代码可以窥探细节. 通过DataSourceProperties.java类或者IDEA的智能提示可以发现有如下相关配置. IDEA

// Initialize the datasource with available DDL and DML scripts.
spring.datasource.initialization-mode
// Schema (DDL) script resource references.
spring.datasource.schema
// Username of the database to execute DDL scripts (if different).
spring.datasource.schema-username
// Password of the database to execute DDL scripts (if different).
spring.datasource.schema-password
// Data (DML) script resource references.
spring.datasource.data
// Username of the database to execute DML scripts (if different).
spring.datasource.data-username
// Password of the database to execute DML scripts (if different).
spring.datasource.data-password
// Fully qualified name of the connection pool implementation to use.
// By default, it is auto-detected from the classpath.
spring.datasource.type
// JDBC URL of the database.
spring.datasource.url

上面大多数配置项都没有什么额外好说的, 通过注释就能理解个七七八八了. 但是有两个配置项要拿出来说说.

关于spring.datasource.initialization-mode

这个配置项的值是枚举类型

// Always initialize the datasource.
DataSourceInitializationMode.ALWAYS
// Only initialize an embedded datasource.
DataSourceInitializationMode.EMBEDDED
// Do not initialize the datasource.
DataSourceInitializationMode.NEVER

这意味着要么总是执行初始化, 要么永不执行, 或者使用嵌入式数据库时才执行. 你想动态根据某个状态去动态决定执行与否, 对不起常规办法不行, 但是可以通过一些hack方法来实现. 我将在下一篇文章基于Spring Boot的数据库初始化(二)中介绍. Spring之所以没提供这个功能应该是这个数据库初始化功能只是为了测试环境场景而设计.

关于spring.datasource.type

这个配置项用于指定连接池, 如果你配置了其它连接池比如Druid, Hikari那么这个配置项也可以省略. 初始化工作将使用你配置的连接池. 如果即配置了其它连接池又配置了这个属性, 那么将使用只是用这个配置项指定的连接池进行数据库的初始化工作. 且这个连接池在结束初始化工作后, 你并没有方法去关闭它. 直到现在我仍然没有找到关闭它的方法, 在我认为初始化工作结束后这个连接池就没有任何继续存在的意义了, 不是吗?

下面是Lore-Blog中的配置片段

spring.datasource:
  # 这个值会被动态修改
  initialization-mode: always
  schema-username: root
  schema-password: root
  sql-script-encoding: UTF-8
  schema:
    - classpath:db/schema-mysql.sql
    - file:./change-passwd.sql
  data: classpath:db/data-mysql.sql
  type: com.zaxxer.hikari.HikariDataSource
  url: jdbc:mysql://127.0.0.1:3306/sys?serverTimezone=GMT%2B8
  druid:
    url: jdbc:mysql://127.0.0.1:3306/lore_blog
  ...
  ...
  ...  

本文为博主雨晨是大叔原创文章, 转载请附上原文出处链接:

来源: 雨晨是大叔的博客 developerchen.com/post/spring-boot-initialization-database

本文采用 知识共享署名4.0国际许可协议进行许可. 本站文章除注明转载/出处外, 均为本站原创或翻译,转载前请务必署名!