作用:

基于实体上的注解及字段注解自动创建、更新数据库表。
当结合flyway使用时,需要注意_V1.0.0__***.sql_版本号文件,会优先于本框架的自动建表逻辑之前执行,其他版本会在框架之后执行。

声明:

本模块核心代码采用了A.CTable框架,因该框架与本框架的需求不太符合,因此就对其进行了一版魔改,进行了部分功能增强及bug修复。
具体改动如下:

  1. 官方的设计思路是默认Bean下的所有字段均不是表字段,需要手动通过@Column声明,我在引用过来之后,改为了默认所有字段均为表字段,只有被MP的@TableField(exist=false)修饰的才会被排除,具备@TableField(exist=false)功能的注解有:@Exclude@Bind**系列,他们集成了@TableField,且内置exist属性为false了。
  2. A.CTable框架内部集成了类似MP的功能,不如MP完善,所以我也剔除掉了,顺带解决了不兼容和bug。
  3. 像@DefaultValue注解与本框架内部注解重名了,因此改名为@ColumnDefault
  4. 整理了一遍内部的注解,利用spring的AliasFor做了关联,更方便管理。
  5. @Table里面加了一个primary属性(对应@TablePrimary),表示是否为主表,为了支持多个Entity对应一个数据库表(正常用不到请忽略_)。
  6. @Table里面加了一个dsName属性(对应@DsName),可以配合MP的多数据源框架实现不同的表在不同数据源下创建。
  7. 数据库类型映射改动增加对MySQL8的支持,Double数据类型,自动保留2位小数,BigDecimal类型保留4位小数。
  8. 数据库表名和字段名的生成会参照mybatis-plus的配置:mybatis-plus.global-config.db-config.table-underlinemybatis-plus.configuration.map-underscore-to-camel-case决定是否自动驼峰转下划线,完成了跟mybatis-plus的一致性。

    讲解:

    基于java反射,系统启动过程中拦截标注@Table的类进行分析、比对(与数据库表)、组装SQL执行数据表创建与更新操作,因此SQL组装模块需要高度依赖数据库的特性,因此ACTable的作者也只是实现了MySQL的适配,在此我也没有去额外适配其他数据库,一是日常MySQL是大多数项目的选择,二是工作量着实麻烦,不过如果ACTable集成了,我会第一时间同步过来。

    示例:

    构建系统常见的用户信息这个模型,涉及了自动建表,建索引,唯一序列,表注释,字段注释等操作。

    1. // @EnableAutoTable启用自动生成数据库表功能,此处简化了A.CTable的复杂配置,均采用默认配置
    2. @EnableAutoTable
    3. @SpringBootApplication
    4. public class DemoApplication {
    5. public static void main(String[] args) {
    6. SpringApplication.run(DemoApplication.class, args);
    7. }
    8. }
    1. // @EnableAutoTable启用自动生成数据库表功能,此处简化了A.CTable的复杂配置,均采用默认配置
    2. // 版本 3.5.2-EXT141 新增功能:只有local、dev两个环境激活自动建表操作。
    3. // activeProfile的值默认配置为配置文件中的:spring.profiles.active,可通过profileProperty属性更改为其他配置项。
    4. // profileProperty指定配置下的值如果跟activeProfile属性值存在交集,则开启自动建表
    5. // 例如spring.profiles.active=dev,test,activeProfile={"local", "dev"},他们都有dev,则启动自动建表
    6. @EnableAutoTable(activeProfile = {"local", "dev"})
    7. @SpringBootApplication
    8. public class DemoApplication {
    9. public static void main(String[] args) {
    10. SpringApplication.run(DemoApplication.class, args);
    11. }
    12. }
    1. @Data
    2. // @Table标记的可被识别为需要自动创建表的Entity
    3. @Table(comment = "用户")
    4. public class User {
    5. // 自动识别id属性名为主键
    6. // @IsAutoIncrement声明为自增主键,什么都不声明的话,默认为雪花算法的唯一主键(MP的自带功能),推荐默认便于后期的数据分布式存储等处理。
    7. @IsAutoIncrement
    8. // 字段注释、类型、长度。@Column的所有属性均有独立的注解对应,具体请参照后面的注解介绍
    9. @Column(comment = "主键", type = MySqlTypeConstant.BIGINT, length = 32)
    10. private String id;
    11. // 索引
    12. @Index
    13. // 非空
    14. @IsNotNull
    15. @ColumnComment("名字")
    16. private String name;
    17. // 唯一索引
    18. @Unique
    19. // 非空
    20. @IsNotNull
    21. @ColumnComment("手机号")
    22. private String phone;
    23. // 省略其他属性,其他建表相关注解请查看源码
    24. ......
    25. }

    ```properties

    actable的原配置信息仅保留了如下几项

    MPE以在代码中对其做了默认配置,正常无需显式声明配置,忽略即可

    如果手动指定了,将覆盖MPE中的默认值

启动模式

none:系统不做任何处理。

create:系统启动后,会先将所有的表删除掉,然后根据model中配置的结构重新建表,该操作会破坏原有数据。

update:系统启动后,会自动判断哪些表是新建的,哪些字段要修改类型等,哪些字段要删除,哪些字段要新增,该操作不会破坏原有数据(更改字段名称的情况下,会认为是新增字段)。

add:系统启动后,只做新增,比如新增表/新增字段/新增索引/新增唯一约束的功能,而不会去做修改和删除的操作。

actable.table.auto=update

您的model包路径,多个路径可以用分号或者逗号隔开,会递归这个目录下的全部目录中的java对象,支持类似com.bz.**.entity

actable.model.pack=[Spring启动类所在包]

数据库类型,目前也仅支持mysql

actable.database.type=mysql

自己定义的索引前缀,该配置项不设置默认使用actableidx

actable.index.prefix=

自己定义的唯一约束前缀,该配置项不设置默认使用actableuni

actable.unique.prefix= ```