Springboot+mybatis-plus+ACTable实现自动创建表结构本文主要介绍mybatis如何实现想hibernate一样自动创建表，以及记录下自己踩过的坑，发表于2021年12月，部分内容仅供参考，很有可能项目作者已经修复了那些问题。Springboot+Mybatis-plus没什么好说的，重头戏在ACTable，他是一个开源依赖，仓库地址：https://gitee.com/sunchenbin/mybatis-enhance，当然也有github的，就是利用他来实现自动创建表结构ACTable的官方文档：https://www.yuque.com/sunchenbin/actable/nfz097使用方法导入依赖最新依赖请查看maven仓库：https://mvnrepository.com/artifact/com.gitee.sunchenbin.mybatis.actable/mybatis-enhance-actable依赖基于Springboot，请先导入springboot依赖，下面的写法是按照官方文档整合Springboot来写的，注意 ：只适用于Springboot+mybatis-plus，如果使用mybatis或者springmvc的话，请查看官方文档来配置。 com.baomidou mybatis-plus-boot-starter 3.4.1 com.gitee.sunchenbin.mybatis.actable mybatis-enhance-actable 1.5.0.RELEASE com.baomidou mybatis-plus-annotation 配置文件actable: table: #可选：update/none/create/add auto: update model: #使用逗号隔开 pack: com.oldwu.entity,com.oldwu.genshin.entity,com.security.domain database: type: mysql index: #自己定义的索引前缀#该配置项不设置默认使用actable_idx_ prefix: INDEX_ unique: #自己定义的唯一约束前缀#该配置项不设置默认使用actable_uni_ prefix: INDEX_UNIQUE_注释都在上边了，应该一看就懂，这是官方对配置的解释：以及，加上mybatis-plus的配置，下面这个路径是写死的，不要改：mybatis-plus: mapper-locations: classpath*:com/gitee/sunchenbin/mybatis/actable/mapping/*/*.xml启动类注解@MapperScan({"com.gitee.sunchenbin.mybatis.actable.dao.*"}) @ComponentScan(basePackages = {"com.gitee.sunchenbin.mybatis.actable.manager.*"})此处是官方给出的配置，这边有一个坑，下面会讲到启动项目测试至此，配置都完成了，你需要启动项目来测试一下是否有报错自动创建表这个依赖利用注解的形式来完成自动创建表，类似于hibernate，非常方便，官方的注解说明在这里，我也不一一列出：https://www.yuque.com/sunchenbin/actable/ca4vsf，这边只写几个重要的东西@Table("表名") public class SystemLog implements Serializable { //主键 @IsKey //自动递增 @IsAutoIncrement //后续不会更新这个字段，正常的使用方法请看官方文档，后面也会讲到一个坑 @IgnoreUpdate private Long id; //type为字段类型，name为字段名,length为字段长度， //default为默认值,更多见官方文档 //常用的应该就这几个，如果都不需要，括号里不填就行了 @Column(type = MySqlTypeConstant.TEXT) //不为空 @IsNotNull //建立唯一约束 @Unique private String receiveText; //创建日期类型的示例，并且默认值为当前时间 @Column(type = MySqlTypeConstant.DATETIME,defaultValue = "CURRENT_TIMESTAMP") private Date date; }然后启动项目测试，第一次创建表时会有中文日志输出，如果创建失败的话，项目会启动失败并且报错。这个时候就需要检查报错信息了。关于这个自动建表依赖目前这个依赖不支持外键的添加，所以如果要加外键，请手动添加一些坑的记录每种错误都不止一种原因，以下只是我碰到的报错Caused by: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.gitee.sunchenbin.mybatis.actable.dao.system.CreateMysqlTablesMapper.findTableCountByTableName这个错误有很多种原因，大概率是因为配置文件的问题，来说说我自己碰到的错误：官方文档给出的配置文件是properties格式的，我自己用的时候是yml格式的，然后我把最后一行mybatis-plus.mapper-locations=classpath*:com/gitee/sunchenbin/mybatis/actable/mapping/*/*.xml复制过去的时候，idea自动格式化，然后mybatis-plus就成了actable的子项，独立出来就好了'com.gitee.sunchenbin.mybatis.actable.dao.common.BaseMysqlCRUDMapper'报错有可能是因为启动类注解配置问题，你需要按照官方文档配置启动类之后再次尝试报错Invalid bound statement (not found) NULL 空指针类似于这样，具体记不清了，我的是因为yml配置文件中，model配置写为了数组格式：#此为错误示范！！！ actable: model: - pack: com.oldwu.entity - pack: com.security.domain正确应该为逗号或分号分隔：actable: model: pack: com.oldwu.entity,com.oldwu.genshin.entity,com.security.domainspring包扫描的一个坑这也是我上面启动类配置中说的一个坑，官方给出的启动类注解为：@MapperScan("com.gitee.sunchenbin.mybatis.actable.dao.*") @ComponentScan(basePackages = {"com.gitee.sunchenbin.mybatis.actable.manager.*"})问题就出在@ComponentScan上，这是包扫描的注解，稍微用过点springboot的人应该都知道，正常情况下，启动类都会放在最外层的包中，启动时，spring会去依次扫描同一级的所有子包。如果你原来用的就是@ComponentScan来进行包扫描，并且没有出任何问题的话，正常情况仅需在你原来的基础上加上这个要扫描的包即可。但是，如果你原来用的是@SpringBootApplication注解来启动的话，就会导致别的bean全都无法正常注入，也就是spring只扫描了你配置的那个包，别的类，统统没有注入，有些人访问不了自定义的controller就是这个问题。当然解决办法也很简单，有两种，一种需要你自己配置需要扫描的包，还有一种就是：我们可以发现官方给出的包扫描路径在com下，也就是说，如果你的启动类也在com包下的话，spring会默认去扫描，所以，直接去掉@ComponentScan这一行就可以了Unique索引建立的一个bug没有测试过index索引会不会出这个bug，就是当你的字段名为一些mysql关键字时，建索引就会sql错误，查看输出发现是建索引语句没有加反引号导致的，但是建表的时候没有任何问题，尝试在列名配置中加了反引号，但是没有用，所以目前最好不要使用关键字作为列名。mysql8.0.24每次启动项目时都会提示正在更新表更新的字段都和Long和INTEGER有关系，gitee中也有人提问了，这个问题只会在新版本的mysql中出现，如果不爽的话，就在那个列上加上注释@IgnoreUpdate就好了如果还有别的问题，可以去github或者gitee上的Issues中查找有没有别人问过