初始化数据
初始化数据分为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,则可选择第二种方式。