今天遇到一个问题,公司项目使用的spring boot 2.0,数据库是使用h2,这个项目是单机项目,每天电脑上面部署一个项目,每台电脑都有一个单独的数据库。
每次当新版本如果有新增表或者表字段时,都需要客户方把数据库删除,重新启动项目,项目会自动把数据库表创建出来,这么做,在测试阶段当然可以,但是在正式使用时,就不行了。
这个时候,就需要客户拿到新版本的项目时,启动项目,就可以把缺少的表和一些表的字段,自动新增到数据里面,这样客户的数据库数据就不会丢失了。
项目启动,新增数据库表:
配置文件:
spring.datasource.schema=classpath:create_table.sql #初始化执行sql语句
create_table.sql
-- 2019年06月03日,新增的表:LAMP_CONFIG
-- 判断表是否存在,如果不存在就创建
CREATE TABLE IF NOT EXISTS `LAMP_CONFIG` (
ID INT PRIMARY KEY,
create_date timestamp(26,6),
angle integer(10)
);
项目启动,修改表的字段:
使用这个功能,需要引入spring boot关于jdbc的包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
/**
* 用于项目启动后,新增数据库中表的字段。create_table.sql 文件是用来新建数据表。
* 创建顺序:create_table.sql执行 》 当前类的执行
* 这个功能是因为客户需要系统无缝升级,就是当发布了一个新的版本后,如果新版本有新增了表,或者需要给表新增字段、删除字段等,就需要用到这个地方了。
*/
@Component
public class CreateColumnConfig {
@Autowired
private JdbcTemplate jdbcTemplate;
//当系统启动成功后,执行。
@PostConstruct
void init() {
//2019年06月03日,表 LAMPS 新增 ERROR_CODE 字段
//判断字段是否存在
Integer i = jdbcTemplate.queryForObject("select count(*) from information_schema.columns where table_name = 'LAMPS' and column_name = 'ERROR_CODE';", Integer.class);
if (i == 0){
//新增字段
jdbcTemplate.execute("alter table lamps ADD error_code integer(10);");
}
//2019年06月03日,表 LAMPS 新增 TEMPERATURE 字段
i = jdbcTemplate.queryForObject("select count(*) from information_schema.columns where table_name = 'LAMPS' and column_name = 'TEMPERATURE';", Integer.class);
if (i == 0){
jdbcTemplate.execute("alter table lamps ADD temperature integer(10);");
}
}
}
如果大家有更好的实现方式,欢迎给我留言,谢谢。