- 作用:
- 声明:
- 讲解:
- 示例:
- actable的原配置信息仅保留了如下几项
- MPE以在代码中对其做了默认配置,正常无需显式声明配置,忽略即可
- 如果手动指定了,将覆盖MPE中的默认值
- 启动模式
- none:系统不做任何处理。
- create:系统启动后,会先将所有的表删除掉,然后根据model中配置的结构重新建表,该操作会破坏原有数据。
- update:系统启动后,会自动判断哪些表是新建的,哪些字段要修改类型等,哪些字段要删除,哪些字段要新增,该操作不会破坏原有数据(更改字段名称的情况下,会认为是新增字段)。
- add:系统启动后,只做新增,比如新增表/新增字段/新增索引/新增唯一约束的功能,而不会去做修改和删除的操作。
- 您的model包路径,多个路径可以用分号或者逗号隔开,会递归这个目录下的全部目录中的java对象,支持类似com.bz.**.entity
- 数据库类型,目前也仅支持mysql
- 自己定义的索引前缀,该配置项不设置默认使用actableidx
- 自己定义的唯一约束前缀,该配置项不设置默认使用actableuni
作用:
基于实体上的注解及字段注解自动创建、更新数据库表。
当结合flyway使用时,需要注意_V1.0.0__***.sql_
版本号文件,会优先于本框架的自动建表逻辑之前执行,其他版本会在框架之后执行。
声明:
本模块核心代码采用了A.CTable框架,因该框架与本框架的需求不太符合,因此就对其进行了一版魔改,进行了部分功能增强及bug修复。
具体改动如下:
- 官方的设计思路是默认Bean下的所有字段均不是表字段,需要手动通过@Column声明,我在引用过来之后,改为了默认所有字段均为表字段,只有被MP的
@TableField(exist=false)
修饰的才会被排除,具备@TableField(exist=false)
功能的注解有:@Exclude
、@Bind**
系列,他们集成了@TableField
,且内置exist属性为false了。 - A.CTable框架内部集成了类似MP的功能,不如MP完善,所以我也剔除掉了,顺带解决了不兼容和bug。
- 像@DefaultValue注解与本框架内部注解重名了,因此改名为
@ColumnDefault
。 - 整理了一遍内部的注解,利用spring的AliasFor做了关联,更方便管理。
@Table
里面加了一个primary属性(对应@TablePrimary
),表示是否为主表,为了支持多个Entity对应一个数据库表(正常用不到请忽略_)。@Table
里面加了一个dsName属性(对应@DsName
),可以配合MP的多数据源框架实现不同的表在不同数据源下创建。- 数据库类型映射改动增加对MySQL8的支持,Double数据类型,自动保留2位小数,BigDecimal类型保留4位小数。
数据库表名和字段名的生成会参照mybatis-plus的配置:
mybatis-plus.global-config.db-config.table-underline
和mybatis-plus.configuration.map-underscore-to-camel-case
决定是否自动驼峰转下划线,完成了跟mybatis-plus的一致性。讲解:
基于java反射,系统启动过程中拦截标注@Table的类进行分析、比对(与数据库表)、组装SQL执行数据表创建与更新操作,因此SQL组装模块需要高度依赖数据库的特性,因此ACTable的作者也只是实现了MySQL的适配,在此我也没有去额外适配其他数据库,一是日常MySQL是大多数项目的选择,二是工作量着实麻烦,不过如果ACTable集成了,我会第一时间同步过来。
示例:
构建系统常见的用户信息这个模型,涉及了自动建表,建索引,唯一序列,表注释,字段注释等操作。
// @EnableAutoTable启用自动生成数据库表功能,此处简化了A.CTable的复杂配置,均采用默认配置
@EnableAutoTable
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
// @EnableAutoTable启用自动生成数据库表功能,此处简化了A.CTable的复杂配置,均采用默认配置
// 版本 3.5.2-EXT141 新增功能:只有local、dev两个环境激活自动建表操作。
// activeProfile的值默认配置为配置文件中的:spring.profiles.active,可通过profileProperty属性更改为其他配置项。
// profileProperty指定配置下的值如果跟activeProfile属性值存在交集,则开启自动建表
// 例如spring.profiles.active=dev,test,activeProfile={"local", "dev"},他们都有dev,则启动自动建表
@EnableAutoTable(activeProfile = {"local", "dev"})
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@Data
// @Table标记的可被识别为需要自动创建表的Entity
@Table(comment = "用户")
public class User {
// 自动识别id属性名为主键
// @IsAutoIncrement声明为自增主键,什么都不声明的话,默认为雪花算法的唯一主键(MP的自带功能),推荐默认便于后期的数据分布式存储等处理。
@IsAutoIncrement
// 字段注释、类型、长度。@Column的所有属性均有独立的注解对应,具体请参照后面的注解介绍
@Column(comment = "主键", type = MySqlTypeConstant.BIGINT, length = 32)
private String id;
// 索引
@Index
// 非空
@IsNotNull
@ColumnComment("名字")
private String name;
// 唯一索引
@Unique
// 非空
@IsNotNull
@ColumnComment("手机号")
private String phone;
// 省略其他属性,其他建表相关注解请查看源码
......
}
```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= ```