spring boot 手动新增数据库表和数据库表字段

本文介绍如何在SpringBoot项目中实现无缝升级,通过在项目启动时自动新增数据库表和字段,确保客户数据不丢失。利用spring-boot-starter-jdbc依赖和自定义配置类,实现在不同版本间数据库结构的平滑迁移。

今天遇到一个问题,公司项目使用的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);");
        }

    }
}

如果大家有更好的实现方式,欢迎给我留言,谢谢。

 

### JeecgBoot关联字段配置教程 JeecgBoot 是一款功能强大且灵活的低代码开发平台,支持多种复杂的数据操作需求。对于多关联字段的配置,可以通过其内置的功能模块轻松实现。 #### 一、创建实体类并定义关系 在 `jeecg-boot` 中,通过 MyBatis-Plus 实现数据库映射 CRUD 操作非常方便。为了处理多之间的关联,在实体类中需要明确定义这些关系。例如: 假设存在两个格:订单 (`Order`) 用户 (`User`),其中订单属于某个特定用户,则可以在对应的实体类里设置外键约束以及相应的 getter/setter 方法来示这种一对多的关系[^1]。 ```java // Order.java (部分代码) @TableField(exist = false) private User user; @ManyToOne(fetchType = FetchType.LAZY) @JoinColumn(name="user_id", referencedColumnName="id") public User getUser() { return this.user; } public void setUser(User user) { this.user = user; } ``` 上述代码片段展示了如何在一个名为 `Order` 的实体对象内声明对外部 `User` 记录的引用,并指定了连接两者的列名(`user_id`)作为外键[^2]。 #### 二、页面设计中的字段绑定 当涉及到前端展示时,可以利用 Ant Design Vue 或者其他 UI 组件库来进行界面构建。此时需要注意的是要正确地将后端返回的数据结构与视图层组件属性相匹配。比如,在编辑或新增数据时,应该提供下拉框让用户选择所属用户的 ID 而不是手动输入数字;而在查看详情页则可以直接显示用户名字而非编号形式[^3]。 ```html <!-- orderForm.vue --> <template> <!-- ... --> <a-form-item label="所属用户"> <a-select v-model:value="form.userId" placeholder="请选择..."> <a-select-option :value="item.id" v-for="(item, index) in userList" :key="index">{{ item.name }}</a-select-option> </a-select> </a-form-item> </template> <script lang="ts"> import { defineComponent } from 'vue'; export default defineComponent({ data(){ return{ form:{}, userList:[] } }, }) </script> ``` 这段 HTML+Vue.js 代码实现了在添加新订单的过程中允许管理员从列中挑选对应客户的功能,而不需要直接录入客户的唯一标识符(ID)[^4]。 #### 三、保存及更新逻辑编写 最后一步就是确保所有的变更都能被持久化到数据库当中去。这通常意味着我们需要重写默认的服务方法或者自定义 SQL 查询语句以适应复杂的业务场景。幸运的是,借助于 Spring Data JPA 提供的支持,大多数情况下只需要简单修改 repository 接口即可完成这项任务。 ```java @Service @Slf4j public class OrderService { @Autowired private OrderRepository orderRepo; public boolean saveOrUpdate(Order entity){ try { if(entity.getId()!=null && !"".equals(entity.getId())){ Optional<Order> optional=orderRepo.findById(entity.getId()); if(optional.isPresent()){ Order oldEntity=optional.get(); BeanUtils.copyProperties(entity,oldEntity,"id"); orderRepo.save(oldEntity); log.info("Update success!"); return true; } }else{ orderRepo.save(entity); log.info("Save new record successfully."); return true; } }catch(Exception e){ log.error(e.getMessage(),e); throw new RuntimeException("Operation failed.",e); } return false; } } ``` 以上 Java 代码段描述了一个典型的服务层函数用于处理来自客户端提交过来的新建或是更改后的订单实例。它会先判断传入的对象是否有有效的主键值(id),如果有就尝试查找现有条目并执行更新动作;反之则是插入一条全新的记录进入目标集合。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值