1.问题
随着项目版本的迭代,有时候需要更新数据库如修改字段、更新数据、删除数据等等,但是如果系统已经部署到生产环境了,让开发人员连接生产环境的数据库手动处理是不太实际的,生产环境数据库一般不允许外部连接,而且这么处理效率太低也容易出错。
2.解决方案
在项目启动时进行数据库自动更新,更新后记录执行的sql方法名
2.1创建sql升级记录表
CREATE TABLE `sys_sql_upgrade_record` (
`id` varchar(100) NOT NULL COMMENT 'id',
`sqlKey` varchar(100) NOT NULL COMMENT 'sqlKey',
`createTime` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='sql升级记录';
2.2对sql升级记录表生成代码
我用的是Mybatis Plus框架,用mybatis-plus-generator
工具对sys_sql_upgrade_record表生成controller, entity, mapper, service代码
2.3配置sql升级
项目启动时执行sql升级操作,使用反射机制获取SqlUpgradeRecordMapper的全部自有方法,然后查询sys_sql_upgrade_record表所有的sqlKey,判断每个方法是否存在表中,不存在则用invoke执行,然后保存方法名到sys_sql_upgrade_record表
@Component
@Slf4j
public class CustomCommandLineRunner implements CommandLineRunner {
@Autowired
private SqlUpgradeRecordService sqlUpgradeRecordService;
@Override
public void run(String... args) throws Exception {
log.info("初始化");
try {
sqlUpgradeRecordService.executeSqlUpgrade();
} catch (Exception e) {<