# auto-ddl
**Repository Path**: linanlin/auto-ddl
## Basic Information
- **Project Name**: auto-ddl
- **Description**: 自动生成 数据库 DDL 语句;支持 jpa、mybaits-plus及自定义注解
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2024-08-07
- **Last Updated**: 2024-08-07
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# auto-ddl
根据实体类生成数据库表结构维护语句 (DDL) 包括:添加列、修改列、删除列、创建表、添加索引、删除索引等;目前仅支持 MySql 8.0
数据库,但是兼容 JPA 及 MyBatis Plus 注解。
开发环境中表结构经常需要变更时可以使用;生产环境建议维护语句输出到文件空控制台,通过一次人工审核后执行。
- 引入依赖
```xml
design.donkey
auto-ddl
1.0.0
```
- 使用方式
自动获取方言及解析器
```java
import design.donkey.auto.ddl.AutoDdl;
import javax.sql.DataSource;
class DdlTest {
@Test
void testDdlFile() {
DataSource dataSource = null;
AutoDdl.factory(dataSource, new HashSet<>(Arrays.asList(DdlOperation.ADD_COLUMN, DdlOperation.ADD_INDEX)), true, true);
}
}
```
DEMO 代码可查看 src/test/java 目录下
```java
/**
* test.Test
*
* @author zhangjiakung
* @since 0.0.1
*/
class DdlTest {
@Test
void testDdlFile() {
Dialect dialect = new MySql8Dialect();
AnnotationAnalysis annotationAnalysis = new AnnotationAnalysis();
AutoDdl autoDdl = new AutoDdl(new HashSet<>(Arrays.asList(DdlOperation.ADD_COLUMN, DdlOperation.ADD_INDEX)),
dialect, annotationAnalysis, true, true);
{
Map> maintenance = autoDdl.maintenance("", "");
Assertions.assertTrue(maintenance.isEmpty());
}
{
String sourceSql = """
""";
String targetSql = """
CREATE TABLE `security_user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '用户 ID',
`username` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号',
`nickname` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '昵称',
`city_code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '归属地编码',
`company_id` bigint DEFAULT NULL COMMENT '单位 ID',
`expired_date` datetime DEFAULT NULL COMMENT '过期时间',
`last_login_date` datetime DEFAULT NULL COMMENT '上次登录时间',
`password` text COLLATE utf8mb4_bin COMMENT '密码',
`remarks` text COLLATE utf8mb4_bin COMMENT '备注',
`deleted` int NOT NULL DEFAULT '0' COMMENT '是否已删除',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modified_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`),
UNIQUE KEY `nickname` (`nickname`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='用户'
""";
Map> maintenance = autoDdl.maintenance(sourceSql, targetSql);
Assertions.assertTrue(maintenance.isEmpty());
}
{
String sourceSql =
"""
CREATE TABLE `security_user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '用户 ID',
`username` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号',
`nickname` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '昵称',
`city_code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '归属地编码',
`company_id` bigint DEFAULT NULL COMMENT '单位 ID',
`expired_date` datetime DEFAULT NULL COMMENT '过期时间',
`last_login_date` datetime DEFAULT NULL COMMENT '上次登录时间',
`password` text COLLATE utf8mb4_bin COMMENT '密码',
`remarks` text COLLATE utf8mb4_bin COMMENT '备注',
`deleted` int NOT NULL DEFAULT '0' COMMENT '是否已删除',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modified_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`),
UNIQUE KEY `nickname` (`nickname`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='用户'
""";
String targetSql = """
CREATE TABLE `security_user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '用户 ID 22',
`username` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号',
`nickname` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '昵称',
`city_code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '归属地编码',
`company_id` bigint DEFAULT NULL COMMENT '单位 ID',
`expired_date` datetime DEFAULT NULL COMMENT '过期时间',
`last_login_date` datetime DEFAULT NULL COMMENT '上次登录时间',
`password` text COLLATE utf8mb4_bin COMMENT '密码',
`remarks344` text COLLATE utf8mb4_bin COMMENT '备注',
`delEted` int NOT NULL DEFAULT '0' COMMENT '是否已删除',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modified_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`,`city_code`),
UNIQUE KEY `nickName2` (`nicKname`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='67878'
""";
Map> maintenance = autoDdl.maintenance(sourceSql, targetSql);
Assertions.assertEquals(1, maintenance.size());
Assertions.assertEquals(2, maintenance.get("`security_user`").size());
}
{
String sourceSql = """
CREATE TABLE `security_user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '用户 ID 22',
`username` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号',
`nickname` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '昵称',
`city_code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '归属地编码',
`company_id` bigint DEFAULT NULL COMMENT '单位 ID',
`expired_date` datetime DEFAULT NULL COMMENT '过期时间',
`last_login_date` datetime DEFAULT NULL COMMENT '上次登录时间',
`password` text COLLATE utf8mb4_bin COMMENT '密码',
`remarks344` text COLLATE utf8mb4_bin COMMENT '备注',
`deleted` int NOT NULL DEFAULT '0' COMMENT '是否已删除',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modified_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`,`city_code`),
UNIQUE KEY `nickname2` (`nickname`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='67878'
""";
String targetSql = """
CREATE TABLE `security_user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '用户 ID 22',
`username` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号',
`nickname` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '昵称',
`city_code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '归属地编码',
`company_id` bigint DEFAULT NULL COMMENT '单位 ID',
`expired_date` datetime DEFAULT NULL COMMENT '过期时间',
`last_login_date` datetime DEFAULT NULL COMMENT '上次登录时间',
`password` text COLLATE utf8mb4_bin COMMENT '密码',
`remarks344` text COLLATE utf8mb4_bin COMMENT '备注',
`delEted` int NOT NULL DEFAULT '0' COMMENT '是否已删除',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modified_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`,`city_code`),
UNIQUE KEY `nickName2` (`nicKname`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='67878'
""";
Map> maintenance = autoDdl.maintenance(sourceSql, targetSql);
Assertions.assertTrue(maintenance.isEmpty());
}
{
autoDdl.maintenanceAndRun(null);
}
}
@Test
void testDdlAnnotation() {
Dialect dialect = new MySql8Dialect();
AnnotationAnalysis annotationAnalysis = new JpaAnnotationAnalysis();
AutoDdl autoDdl = new AutoDdl(new HashSet<>(Arrays.asList(DdlOperation.ADD_COLUMN, DdlOperation.ADD_INDEX)),
dialect, annotationAnalysis, true, true);
{
String sourceSql = """
CREATE TABLE `security_user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '用户 ID',
`username` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号',
`nickname` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '昵称',
`city_code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '归属地编码',
`company_id` bigint DEFAULT NULL COMMENT '单位 ID',
`expired_date` datetime DEFAULT NULL COMMENT '过期时间',
`last_login_date` datetime DEFAULT NULL COMMENT '上次登录时间',
`password` text COLLATE utf8mb4_bin COMMENT '密码',
`remarks` text COLLATE utf8mb4_bin COMMENT '备注',
`deleted` int NOT NULL DEFAULT '0' COMMENT '是否已删除',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modified_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`),
UNIQUE KEY `nickname` (`nickname`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='用户'
""";
List targetSql = dialect.create(annotationAnalysis.analysis(SecurityUser.class));
Map> maintenance = autoDdl.maintenance(sourceSql, String.join(";", targetSql));
Assertions.assertTrue(maintenance.isEmpty());
}
}
@Test
void testDdlJpa() {
Dialect dialect = new MySql8Dialect();
AnnotationAnalysis annotationAnalysis = new JpaAnnotationAnalysis();
AutoDdl autoDdl = new AutoDdl(new HashSet<>(Arrays.asList(DdlOperation.ADD_COLUMN, DdlOperation.ADD_INDEX)),
dialect, annotationAnalysis, true, true);
{
String sourceSql = """
CREATE TABLE `security_user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '用户 ID',
`username` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号',
`nickname` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '昵称',
`city_code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '归属地编码',
`company_id` bigint DEFAULT NULL COMMENT '单位 ID',
`expired_date` datetime DEFAULT NULL COMMENT '过期时间',
`last_login_date` datetime DEFAULT NULL COMMENT '上次登录时间',
`password` text COLLATE utf8mb4_bin COMMENT '密码',
`remarks` text COLLATE utf8mb4_bin COMMENT '备注',
`deleted` int NOT NULL DEFAULT '0' COMMENT '是否已删除',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modified_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`),
UNIQUE KEY `nickname` (`nickname`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='用户'
""";
List targetSql = dialect.create(annotationAnalysis.analysis(SecurityUserJpa.class));
Map> maintenance = autoDdl.maintenance(sourceSql, String.join(";", targetSql));
Assertions.assertTrue(maintenance.isEmpty());
}
}
@Test
void testDdlMyBatisPlus() {
Dialect dialect = new MySql8Dialect();
AnnotationAnalysis annotationAnalysis = new MyBatisPlusAnnotationAnalysis();
AutoDdl autoDdl = new AutoDdl(new HashSet<>(Arrays.asList(DdlOperation.ADD_COLUMN, DdlOperation.ADD_INDEX)),
dialect, annotationAnalysis, true, true);
{
String sourceSql = """
CREATE TABLE `security_user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '用户 ID',
`username` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号',
`nickname` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '昵称',
`city_code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '归属地编码',
`company_id` bigint DEFAULT NULL COMMENT '单位 ID',
`expired_date` datetime DEFAULT NULL COMMENT '过期时间',
`last_login_date` datetime DEFAULT NULL COMMENT '上次登录时间',
`password` text COLLATE utf8mb4_bin COMMENT '密码',
`remarks` text COLLATE utf8mb4_bin COMMENT '备注',
`deleted` int NOT NULL DEFAULT '0' COMMENT '是否已删除',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modified_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`),
UNIQUE KEY `nickname` (`nickname`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='用户'
""";
List targetSql = dialect.create(annotationAnalysis.analysis(SecurityUserMyBatisPlus.class));
Map> maintenance = autoDdl.maintenance(sourceSql, String.join(";", targetSql));
Assertions.assertTrue(maintenance.isEmpty());
}
}
}
```
## 更新日志
### V1.1.0
- 根据数据源及所使用项目的依赖自动生成 AutoDll 类
- 添加默认方言,当数据库不兼容时亦可使用
### V1.0.0
- 根据实体类生成数据库表结构维护语句 (DDL) 包括:添加列、修改列、删除列、创建表、添加索引、删除索引等。
- 支持 MySql 8.0 数据库
- 兼容 JPA 注解
- 兼容 MyBatis Plus 注解
## 发布方式
用于根据实体自动维护数据库表结果
deploy
```shell
mvn clean deploy -f pom.xml -U -DskipTests -DaltDeploymentRepository=ossrh::default::https://s01.oss.sonatype.org/content/repositories/snapshots -DrepoUser=user "-DrepoPass=password" -DrepoId=ossrh
```
```shell
mvn clean deploy -f pom.xml -U -DskipTests -DaltDeploymentRepository=ossrh::default::https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ -DrepoUser=user "-DrepoPass=password" -DrepoId=ossrh
```