Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringBoot系列之数据库初始化-datasource配置方式

SpringBoot系列之数据库初始化-datasource配置方式

作者头像
一灰灰blog
发布于 2022-12-29 06:54:53
发布于 2022-12-29 06:54:53
2.4K00
代码可运行
举报
文章被收录于专栏:小灰灰小灰灰
运行总次数:0
代码可运行

在我们的日常业务开发过程中,如果有db的相关操作,通常我们是直接建立好对应的库表结构,并初始化对应的数据,即更常见的情况下是我们在已有表结构基础之下,进行开发; 但是当我们是以项目形式工作时,更常见的做法是所有的库表结构变更、数据的初始、更新等都需要持有对应的sql变更,并保存在项目工程中,这也是使用liqubase的一个重要场景; 将上面的问题进行简单的翻译一下,就是如何实现在项目启动之后执行相应的sql,实现数据库表的初始化?

本文将作为初始化方式的第一篇:基于SpringBoot的配置方式实现的数据初始化

<!-- more -->

I. 项目搭建

1. 依赖

首先搭建一个标准的SpringBoot项目工程,相关版本以及依赖如下

本项目借助SpringBoot 2.2.1.RELEASE + maven 3.5.3 + IDEA进行开发

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
</dependencies>

本文使用MySql数据库, 版本8.0.31

2. 配置

注意实现初始化数据库表操作的核心配置就在下面,重点关注

配置文件: resources/application.yml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 默认的数据库名
database:
  name: story

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/${database.name}?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password:
    initialization-mode: always
    platform: mysql
    separator: ;
    data: classpath:config-data.sql
    #data-username: root
    #data-password:
    schema: classpath:config-schema.sql # schema必须也存在,若只存在data,data中的sql也不会被执行

# springboot 2.7+ 版本使用下面这个
#  sql:
#    init:
#      mode: always
#      data-location: classpath:config-data.sql
#      schema-location: classpath:init-schema.sql
logging:
  level:
    root: info
    org:
      springframework:
        jdbc:
          core: debug

上面的配置中,相比较于普通的数据库链接配置,多了几个配置项

  • spring.datasource.initialization-mode: 取值为 always,改成其他的会导致sql不会被执行
  • spring.datasource.platform: mysql
  • spring.datasource.seprator: ; 这个表示sql之间的分隔符
  • spring.datasource.data: classpath:config-data.sql 取值可以是数组,这里存的是初始化数据的sql文件地址
  • spring.datasource.data-username: 上面data对应的sql文件执行用户名
  • spring.datasource.data-password: 上面data对应的sql文件执行用户密码
  • spring.datasource.schema: classpath:config-schema.sql 取值也可以是数组,这里存的是初始化表结构的sql文件地址

3. 初始化sql

上面指定了两个sql,一个是用于建表的ddl,一个是用于初始化数据的dml

resources/config-schema.sql 文件对应的内容如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE `user2`
(
    `id`               int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `third_account_id` varchar(128) NOT NULL DEFAULT '' COMMENT '第三方用户ID',
    `user_name`        varchar(64)  NOT NULL DEFAULT '' COMMENT '用户名',
    `password`         varchar(128) NOT NULL DEFAULT '' COMMENT '密码',
    `login_type`       tinyint      NOT NULL DEFAULT '0' COMMENT '登录方式: 0-微信登录,1-账号密码登录',
    `deleted`          tinyint      NOT NULL DEFAULT '0' COMMENT '是否删除',
    `create_time`      timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `update_time`      timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
    PRIMARY KEY (`id`),
    KEY                `key_third_account_id` (`third_account_id`),
    KEY                `user_name` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4  COMMENT='用户登录表';

resources/config-data.sql 文件对应的内容如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO `user2` (id, third_account_id, `user_name`, `password`, login_type, deleted)
VALUES (2, '222222-0f85-4dd5-845c-7c5df3746e92', 'admin2', 'admin2', 0, 0);

II. 示例

1. 验证demo

接下来上面的工作准备完毕之后,在我们启动项目之后,正常就会执行上面的两个sql,我们写一个简单的验证demo

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Slf4j
@SpringBootApplication
public class Application implements ApplicationRunner {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        List list = jdbcTemplate.queryForList("select * from user2 limit 2");
        log.info("启动成功,初始化数据: {}\n{}", list.size(), list);
    }
}

2. 问题记录

从上面的过程走下来,看起来很简单,但是在实际的使用过程中,很容易遇到不生效的问题,下面记录一下

2.1 只有初始化数据data.sql,没有schema.sql时,不生效

当库表已经存在时,此时我们可能并没有上文中的config-schema.sql文件,此时对应的配置可能是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/${database.name}?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password:
    initialization-mode: always
    platform: mysql
    separator: ; # 默认为 ;
    data: classpath:config-data.sql
    #data-username: root
    #data-password:
    #schema: classpath:config-schema.sql # schema必须也存在,若只存在data,data中的sql也不会被执行

如上面所示,当我们只指定了data时,会发现data对应的sql文件也不会被执行;即要求schema对应的sql文件也必须同时存在

针对上面这种情况,可以考虑将data.sql中的语句,卸载schema.sql中

2.2 版本问题导致配置不生效

在SpringBoot2.5+版本,使用 spring.sql.init 代替上面的配置项

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# springboot 2.5+ 版本使用下面这个
spring:
  sql:
    init:
      mode: always
      data-location: classpath:config-data.sql
      schema-location: classpath:init-schema.sql

相关的配置参数说明如下

  • spring.sql.init.enabled:是否启动初始化的开关,默认是true。如果不想执行初始化脚本,设置为false即可。通过-D的命令行参数会更容易控制。
  • spring.sql.init.usernamespring.sql.init.password:配置执行初始化脚本的用户名与密码。这个非常有必要,因为安全管理要求,通常给业务应用分配的用户对一些建表删表等命令没有权限。这样就可以与datasource中的用户分开管理。
  • spring.sql.init.schema-locations:配置与schema变更相关的sql脚本,可配置多个(默认用;分割)
  • spring.sql.init.data-locations:用来配置与数据相关的sql脚本,可配置多个(默认用;分割)
  • spring.sql.init.encoding:配置脚本文件的编码
  • spring.sql.init.separator:配置多个sql文件的分隔符,默认是;
  • spring.sql.init.continue-on-error:如果执行脚本过程中碰到错误是否继续,默认是false`
2.3 mode配置不对导致不生效

当配置完之后发,发现sql没有按照预期的执行,可以检查一下spring.datasource.initialization-mode配置是否存在,且值为always

2.4 重复启动之后,报错

同样上面的项目,在第一次启动时,会执行schema对应的sql文件,创建表结构;执行data对应的sql文件,初始化数据;但是再次执行之后就会报错了,会提示表已经存在

即初始化是一次性的,第一次执行完毕之后,请将spring.datasource.initialization-mode设置为none

3. 小结

本文主要介绍了项目启动时,数据库的初始化方式,当然除了本文中介绍的spring.datasource配置之外,还有spring.jpa的配置方式

对于配置方式不太友好的地方则在于不好自适应控制,若表存在则不执行;若不存在则执行;后面将介绍如何使用DataSourceInitializer来实现自主可控的数据初始化,以及更现代化一些的基于liquibase的数据库版本管理记录

III. 不能错过的源码和相关知识点

0. 项目

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringBoot系列之数据库初始化-jpa配置方式
上一篇博文介绍如何使用spring.datasource来实现项目启动之后的数据库初始化,本文作为数据库初始化的第二篇,将主要介绍一下,如何使用spring.jpa的配置方式来实现相同的效果
一灰灰blog
2022/12/29
1.2K0
SpringBoot系列之数据库初始化-jpa配置方式
SpringBoot2.x自动创建表并初始化数据库
1、使用springboot jdbc初始化数据库 项目结构: 1.1 application.yml配置文件: spring: datasource: username: root password: 123456 url: jdbc:mysql://192.168.56.101:3306/jdbc driver-class-name: com.mysql.cj.jdbc.Driver initialization-mode: always s
别团等shy哥发育
2023/02/25
4920
SpringBoot2.x自动创建表并初始化数据库
Spring Boot 2.5.0 重新设计的spring.sql.init 配置有啥用?
前几天Spring Boot 2.5.0发布了,其中提到了关于Datasource初始化机制的调整,有读者私信想了解这方面做了什么调整。那么今天就要详细说说这个重新设计的配置内容,并结合实际情况说说我的理解和实践建议。
程序猿DD
2021/06/08
2K0
Springboot启动(DataSources创建时)执行初始化SQL脚本 – 源码剖析 – 超级干货
很多开源项目我们没有导入SQL进入数据库,但是项目一旦启动,就会替我们执行初始化数据了。我们今天来分析是如何实现的。
收心
2022/11/18
5.4K0
SpringBoot高级篇DB之基本使用
现在的完整的后端项目,基本上离不开DB、缓存,接下来开始进入DB篇的系列教程,首先确定我们的目标,一个是知道怎么配置,怎么用;接着就是更高级一点的多个数据源的配置,使用不同的方式来实现CURD(如Mybatis, JPDA, MyCat, Hibernate, Jooq等),数据库不得不谈到的事物管理,锁机制,以及高级一点的分库分表等;然后再进一步则是优秀的框架的学习了,大名鼎鼎的MyBaits的设计思路,Jooq的使用姿势也特别有意思
一灰灰blog
2019/03/14
1.4K0
SpringBoot高级篇DB之基本使用
实现启动项目时数据库表初始化,基于注解实现mybatis查询
之前写了一篇spring boot 2版本以上基于xml实现mybatis查询的文章,这次实现一下基于注解的mybatis查询,同时实现一下启动项目时初始化数据库表,实现这两个功能以后,该demo就即可以支持xml查询,也可以基于注解实现查询。项目地址如下,需要切换到zhujie-mybatis分支。
jiankang666
2022/05/12
6850
实现启动项目时数据库表初始化,基于注解实现mybatis查询
初始化数据库和导入数据
在Spring Boot应用的测试一文中,我们在StarterRunner类的run(...)方法中给数据库中添加一些初始数据。尽管通过编程方式添加初始数据比较快捷方便,但长期来看这并不是一个好办法——特别是当需要添加的数据量很大时。我们开发最好把数据库准备、数据库修改和数据库的配置与将要运行的程序代码分离,尽管这仅仅是为测试用例做准备。Spring Boot已经提供了相应的支持来完成这个任务。
阿杜
2018/08/06
1.8K0
springboot启动时候自动创建数据库表解决方案
首先创建一个springboot的项目 项目结构 [在这里插入图片描述] 导入相关依赖 mybatis druid mysql驱动三个 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</group
知识浅谈
2021/09/16
2.1K0
springboot启动时候自动创建数据库表解决方案
在Spring Boot中加载初始化数据
在Spring Boot中,Spring Boot会自动搜索映射的Entity,并且创建相应的table,但是有时候我们希望自定义某些内容,这时候我们就需要使用到data.sql和schema.sql。
程序那些事
2020/07/07
1.3K0
第十五节:SpringBoot使用JPA访问数据库
JPA是Java Persistence API的简写,是官方提出的一种ORM规范! JPA规范,都在包路径:javax.persistence.*下,像一些常用的如:@Entity、@Id及@Transient都在此路径下。这些也是一些现在市面上常用的ORM一些约定俗成的注解了。 Spring Data JPA是Spring基于Hibernate开发的一个JPA框架。可以极大的简化JPA的写法,可以在几乎不用写具体代码的情况下,实现对资料的访问和操作。除了「CRUD」外,还包括如分页、排序等一些常用的功能
入门笔记
2022/02/23
7770
第十五节:SpringBoot使用JPA访问数据库
spring boot 项目中自动执行 sql 语句
在 properties 或 yaml 文件里面,添加以下配置(以 yaml 配置文件为例):
create17
2020/08/25
2.1K0
spring boot 项目中自动执行 sql 语句
SpringBoot和Mybatis配置多数据源连接多个数据库
目前业界操作数据库的框架一般是 Mybatis,但在很多业务场景下,我们需要在一个工程里配置多个数据源来实现业务逻辑。在SpringBoot中也可以实现多数据源并配合Mybatis框架编写xml文件来执行SQL。在SpringBoot中,配置多数据源的方式十分便捷,
java之旅
2020/01/08
16.6K2
SpringBoot数据库配置源码解析:自动配置注解解析
Spring Boot 对主流的数据库都提供了很好的支持,打开 Spring Boot 项目中的 starters 会发现针对 data 提供了 15 个 starter 的支持,包含了大量的关系型数据库和非关系数据库的数据访问解决方案。而本章重点关注 Spring Boot 中数据源自动配置源码的实现,及核心配置类 DataSourceAutoConfiguration 和 Jdbc TemplateAutoConfiguration 等的用法。
愿天堂没有BUG
2022/10/28
1.1K0
SpringBoot数据库配置源码解析:自动配置注解解析
一起来学SpringBoot | 第二十四篇:数据库管理与迁移(Liquibase)
目前 SpringBoot 支持较好的两款工具分别是 flyway、 liquibase,支持 sql script,在初始化数据源之后执行指定的 脚本代码或者 脚本文件,本章基于 Liquibase...
battcn
2018/08/03
2.1K0
一起来学SpringBoot | 第二十四篇:数据库管理与迁移(Liquibase)
一文读懂SpringBoot持久层开发原理
SpingBoot持久层开发原理 1. JDBC “SpringBoot关于数据库的配置都存在于org.springframework.boot.autoconfigure.jdbc 关于数据库的相关配置存放于DataSourceProperties中 @ConfigurationProperties( prefix = "spring.datasource" ) public class DataSourceProperties implements BeanClassLoaderAware, I
石的三次方
2021/01/05
9810
SpringBoot与数据访问
​ 1. 默认使用 com.zaxxer.hikari.HikariDataSource 作为数据源(springBoot 的版本为:2.3.3);
OY
2022/03/12
4330
SpringBoot与数据访问
H2 数据库
H2 是标准 SQL 的关系型数据库,由 java 编写,整个 H2 是一个 jar 包(大约 2.5MB),其开源且使用 JDBC API 进行调用。其主要特性如下:
晚上没宵夜
2022/09/07
1.2K0
SpringBoot整合Flyway(数据库版本迁移工具)
在团队开发当中,有可能每个人都是使用自己本地的数据库。当数据库的表或者字段更新时,往往需要告知团队的其他同事进行更新。 Flyway数据库版本迁移工具,目的就是解决该问题而诞生的(我自己想的)。每当我们更新数据库的时候,只需要添加SQL文件到指定目录中。Flyway会在数据库创建一个表,专门记录已更新的SQL文件。当我们下次执行时则不会执行已记录并且执行成功的SQL文件。
Johnson木木
2020/06/04
1.7K0
SpringBoot配置使用H2数据库
自动去创建数据库,借用Spring Data Jpa的注解,启动时自动创建内存数据库
是小张啊喂
2021/08/10
4K0
SpringBoot配置使用H2数据库
spring boot 配置属性大全(1)
1.核心属性 键 默认值 描述 debug false 启用调试日志。 info.* 要添加到信息端点的任意属性。 logging.config 日志记录配置文件的位置。例如,用于logback的`classpath:logback.xml`。 logging.exception-conversion-word %wEx 记录异常时使用的转换字。 logging.file.clean-history-on-start false 是否在启动时清除存档日志文件。仅默认登录设置支持。 logging.fi
gemron的空间
2020/02/24
3.7K0
spring boot 配置属性大全(1)
推荐阅读
相关推荐
SpringBoot系列之数据库初始化-jpa配置方式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验