springboot初始化数据

初始化数据

  • 初始化数据分为jpa和JDBC两种方式。

  • 场景:个人博客项目,启动项目后,数据库user表自动创建用户:admin,密码:admin,该怎么处理?

jpa提供的import

执行过程:

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修改以下内容:

# 一定要设置成create,第二次启动程序前,设置成update
spring.jpa.hibernate.ddl-auto=create
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

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

USE  lifeassistant;
# DROP TABLE IF EXISTS `assistant_user`;
# CREATE TABLE `assistant_user` (`userid` bigint(20) NOT NULL AUTO_INCREMENT,`email` varchar(255) NOT NULL,`nick_name` varchar(255) DEFAULT NULL,`pass_word` varchar(255) NOT NULL,  `reg_time` varchar(255) NOT NULL,`user_name` varchar(255) NOT NULL,PRIMARY KEY (`userid`),UNIQUE KEY `UK_o77ap0bvrxaxwxw47n1hyt45w` (`email`),UNIQUE KEY `UK_83y7vvenwcl1jp0wy1s3xvtnw` (`user_name`),UNIQUE KEY `UK_np9hoj3ubl5wjjs3wuf1ec6oq` (`nick_name`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of assistant_user
-- ----------------------------
INSERT INTO `assistant_user` VALUES ('1', 'admin', 'admin', '[email protected]', '2020年3月21日 下午01时15分47秒', 'aa1');

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表,再创建表,导致第一次启动应用后的数据丢失。(比如,新增了另一个用户,就这样在第二次启动应用丢失了)

JDBC方式

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

# 一定要设置成always
spring.datasource.initialization-mode=always
spring.datasource.sql-script-encoding=utf-8
# schema.sql 一般放ddl语句,data.sql放insert语句。当然可以将data.sql的内容整合到schema.sql文件中,只设置spring.datasource.schema
spring.datasource.schema=classpath:schema.sql
spring.datasource.data=classpath:data.sql

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

  • schema.sql
USE  lifeassistant;
DROP TABLE IF EXISTS `assistant_user1`;
CREATE TABLE `assistant_user1` (`userid` bigint(20) NOT NULL AUTO_INCREMENT,`email` varchar(255) NOT NULL,`nick_name` varchar(255) DEFAULT NULL,`pass_word` varchar(255) NOT NULL,  `reg_time` varchar(255) NOT NULL,`user_name` varchar(255) NOT NULL,PRIMARY KEY (`userid`),UNIQUE KEY `UK_o77ap0bvrxaxwxw47n1hyt45w` (`email`),UNIQUE KEY `UK_83y7vvenwcl1jp0wy1s3xvtnw` (`user_name`),UNIQUE KEY `UK_np9hoj3ubl5wjjs3wuf1ec6oq` (`nick_name`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
  • data.sql
USE  lifeassistant;
INSERT INTO `assistant_user1` VALUES ('4', 'aa', 'aa123456', '[email protected]', '2020年3月21日 下午01时15分47秒', 'aa1');
INSERT INTO `assistant_user1` VALUES ('2', 'bb', 'bb123456', '[email protected]', '2020年3月21日 下午01时15分47秒', 'bb2');
INSERT INTO `assistant_user1` VALUES ('3', 'cc', 'cc123456', '[email protected]', '2020年3月21日 下午01时15分47秒', 'cc3');

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初始化数据)