springboot初始化数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot初始化数据相关的知识,希望对你有一定的参考价值。

参考技术A 1、application.properties需设置spring.jpa.hibernate.ddl-auto=create;

2、springboot会通过实体类创建表;

3、再执行import.sql。

所以,只要有实体类user存在,则可以在import.sql中直接使用insert语句插入数据到user表即可,不需要在import.sql中定义创建user表的ddl语句。(import.sql中是可以定义create等ddl语句的,不单只能insert操作。)

1、在application.properties修改以下内容:

2、在src/main/resources目录下新建import.sql(名字一定要是import.sql),内容如下

3、启动应用,进行初始化数据

4、启动完成后,停止应用,修改spring.jpa.hibernate.ddl-auto=create成spring.jpa.hibernate.ddl-auto=update后,再次启动应用。即spring.jpa.hibernate.ddl-auto设置成update时,import.sql不会执行。

缺点:第一次执行,导入数据后。需要将spring.jpa.hibernate.ddl-auto=create设置成spring.jpa.hibernate.ddl-auto=update。不然第二次执行,会因spring.jpa.hibernate.ddl-auto设置是create值,先drop表,再创建表,导致第一次启动应用后的数据丢失。(比如,新增了另一个用户,就这样在第二次启动应用丢失了)

1、在application.properties新增以下内容:

2、在src/main/resources目录下新建schema.sql(名字可以自定义)、data.sql(名字可以自定义)。

3、启动应用,进行初始化数据

4、启动完成后,停止应用,步骤一设置的 spring.datasource.initialization-mode 等注释掉。

再次启动应用。使用jdbc方式,不跟spring.jpa.hibernate.ddl-auto值有关系,无论是create和update都不影响jdbc这种初始化方式。

第一种方式启动的时候jpa会根据实体类创建表,import.sql负责初始化数据(insert等操作)。

第二种方式启动的时候,不会创建表,需要在初始化脚本schema.sql,data.sql中判断是否存在表,再初始化脚本中的步骤。

如果使用jpa的话,那就选择第一种方式;如果使用的mybatis,则可选择第二种方式。

springboot初始化数据库+druid解密

1.xml配置数据库连接配置

#数据源配置
spring.datasource.username=beebotlark
spring.datasource.password=WDShxRWTLSuKM6ucPN4E8hi0YWglium26wJVKitxRpzN2sopztgZpvgi4YFnuPXrAiLPMjuzgYK13we5SEwIHQ==spring.datasource.url=localhost:3306/local?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.is-init=false
spring.datasource.init_file_name=DML,DDL
#公钥
spring.datasource.public-key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAN/HfAEsiZ/uXs3/wKTa6BSUr/6QF/sAcHIoHMO56TFiNDPXpnwtsUC5JJDu1rq9kxU0Ilc0CVEYZ5g5aD23ZVkCAwEAAQ==
#配置解密
spring.datasource.druid.filters=config
spring.datasource.druid.connection-properties=config.decrypt=true;config.decrypt.key=${spring.datasource.public-key}

2.创建DruidConfig配置类

@Configuration
public class DruidConfig{

}

3.注入配置文件中的数据库配置

 /**
     * datasourceUrl 连接数据库url
     */
    @Value("${spring.datasource.url}")
    private String datasourceUrl;

    /**
     * driverClassName 数据库驱动
     */
    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;
    /**
     * datasourceUserName 连接数据库的用户名
     */
    @Value("${spring.datasource.username}")
    private String datasourceUserName;

    /**
     * databasePassword 连接数据库密码
     */
    @Value("${spring.datasource.password}")
    private String databasePassword;

    /**
     * 注入数据库公钥
     */
    @Value("${spring.datasource.public-key}")
    private String datasourcePublicKey;

4.调用druid公钥+密码钥进行解密,并执行创建数据库语句

/**
     * @return dataSource
     * @description 配置数据库自动创建
     * 如果连接地址没有对应的数据库则创建,前提是有root账号,或者是非root账号具有建库的权限
     */
    @Bean
    public DataSource dataSourceConfig() {
        DruidDataSource dataSource = new DruidDataSource();
        String decrypt = null;
        //druid解密
        try {
            decrypt = ConfigTools.decrypt(datasourcePublicKey, databasePassword);
        } catch (Exception e) {
            log.error("公钥解密异常:{}", e.getMessage());
        }
        dataSource.setUrl(datasourceUrl);
        dataSource.setUsername(datasourceUserName);
        //将解密后的密码添加到datasource源
        dataSource.setPassword(decrypt);
        dataSource.setDriverClassName(driverClassName);
        Connection connection = null;
        PreparedStatement state = null;
        try {
            Class.forName(driverClassName);
            // 截取数据库问问好前的连接参数
            String sqlUrl = datasourceUrl.substring(0, datasourceUrl.indexOf("?"));
            // 获取连接数据库的url
            String databasesUrl = sqlUrl.substring(0, sqlUrl.lastIndexOf("/"));
            // 截取数据库名
            String databaseName = sqlUrl.substring(sqlUrl.lastIndexOf("/") + 1);
            // 创建连接
            connection = DriverManager.getConnection(databasesUrl, datasourceUserName, decrypt);
            // 创建传输通道,并设置占位符
            String sql = "create database if not exists ? default character set utf8 COLLATE utf8_general_ci";
            state = connection.prepareStatement(sql);
            // 将数据库名注入到占位符
            state.setString(1, databaseName);
            // 获取到注入的sql语句
            String resultSql = ((ClientPreparedStatement) state).asSql();
            String executeSql = resultSql.replaceAll("\'", "`");
            int execute = state.executeUpdate(executeSql);
            log.info("sql语句执行状态:{}", execute);
        } catch (Throwable e) {
            log.error("数据库连接异常:{}", e.getMessage());
        } finally {
            try {
                if (null != state) {
                    state.close();
                }
                if (null != connection) {
                    connection.close();
                }
            } catch (SQLException throwable) {
                log.error("sql语句异常:{}", throwable.getMessage());
            }
        }
        return dataSource;
    }

以上是关于springboot初始化数据的主要内容,如果未能解决你的问题,请参考以下文章

springboot初始化数据

SpringBoot—数据库初始化脚本配置

springboot启动之后初始化数据的几种方法

SpringBoot程序启动时执行初始化代码

SpringBoot 初始化之7招式

SpringBoot初始教程之数据库连接池(druid)