MyBatis實現MySQL表欄位及結構的自動增刪

scottyzh發表於2024-06-03

前言

在開發過程中,總會涉及到資料庫表結構欄位的增加或者刪除,或者是索引的增加和減少,這個時候能把修改表結構欄位這些工作都交給程式來進行,那能大大方便開發。正好有一個現成的工具可以在springboot裡面實現這個流程。

介紹

mybatis-enhance-actable

上述是gitee連結。這個工具是mybatis-enhance-actable,引用作者的介紹:A.CTable是一個基於Spring和Mybatis的Maven專案,mybatis-enhance-actable支援springboot,增強了Mybatis的功能,透過配置model註解的方式來建立表,修改表結構,提供通用的單表CUDR工具,實現了mybatis自動建表的能力,目前支援Mysql。

使用

pom導包

    <dependency>
        <groupId>com.gitee.sunchenbin.mybatis.actable</groupId>
        <artifactId>mybatis-enhance-actable</artifactId>
        <version>1.5.0.RELEASE</version>
    </dependency>

配置application.yml

#自動建表設定
mybatis:
  table:
    #create系統啟動後,會將所有的表刪除掉,然後根據model中配置的結構重新建表,該操作會破壞原有資料;
    #update系統會自動判斷哪些表是新建的.哪些欄位要修改型別等,哪些欄位要刪除,哪些欄位要新增,該操作不會破壞原有資料;
    #add新增表/新增欄位/新增索引新增唯一約束的功能,不做做修改和刪除(只在版本1.0.9.RELEASE及以上支援);
    #none系統不做任何處理;
    auto: update
  model:
    #掃描用於建立表的物件的包名 填入domain包路徑
    pack: com.xx.xx.domain
  database:
    #資料庫型別目前只支援mysql
    type: mysql

mybatis-plus: #資料庫格式配置
  global-config:
    banner: false # 資料庫啟動的banner
    db-config:
      id-type: auto #id生成規則:mysql資料庫id自增
  configuration:
    map-underscore-to-camel-case: true  #開啟駝峰,處理資料庫“_"的欄位
    auto-mapping-behavior: full #自動對映任何複雜的結果
#  注意下面,一定要新增前面actable的xml
  mapper-locations: com/gitee/sunchenbin/mybatis/actable/mapping/*/*.xml,classpath*:mapper/*.xml

SpringBootApplication啟動類配置

@SpringBootApplication
@EnableScheduling
@EnableCaching
@MapperScan({"com.gitee.sunchenbin.mybatis.actable.dao.*", "com.*.*.mapper"})
@ComponentScan({"com.gitee.sunchenbin.mybatis.actable.manager.*", "com.*.*.*"})
public class ReceiveCardTestSystemApplication {

    public static void main(String[] args) {
        SpringApplication.run(ReceiveCardTestSystemApplication.class, args);
    }

}

關鍵是這兩行

@MapperScan({"com.gitee.sunchenbin.mybatis.actable.dao.*", "com.*.*.mapper"})
@ComponentScan({"com.gitee.sunchenbin.mybatis.actable.manager.*", "com.*.*.*"}) //掃描所有的包 最後一個是*,中間兩個*換成實際路徑

要增加上actable的掃包路徑。

Domain類的配置

@Getter
@Setter
@Accessors(chain = true)
@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName("users")
@Table(name = "users", isSimple = true)
public class UsersDO implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    @IsKey
    @IsAutoIncrement
    @Column(comment = "id")
    private Integer id;

    @Column(name = "user_name", length = 50, comment = "使用者名稱", isNull = true)
    @Index
    private String userName;

    @Column(name = "password", length = 255, comment = "密碼", isNull = true)
    private String password;

    @Column(name = "employee_id", length = 50, comment = "工號", isNull = true)
    @Unique
    private String employeeId;

    @Column(name = "role", comment = "0->管理員,1->測試員", isNull = true)
    private Integer role;

    @Column(name = "create_time", type = MySqlTypeConstant.DATETIME, isNull = true, comment = "建立時間")
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    @Column(name = "update_time", type = MySqlTypeConstant.DATETIME, isNull = true, comment = "更新時間")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

}

注意:

@Table(name = "users", isSimple = true)

當開啟isSimple後 @Column裡面不寫name則會預設將駝峰命名改為下劃線,比如updateTime變成了update_time

普通索引使用@Index,唯一索引使用@Unique

組合索引則這樣使用:@Index(columns = {"country", "province", "city"})

透過上述配置,啟動系統的時候就會自動對MySQL表進行更新了。

相關文章