A.CTable+springboot+mybatis-plus自动更新数据表结构增加或者删除表字段

A.CTable+springboot+mybatis-plus自动更新数据表结构增加或者删除表字段

首先非常感谢孙琛斌提供的A.CTable框架
孙琛斌原创

其实对于数据表结构的更改可以用hibernate enhance 一种方式使用Ebean框架对数据表结构的更新,而对于mybatis-plus使用A.CTable同样可以实现对数据库表结构的更新话不多说直接上代码:

首先引入坐标:

   <!--mybatis-plus自动建表功能-->
   <dependency>
       <groupId>com.gitee.sunchenbin.mybatis.actable</groupId>
       <artifactId>mybatis-enhance-actable</artifactId>
       <version>1.4.6.RELEASE</version>
   </dependency>
   <!--springboot启动mybates-plus-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.1.2</version>
    </dependency>
     <!--mybaties-plus-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus</artifactId>
        <version>3.1.2</version>
    </dependency>
    <!--对mybaties-plus的加强-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-extension</artifactId>
        <version>3.1.2</version>
    </dependency>
    <!--lomok-->
      <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.2</version>
    </dependency>

在application.yml进行配置:

server:
  port: 8011
mybatis:
  table:
    auto: update
    #create    系统启动后,会将所有的表删除掉,然后根据model中配置的结构重新建表,该操作会破坏原有数据。
    #update    系统会自动判断哪些表是新建的,哪些字段要修改类型等,哪些字段要删除,哪些字段要新增,该操作不会破坏原有数据。
    #none     系统不做任何处理。
    #add      新增表/新增字段/新增索引/新增唯一约束的功能,不做做修改和删除 (只在版本1.0.9.RELEASE及以上支持)。
  model:
    pack: com.person.provider.entity #扫描用于创建表的对象的包名,多个包用“,”隔开
  database:
    type: mysql #数据库类型 目前只支持mysql
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/leadnews_user?useSSL=false&&characterEncoding=UTF-8
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: root
mybatis-plus:
  mapper-locations: classpath*:xxxxxx/*.xml,classpath*:com/gitee/sunchenbin/mybatis/actable/mapping/*/*.xml
  #mapper-locations内容逗号前面是自己项目的xml文件所放位置,比如自己的xml文件在resources:mapper:userMapper.xml那么逗号前面的路径更改为classpath:mapper/*.xml逗号后面的直接复制

在启动类上添加注解:

@SpringBootApplication
@MapperScan({"com.gitee.sunchenbin.mybatis.actable.dao.*","com.person.provider.mapper"}) //逗号前面直接复制不要更改,注意这里可以指定多个包,逗号间隔,逗号后面写自己的dao包路径
@ComponentScan({"com.gitee.sunchenbin.mybatis.actable.manager.*","com.person"}) //逗号前面直接复制不要更改,逗号后面写自己的controller层包路径
public class ProviderApp {
    public static void main(String[] args){
        SpringApplication.run(ProviderApp.class,args);
    }
}

在yml配置的扫描包 com.person.provider.entity下新建实体类 基础类SuperEntity:

package com.person.provider.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.gitee.sunchenbin.mybatis.actable.annotation.Column;
import com.gitee.sunchenbin.mybatis.actable.annotation.IsAutoIncrement;
import com.gitee.sunchenbin.mybatis.actable.annotation.IsKey;
import lombok.Getter;
import lombok.Setter;

import java.util.Date;

@Getter //lombok注解,不用管
@Setter //lombok注解,不用管
public class SuperEntity {
    /**
     * 主键
     */
    @TableId(type = IdType.AUTO) //mybatis-plus主键注解
    @IsKey                         //actable主键注解
    @IsAutoIncrement             //自增
    @Column                     //对应数据库字段,不配置name会直接采用属性名作为字段名
    private Long id;
    /**
     * 创建时间
     */
    @Column(name = "create_time",comment = "创建时间") // name指定数据库字段名,comment为备注
    private Date createTime;
    /**
     * 最后修改时间
     */
    @Column(name = "update_time",comment = "最后修改时间")
    private Date updateTime;
}

在yml配置的扫描包 com.person.provider.entity下新建在数据库加的表结构User类:

package com.person.provider.entity;

import com.gitee.sunchenbin.mybatis.actable.annotation.Column;
import com.gitee.sunchenbin.mybatis.actable.annotation.Table;
import lombok.Data;

@Data //lombok注解,不用管
@Table(name = "t_user") //对应数据库表名,如果更改表名需要同步更改数据库表名,不然会重新创建表。
public class User extends SuperEntity {
    @Column
    private String username;
    @Column
    private String password;
}

一切准备就绪启动项目开始运行:

在这里插入图片描述

当看到这样的提示时表示数据库表已经更新完毕,接下来打开数据库看下是否新增了一个表结构:

在这里插入图片描述

果然很完美,java已经自动帮你新建了一个数据库表!有了这个工具,以后建表,建库,那就太方便了,真香!!!

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
我理解了你的问题,并且会为你提供一个基本的操作流程。不过在此先说明一点,这个操作过程并不建议在生产环境中进行,建议在测试环境中进行框架的测试。以下是一个可行的方案: 1.在SSM框架中创建一个Service层接口。 2.定义一个deleteData方法接收一个参数,用来标识需要删除哪些数据。 3.在方法中找到需要删除数据的B表和C表,并调用它们的删除方法将它们的数据删除。 4.遍历A表中的数据,找到需要删除的数据,并传递给第3步中定义的deleteData方法进行删除。 以下是参考代码: ``` @Service public class TableService { @Autowired private BTableDao bTableDao; @Autowired private CTableDao cTableDao; @Autowired private ATableDao aTableDao; public void deleteData(String someData) { List<BTable> bTables = bTableDao.queryBySomeData(someData); // 查询B表中需要删除的数据 bTables.forEach(bTable -> bTableDao.delete(bTable.getId())); // 删除B表中的数据 List<CTable> cTables = cTableDao.queryBySomeData(someData); // 查询C表中需要删除的数据 cTables.forEach(cTable -> cTableDao.delete(cTable.getId())); // 删除C表中的数据 List<ATable> aTables = aTableDao.queryBySomeData(someData); // 查询A表中需要删除的数据 aTables.forEach(aTable -> { bTableDao.deleteByAId(aTable.getId()); // 根据A表中的数据删除B表中的关联数据 cTableDao.deleteByAId(aTable.getId()); // 根据A表中的数据删除C表中的关联数据 aTableDao.delete(aTable.getId()); // 删除A表中的数据 }); } } ``` 这段代码中所涉及的BTableDao, CTableDao, ATableDao分别是对应的B表、C表和A表的数据访问层接口,这里为了简化流程只给出了删除方法的实现,实际开发中需要包含各种类型的CRUD操作。 希望这个回答能对您有所帮助,如有疑问,欢迎继续提出问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值