前言
在開發過程中,總會涉及到資料庫表結構欄位的增加或者刪除,或者是索引的增加和減少,這個時候能把修改表結構欄位這些工作都交給程式來進行,那能大大方便開發。正好有一個現成的工具可以在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表進行更新了。