diff --git a/README.md b/README.md index 2147be28bcf9c6731bc321c7870a8f1d47d6c967..7ad0166c9493adbb9ad5cc070b678e649bea4b6c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # code-generator-maven-plugin -Language: [中文](README.zh.md) +Language: [English](README.md)

@@ -20,124 +20,81 @@ Language: [中文](README.zh.md)

-## Description -code-generator-maven-plugin is based on baomidou's mybatis-plus-generator,a Maven plugin that generates code in a Maven project。Key features: -- code-generator:**MyBatis**:Generate Controller.java, Service.java, Mapper.java, mapper.xml, Entity.java under MyBatis based on database tables; -- code-generator:**MyBatis-Plus**:Generate Controller.java, Service.java, Mapper.java, mapper.xml, Entity.java under MyBatis-Plus based on database tables; -- code-generator:**JPA**:Generate Controller.java, Service.java, Repository.java, Entity.java under JPA based on database tables; -- code-generator:**Customer**:Generate CRUD code based on database tables and specify custom template locations; -- code-generator:**Dockerfile**:Generate the Dockerfile file for the current project, along with the associated scripts: DockerImageBuild.bat, DockerImageBuildRun.bat, DockerImageDelete.bat -- code-generator:**Docker-Build**:Build Docker Image based on the locally installed Docker -- code-generator:**Docker-Deploy**:Build Docker image and deploy Docker container based on locally installed Docker -- code-generator:**Docker-Delete**:Delete deployed Docker containers and Docker images based on the locally installed Docker -- Theory can be extended to any background and front database table related technology: such as: vue.js. -- The theory supports all databases that support JDBC connection: for example: DB2, DM, H2, Mariadb, MySQL, Oracle, Postgre, Sqlite, SQLServer, etc. +## 简介 +code-generator-maven-plugin 在 Maven 项目中生成代码的 Maven 插件。主要包括: +- code-generator:**code**:基于数据库表,自定义 velocity 代码模板,生成 CRUD 或前端代码; +- code-generator:**mybatis**:基于数据库表,使用插件默认 MyBatis 模板生成 CRUD 代码; +- code-generator:**mybatis-plus**:基于数据库表,使用插件默认 MyBatis-Plus 模板生成 CRUD 代码; +- code-generator:**jpa**:基于数据库表,使用插件默认 JPA 模板生成 CRUD 代码; +- code-generator:**script**:生成脚本。包括:Dockerfile, app.sh, app.bat 等脚本。 -### SpringBoot Code Generator -[generator-spring-boot-starter](https://gitee.com/mengweijin/vitality) +备注: +- code-generator:**code** 插件理论可以生成任意前后台跟数据库表有关系的代码:如:Vue, Element-UI 代码等。 +- 理论支持所有支持JDBC连接的数据库:例如:DB2, DM, H2, Mariadb, MySQL, Oracle, Postgre, Sqlite, SQLServer -## how to use? -Locate the code-generator-maven-plugin in the Intellij IDEA Maven module shown below and double-click the corresponding plug-in command. +## 如何使用? -![image](docs/image/code-generator-maven-plugin.png) - -**Notes** -* The default Java code generation is under the target/code-generator/ directory of the current project. -* The default package path is com.github.mengweijin. -* The default Dockerfile and other files are generated in the target directory of the current project. -* The Customer plug-in must be configured with templateLocation parameters. By default, the templateType parameter is beetl. - -## Generating Java Code -### 1. General Use -In the standard SpringBoot project, take Intellij IDEA, a development tool, as an example: the code-generator-maven-plugin was introduced into Maven +在标准 SpringBoot 项目,以开发工具 Intellij IDEA 为例:在 Maven 中引入 code-generator-maven-plugin 插件 ~~~~xml - com.github.mengweijin - code-generator-maven-plugin - Latest Version - - - sys_user, sys_role - com.github.mengweijin.quickboot.mybatis.BaseEntity - - + com.github.mengweijin + code-generator-maven-plugin + Latest Version -~~~~ +~~~~ + +在Intellij IDEA 的 Maven 模块中找到下面图中的 code-generator 插件,然后双击对应的插件命令即可。 + +code-generator:**code** 插件需要在 maven 运行窗口根据提示输入数据库表名称,模块名称。并且执行前需要指定用户自定义模板的位置,参数参考文章下面的表格。 + +![image](docs/image/code-generator-maven-plugin.png) + +代码生成位置:在当前工程的 target/code-generator/ 目录下。 + +至此,初步使用完成。 -### 2. Full Configuration to Use +## 全部配置使用(以 code-generator:code 插件为例) ~~~~xml - com.github.mengweijin - code-generator-maven-plugin - Latest Version - - - com.github.mengweijin - mengweijin - - root - root - jdbc:mysql://192.168.83.128:3306/mwj_cms - - sys_user, rlt_user_role - sys_, rlt_ - com.github.mengweijin.BaseEntity - true - - D:\code-generator-maven-plugin\src\main\resources\templates - beetl - - + com.github.mengweijin + code-generator-maven-plugin + Latest Version + + + com.github.mengweijin.vitality.framework.mybatis.entity.BaseEntity + generator/vue + vtl_ + mengweijin + + root + root + jdbc:mysql://localhost:3306/vitality + + + ~~~~ -## Parameter configuration instructions -| Parameter Name | Mandatory | Sample | Description | -|-----------------:|:----------|:------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| outputPackage | No | com.github.mengweijin | The package path to code generation. The default: com.github.mengweijin | -| author | No | mengweijin | Class annotation with the @Author value above. Default: take the user name of the current computer | -| dbInfo.username | No | root | The database connection information. If it is a standard SpringBoot project, can be omitted, automatically read application.yml/yaml/properties file. | -| dbInfo.password | No | root | Same as above | -| dbInfo.url | No | jdbc:mysql://192.168.83.128:3306/test | Same as above | -| tables | No | sys_user, rlt_user_role | Same as above | -| tablePrefix | No | sys_, rlt_ | The prefix of the database table name corresponding to the code to be generated. Once configured, the generated Entity class will no longer have a table prefix. For example, User, UserRole. If not configured, the generated Entity class is prefixed with a table. For example, SysUser, RltUserRole. Multiple table name prefixes are separated by commas. | -| superEntityClass | No | com.github.mengweijin.quickboot.mybatis.BaseEntity | The generated Entity class inherits the parent class. | -| lombokModel | No | true | Whether the generated Entity is Lombok enabled. Unconfigured or true: Enable Lombok mode; Set to false: If Lombok is not enabled, the generated entity contains getter/setter/toString methods. | -| templateLocation | Yes | D:\code-generator-maven-plugin\src\main\resources\templates | Customer plug-in parameter only, user-defined template location. If the user wants to write the template file that generates the code himself, he can use the Customer plug-in and configure the absolute path to the folder where the template file resides. For example, it can be placed in the resources/generator/ directory of your project code. | -| templateType | No | beetl | Customer plug-in parameter only, user-defined template type. Optional values are "beetl, velocity, freemarker" and the corresponding template suffix is "btl, vm, ftl". This parameter is optional. If this parameter is not configured, the default value is beetl, which means that the template suffix should end with .btl. | +## 参数配置说明 +| 参数名称 | 是否必填 | 配置示例 | 说明 | +|----------------:|:-----|:-------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------| +| author | 否 | mengweijin | 类注释上面@author的值。 默认:取当前电脑的用户名 | +| dbInfo.username | 否 | root | 数据库连接信息。如果是标准的SpringBoot工程,可以省略,会自动读取application.yml/yaml/properties文件。 | +| dbInfo.password | 否 | root | 同上 | +| dbInfo.url | 否 | jdbc:mysql://192.168.83.128:3306/test | 同上。 | +| tablePrefix | 否 | sys_, rlt_ | 要生成代码对应的数据库表名称的前缀。配置后,生成的entity类就不会带有表前缀了。如:User, UserRole。如果不配置,生成的entity类就会带有表前缀。如:SysUser, RltUserRole。多个表名称前缀使用逗号分隔 | +| baseEntity | 否 | com.github.mengweijin.vitality.framework.mybatis.entity.BaseEntity | 生成的entity类继承的父类 | +| templateDir | 是 | generator/vue | 仅 code-generator:code 插件参数,用户自定义模板相对于项目根目录的位置。 | -## FAQs -1. The database table exists, but no code file is generated, and the program does not report an error. - * Configure database table names to be exactly the same as table names in the database. - For example, when an H2 database creates a table with a script, the script name is written in lowercase, - but the generated table name may be in upper case, so you need to configure the upper case table name here. -2. The problem "Table \[table_name] does not exist in database!!" when generating code for a multi-module project using the H2 database. - * When the project structure is multi-module, the project structure is as follows: - ````txt - - project-parent - - h2 - - test.mv.db - - project-child - - src - - main - - java - - resources - - pom.xml(The code-generator-maven-plugin is configured here) - - pom.xml(The project-parent's pom.xml) - ```` - * As you can see, the /h2/test.mv.db file is in the root path of the entire project - * The URL configured in our program is jdbc:h2:file:./h2/test;AUTO_SERVER=TRUE;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL - * When using the code-generator-maven-plugin, the above URL cannot be configured because the root path of the plug-in in a multi-module project is project-child and is not where the /h2/test.mv.db file is located - * At this point we can use the following two ways to manually specify: - * Use absolute path: jdbc:h2:file:C:/Source/code/gitee/quickboot/h2/test;AUTO_SERVER=TRUE;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL - * Use relative paths (one more layer ../ symbol): jdbc:h2:file:./../h2/test;AUTO_SERVER=TRUE;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL - * Note: Only multi-module projects need to be specified this way; individual projects are not affected. -3. How do I customize templates? - * See the template file in the src\main\resources\templates directory in the code-generator-maven-plugin project. You can also change the suffix to anything else. See the templateType parameter description. - * Note the naming of the template file. The first paragraph is part of the name of the generated file. The second paragraph is the suffix of the generated file; The third part is the suffix of template type; - * Template content parameter. Refer to the existing template file content, you can use in the end there are basic inside, can be used directly. +## 常见问题 +1. H2 数据库中表存在,但没有生成代码。 + * H2数据库默认区分表名称大小写,要么保证输入的表名称大小写完全一致,要么第一次创建 H2 数据库表时,jdbc url 参数增加 IGNORECASE=TRUE 参数。 +2. 如何自定义生成代码的模板? + * 使用 code-generator:code 插件,并在 pom.xml 中配置 templateDir 参数。 + * 模板文件参考 code-generator-maven-plugin 工程下,src\main\resources\templates 目录下的 velocity 模板 *.vm 文件。 + * 模板参数参考 ITemplateEngine.java 类中的 getObjectMap 方法或其他 .vm 中用到的参数。 -## Futures -You are welcome to suggest better ways to improve this widget. -## Contributions -You are welcome to contribute code, let more people more time to accompany the people you care about. +## 期望 +欢迎您提出更好的意见,帮助完善这个小插件. +## 贡献 +欢迎您贡献代码,让更多的人多点时间陪陪关心的人。 \ No newline at end of file diff --git a/README.zh.md b/README.zh.md deleted file mode 100644 index 50605f3ba8000bd628c957e7dbbef0e0c28436ac..0000000000000000000000000000000000000000 --- a/README.zh.md +++ /dev/null @@ -1,138 +0,0 @@ -# code-generator-maven-plugin - -Language: [English](README.md) - -

- - - - - - - - - - - gitee star - - - github star - -

- -## 简介 -code-generator-maven-plugin 是一个基于baomidou mybatis-plus-generator实现的,在 Maven 项目中生成代码的 Maven 插件。主要包括: -- code-generator:**MyBatis**:基于数据库表生成 Mybatis 下的 Controller.java, Service.java, Mapper.java, mapper.xml, Entity.java 层CRUD代码; -- code-generator:**MyBatis-Plus**:基于数据库表生成 Mybatis-plus 下的 Controller.java, Service.java, Mapper.java, mapper.xml, Entity.java 层CRUD代码; -- code-generator:**JPA**:基于数据库表生成 Jpa 下的 Controller.java, Service.java, Repository.java, Entity.java 层CRUD代码; -- code-generator:**Customer**:基于数据库表生成CRUD代码,可以指定自定义模板位置; -- code-generator:**Dockerfile**:生成当前项目的 Dockerfile 文件,以及相关脚本:DockerImageBuild.bat, DockerImageBuildRun.bat, DockerImageDelete.bat -- code-generator:**Docker-Build**:基于本地安装的 Docker 来构建 docker image -- code-generator:**Docker-Deploy**:基于本地安装的 Docker 来构建 docker image 并部署 docker 容器 -- code-generator:**Docker-Delete**:基于本地安装的 Docker 来删除已经部署的 docker 容器和 docker image -- 理论可以扩展任意前后台跟数据库表有关系的技术:如:Vue, Element-UI 代码等。 -- 理论支持所有支持JDBC连接的数据库:例如:DB2, DM, H2, Mariadb, MySQL, Oracle, Postgre, Sqlite, SQLServer - -## 如何使用? -在Intellij IDEA 的 Maven 模块中找到下面图中的 code-generator 插件,然后双击对应的插件命令即可。 - -![image](docs/image/code-generator-maven-plugin.png) - -**注意** -* 默认 Java 代码生成在当前工程的 target/code-generator/ 目录下。 -* 默认包路径为:com.github.mengweijin -* 默认 Dockerfile 等文件生成在当前工程的 target 目录下。 -* Customer 插件必须配置 templateLocation 参数,默认 templateType 参数值为 beetl。 - -## 生成 java 代码 -### 1. 一般使用 -在标准 SpringBoot 项目,以开发工具 Intellij IDEA 为例:在 Maven 中引入 code-generator-maven-plugin 插件 -~~~~xml - - com.github.mengweijin - code-generator-maven-plugin - Latest Version - - - sys_user, sys_role - com.github.mengweijin.quickboot.mybatis.BaseEntity - - - -~~~~ - -### 2. 全部配置使用 -~~~~xml - - com.github.mengweijin - code-generator-maven-plugin - Latest Version - - - com.github.mengweijin - mengweijin - - root - root - jdbc:mysql://192.168.83.128:3306/mwj_cms - - sys_user, rlt_user_role - sys_, rlt_ - com.github.mengweijin.BaseEntity - true - - D:\code-generator-maven-plugin\src\main\resources\templates - beetl - - - -~~~~ - -## 参数配置说明 -| 参数名称 | 是否必填 | 配置示例 | 说明 | -|-----------------:|:-----|:------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------| -| outputPackage | 否 | com.github.mengweijin | 代码生成的包路径。 默认:com.github.mengweijin | -| author | 否 | mengweijin | 类注释上面@author的值。 默认:取当前电脑的用户名 | -| dbInfo.username | 否 | root | 数据库连接信息。如果是标准的SpringBoot工程,可以省略,会自动读取application.yml/yaml/properties文件。 | -| dbInfo.password | 否 | root | 同上 | -| dbInfo.url | 否 | jdbc:mysql://192.168.83.128:3306/test | 同上。注意:如果是多模块项目使用 H2 数据库生成代码时,要注意 URL 的书写方式,详情参考**常见问题**章节 | -| tables | 否 | sys_user, rlt_user_role | 要生成代码对应的数据库表名称。如果不配置,会生成数据库中所有的表。部分数据库对表名称大小写敏感,此时需要配置的表名称跟数据库中的完全一致。多个表名称使用英文逗号分隔 | -| tablePrefix | 否 | sys_, rlt_ | 要生成代码对应的数据库表名称的前缀。配置后,生成的entity类就不会带有表前缀了。如:User, UserRole。如果不配置,生成的entity类就会带有表前缀。如:SysUser, RltUserRole。多个表名称前缀使用英文逗号分隔 | -| superEntityClass | 否 | com.github.mengweijin.quickboot.mybatis.BaseEntity | 生成的entity类继承的父类 | -| lombokModel | 否 | true | 生成的entity是否启用lombok方式。不配置或者配置为true: 启用lombok方式;配置为false: 不启用lombok方式,则生成的entity中包含getter/setter/toString方法。 | -| templateLocation | 是 | D:\code-generator-maven-plugin\src\main\resources\templates | 仅Customer插件参数,用户自定义模板位置。如果用户想自己编写生成代码的模板文件,可以用Customer插件,并配置模板文件所在的文件夹的绝对路径。比如:可以放到你工程代码的 resources/generator/ 目录下。 | -| templateType | 否 | beetl | 仅Customer插件参数,用户自定义模板类型。非必填,可选值为:"beetl, velocity, freemarker",对应的模板后缀为:"btl, vm, ftl"。不配置的话默认值为:beetl,即模板后缀应该为 .btl 结尾。 | - -## 常见问题 -1. 数据库表存在,但没有生成代码文件,程序也没有报错。 - * 配置数据库表名称(tables)一定要跟数据库中的表名称大小写完全一致。例如H2数据库用脚本创建表时的脚本中写的名称是小写,但真实生成的表名称可能是大写的,因此这里需要配置为大写的表名称。 -2. 多模块项目使用 H2 数据库生成代码时,提示“表\[table_name]在数据库中不存在!!!” 的问题。 - * 项目结构为多模块时,项目结构如下: - ````txt - - project-parent - - h2 - - test.mv.db - - project-child - - src - - main - - java - - resources - - pom.xml(code-generator-maven-plugin 在这里配置的) - - pom.xml(project-parent 的) - ```` - * 可以发现,/h2/test.mv.db 文件在整个项目的根路径下 - * 我们程序中配置的 url 为 jdbc:h2:file:./h2/test;AUTO_SERVER=TRUE;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL - * 当使用 code-generator-maven-plugin 时,就不能配置上面的 url 了, 因为多模块项目中的插件的根路径为 project-child 的,并不是 /h2/test.mv.db 文件所在的位置 - * 此时我们可以使用以下两种方式来手动指定: - * 使用绝对路径:jdbc:h2:file:C:/Source/code/gitee/quickboot/h2/test;AUTO_SERVER=TRUE;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL - * 使用相对路径(多加了一层 ../ 符号):jdbc:h2:file:./../h2/test;AUTO_SERVER=TRUE;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL - * 注意:只用多模块项目才需要这样指定,单个项目不受影响。 -3. 如何自定义模板? - * 参考 code-generator-maven-plugin工程下,src\main\resources\templates 目录下的模板文件。用的 btl 后缀,当然你也可以改为其他的,参考 templateType 参数说明。 - * 注意文件命名,分为三段,第一段为生成的文件的名称的一部分;第二段为生成的文件的后缀;第三部分为模板类型后缀; - * 模板内容参数:参考已有的各个模板文件内容,你能用到底里面基本都有,直接使用即可。 - -## 期望 -欢迎您提出更好的意见,帮助完善这个小插件. -## 贡献 -欢迎您贡献代码,让更多的人多点时间陪陪关心的人。 \ No newline at end of file diff --git a/docs/image/code-generator-maven-plugin.png b/docs/image/code-generator-maven-plugin.png index 7e46b7ef6b6509f0190a6e42ff9ec6b08a838aa6..8ae7aa3572ea4758ae6f4d404ae35c4630856f42 100644 Binary files a/docs/image/code-generator-maven-plugin.png and b/docs/image/code-generator-maven-plugin.png differ diff --git a/pom.xml b/pom.xml index 0ffb858ba3ec9ac07523e2ed147c3d767d8d7b2b..dc08b23b57150361c960f64ef5419131a132ade3 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.mengweijin code-generator-maven-plugin maven-plugin - 1.0.16 + 1.1.0-SNAPSHOT code-generator-maven-plugin code-generator-maven-plugin @@ -16,20 +16,24 @@ UTF-8 1.8 - 3.5.1 - 3.5.2 - 3.10.0.RELEASE + 3.5.7 + 3.5.7 + + 6.0.0-M13 + 5.7.4 + 2.2 + 2.0.49 + 1.5.6 + 2.3 2.3.31 - 5.8.2 - 5.7.4 - 1.30 - 1.2.79 + 3.16.1.RELEASE + 5.1.3 - 3.8.4 + 3.9.6 3.8.4 3.6.4 - 1.18.22 + 1.18.32 @@ -44,15 +48,15 @@ - cn.hutool + org.dromara.hutool hutool-all ${hutool.version} - com.alibaba - fastjson - ${fastjson.vsersion} + com.alibaba.fastjson2 + fastjson2 + ${fastjson2.vsersion} @@ -62,10 +66,11 @@ - com.ibeetl - beetl - ${beetl.version} + ch.qos.logback + logback-classic + ${logback.vsersion} + org.apache.velocity velocity-engine-core @@ -75,6 +80,19 @@ org.freemarker freemarker ${freemarker.version} + provided + + + com.ibeetl + beetl + ${beetl.version} + provided + + + com.jfinal + enjoy + ${enjoy.version} + provided @@ -111,25 +129,12 @@ - - - oss-snapshots - https://oss.sonatype.org/content/repositories/snapshots - - false - - - true - - - - org.apache.maven.plugins maven-plugin-plugin - 3.6.0 + 3.13.0 @@ -219,6 +224,19 @@ + + + huawei + https://mirrors.huaweicloud.com/repository/maven/ + + + + + huawei + https://mirrors.huaweicloud.com/repository/maven/ + + + diff --git a/src/main/java/com/github/mengweijin/code/generator/driver/DriverShim.java b/src/main/java/com/github/mengweijin/code/generator/driver/DriverShim.java new file mode 100644 index 0000000000000000000000000000000000000000..6d10666edd156eec0172ed03df2954f8af676c21 --- /dev/null +++ b/src/main/java/com/github/mengweijin/code/generator/driver/DriverShim.java @@ -0,0 +1,65 @@ +package com.github.mengweijin.code.generator.driver; + +import lombok.Getter; + +import java.sql.Connection; +import java.sql.Driver; +import java.sql.DriverPropertyInfo; +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; +import java.util.Properties; +import java.util.logging.Logger; + +/** + * 使用了 DriverShim 包装类后,在 getConnection() 时 DriverManager 同样要验证驱动是否对应用程序类加载器可见, + * 只是这时候要验证的是这个 DriverShim 而非通过自定义类加载器弄进来的 “com.mysql.jdbc.Driver” 了。 + * 而后在使用 DriverShim 桥接到实际的 com.mysql.jdbc.Driver 时 DriverManager 就管不着了。 + * 大致意思就是:你 DriverManager 不是想验证数据库驱动是否是应用程序类加载器加载的吗?给个壳逗你玩一下, + * 我在壳里面呢,你管我是由哪个类加载器加载的。 + * @author mengweijin + * @date 2022/10/30 + */ +@Getter +public class DriverShim implements Driver { + + private Driver driver; + + DriverShim(Driver driver) { + this.driver = driver; + } + + @Override + public Connection connect(String url, Properties info) throws SQLException { + return this.driver.connect(url, info); + } + + @Override + public boolean acceptsURL(String url) throws SQLException { + return this.driver.acceptsURL(url); + } + + @Override + public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException { + return this.driver.getPropertyInfo(url, info); + } + + @Override + public int getMajorVersion() { + return this.driver.getMajorVersion(); + } + + @Override + public int getMinorVersion() { + return this.driver.getMinorVersion(); + } + + @Override + public boolean jdbcCompliant() { + return this.driver.jdbcCompliant(); + } + + @Override + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + return null; + } +} diff --git a/src/main/java/com/github/mengweijin/generator/config/CustomerDataSource.java b/src/main/java/com/github/mengweijin/code/generator/driver/DynamicDriverDataSource.java similarity index 37% rename from src/main/java/com/github/mengweijin/generator/config/CustomerDataSource.java rename to src/main/java/com/github/mengweijin/code/generator/driver/DynamicDriverDataSource.java index ef60476657d9ef3a8c477f66431c7f123b110dc2..a0d2bafe2e37537e6414c94866307c3b9594c057 100644 --- a/src/main/java/com/github/mengweijin/generator/config/CustomerDataSource.java +++ b/src/main/java/com/github/mengweijin/code/generator/driver/DynamicDriverDataSource.java @@ -1,29 +1,34 @@ -package com.github.mengweijin.generator.config; +package com.github.mengweijin.code.generator.driver; + +import lombok.Getter; +import org.dromara.hutool.db.driver.DriverIdentifier; -import cn.hutool.core.util.ReflectUtil; -import cn.hutool.db.dialect.DriverUtil; import javax.sql.DataSource; import java.io.PrintWriter; -import java.lang.reflect.Method; import java.sql.Connection; +import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; -import java.util.Properties; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; import java.util.logging.Logger; /** + * 动态加载数据库驱动包的 DataSource * @author mengweijin */ -public class CustomerDataSource implements DataSource { +@Getter +public class DynamicDriverDataSource implements DataSource { - private String url; + private final String url; - private String username; + private final String username; - private String password; + private final String password; - public CustomerDataSource(String url, String username, String password) { + public DynamicDriverDataSource(String url, String username, String password) { this.url = url; this.username = username; this.password = password; @@ -36,31 +41,15 @@ public class CustomerDataSource implements DataSource { @Override public Connection getConnection(String username, String password) throws SQLException { - Connection conn; + DriverShim driverShim = null; + Connection connection; try { - // hutool 5.6.3 已修复:https://gitee.com/dromara/hutool/issues/I3EWBI - // 关于DriverUtil.identifyDriver(url); 的 Classloader 的问题,hutool 内部已经默认使用了线程上下文类加载器,因此这里无需处理 - Class.forName(DriverUtil.identifyDriver(url), true, Thread.currentThread().getContextClassLoader()); - - Properties info = new Properties(); - if (username != null) { - info.put("user", username); - } - if (password != null) { - info.put("password", password); - } - - Method method = ReflectUtil.getMethod( - DriverManager.class, - "getConnection", - String.class, Properties.class, Class.class); - method.setAccessible(true); - conn = ReflectUtil.invokeStatic(method, this.url, info, null); - } catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException(e); + driverShim = this.registerDriverByUrl(this.url); + connection = DriverManager.getConnection(this.url, username, password); + } finally { + this.deregisterDriver(driverShim); } - return conn; + return connection; } @Override @@ -97,4 +86,66 @@ public class CustomerDataSource implements DataSource { public Logger getParentLogger() throws SQLFeatureNotSupportedException { throw new SQLFeatureNotSupportedException("DataSource can't support getParentLogger method!"); } + + public DriverShim registerDriverByUrl(String jdbcUrl) { + return this.registerDriver(new DriverIdentifier(Thread.currentThread().getContextClassLoader()).identifyDriver(jdbcUrl)); + } + + /** + * + * @param driverClass For Example: com.mysql.cj.jdbc.Driver + * @return DriverShim + */ + public DriverShim registerDriver(String driverClass) { + try { + Driver driver = (Driver) Class.forName(driverClass, true, Thread.currentThread().getContextClassLoader()).getDeclaredConstructor().newInstance(); + DriverShim driverShim = new DriverShim(driver); + DriverManager.registerDriver(driverShim); + return driverShim; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public void deregisterDriver(DriverShim driverShim) { + try { + if (driverShim != null) { + DriverManager.deregisterDriver(driverShim); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static void deregisterAllDriverShim() { + try { + Enumeration enumeration = DriverManager.getDrivers(); + while (enumeration.hasMoreElements()) { + Object element = enumeration.nextElement(); + if (element.getClass() == DriverShim.class) { + DriverManager.deregisterDriver((DriverShim) element); + } + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static List listRegisteredDrivers() { + List list = new ArrayList<>(); + + Enumeration enumeration = DriverManager.getDrivers(); + String driverName; + while (enumeration.hasMoreElements()) { + Driver element = enumeration.nextElement(); + if (element.getClass() == DriverShim.class) { + driverName = ((DriverShim) element).getDriver().getClass().getName(); + } else { + driverName = element.getClass().getName(); + } + list.add(driverName); + } + + return list; + } } diff --git a/src/main/java/com/github/mengweijin/code/generator/dto/Config.java b/src/main/java/com/github/mengweijin/code/generator/dto/Config.java new file mode 100644 index 0000000000000000000000000000000000000000..fa94b0751cf943c2033a4277f7e6d710a277ec34 --- /dev/null +++ b/src/main/java/com/github/mengweijin/code/generator/dto/Config.java @@ -0,0 +1,39 @@ +package com.github.mengweijin.code.generator.dto; + +import lombok.Data; +import org.dromara.hutool.core.util.SystemUtil; + +/** + * @author mengweijin + */ +@Data +public class Config { + + private String packages; + + private String moduleName; + + private String author = SystemUtil.get("user.name", false); + + private String outputDir = "/target/code-generator"; + + private String templateDir; + + /** + * Optional for Spring Boot if exists application.yml. + */ + private DbInfo dbInfo; + + /** + * Optional. + * For example: SYS_, VTL_ + * Note: Separated by commas. + */ + private String[] tablePrefix; + + /** + * Optional. + */ + private String baseEntity; + +} diff --git a/src/main/java/com/github/mengweijin/generator/entity/DbInfo.java b/src/main/java/com/github/mengweijin/code/generator/dto/DbInfo.java similarity index 76% rename from src/main/java/com/github/mengweijin/generator/entity/DbInfo.java rename to src/main/java/com/github/mengweijin/code/generator/dto/DbInfo.java index d0f2699e418d591353ba0be1b6b7651567632926..31c4969b1da54c0467aa547c88c51b700374d1e0 100644 --- a/src/main/java/com/github/mengweijin/generator/entity/DbInfo.java +++ b/src/main/java/com/github/mengweijin/code/generator/dto/DbInfo.java @@ -1,4 +1,4 @@ -package com.github.mengweijin.generator.entity; +package com.github.mengweijin.code.generator.dto; import lombok.Data; @@ -13,4 +13,6 @@ public class DbInfo { private String username; private String password; + + } diff --git a/src/main/java/com/github/mengweijin/code/generator/engine/AbstractVelocityTemplateEngine.java b/src/main/java/com/github/mengweijin/code/generator/engine/AbstractVelocityTemplateEngine.java new file mode 100644 index 0000000000000000000000000000000000000000..ea054e814f987c2439d829f6544ec1638ab98389 --- /dev/null +++ b/src/main/java/com/github/mengweijin/code/generator/engine/AbstractVelocityTemplateEngine.java @@ -0,0 +1,102 @@ +package com.github.mengweijin.code.generator.engine; + +import com.baomidou.mybatisplus.generator.config.ConstVal; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import com.github.mengweijin.code.generator.dto.Config; +import com.github.mengweijin.code.generator.util.GeneratorUtils; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.VelocityEngine; +import org.dromara.hutool.core.collection.CollUtil; +import org.dromara.hutool.core.io.file.FileUtil; +import org.dromara.hutool.core.text.StrUtil; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.util.List; +import java.util.Map; + +/** + * @author mengweijin + */ +@Slf4j +@Getter +public abstract class AbstractVelocityTemplateEngine implements ITemplateEngine { + + private VelocityEngine velocityEngine; + + private Config config; + + private List tableInfoList; + + static { + try { + Class.forName("org.apache.velocity.util.DuckType"); + } catch (ClassNotFoundException e) { + // velocity1.x的生成格式错乱 https://github.com/baomidou/generator/issues/5 + log.warn("Velocity 1.x is outdated, please upgrade to 2.x or later."); + } + } + + protected abstract VelocityEngine getVelocityEngine(String templateDir); + + protected abstract List getTemplates(); + + @Override + public ITemplateEngine init(Config config, List tableInfoList) { + this.config = config; + this.tableInfoList = tableInfoList; + this.velocityEngine = this.getVelocityEngine(config.getTemplateDir()); + return this; + } + + @Override + public void write(){ + this.tableInfoList.forEach(tableInfo -> { + Map objectMap = this.getObjectMap(this.config, tableInfo); + + List templateFilePathList = this.getTemplates(); + if (CollUtil.isEmpty(templateFilePathList)) { + throw new RuntimeException("No template files found in location " + this.config.getTemplateDir()); + } else { + String message = "Found " + templateFilePathList.size() + " template files in location " + this.config.getTemplateDir(); + log.info(message); + } + + templateFilePathList.forEach(tpl -> { + String tplName = tpl.contains("/") ? StrUtil.subAfter(tpl, "/", true) : tpl; + String outputFileName = StrUtil.subBefore(GeneratorUtils.renderString(tplName, objectMap), ".", true); + String outputFilePath = config.getOutputDir() + "/" + outputFileName; + FileUtil.mkParentDirs(outputFilePath); + this.write(objectMap, tpl, FileUtil.file(outputFilePath)); + }); + }); + } + + /** + * + * @param objectMap template engine args + * @param templatePath E.g. 1 file system: demo.vm + * E.g. 2 classpath: generator/mybatis/demo.vm + * @param outputFile E.g.: D:/code/vitality/Demo.java + */ + private void write(Map objectMap, String templatePath, File outputFile) { + Template template = velocityEngine.getTemplate(templatePath, ConstVal.UTF8); + try (FileOutputStream fos = new FileOutputStream(outputFile); + OutputStreamWriter ow = new OutputStreamWriter(fos, ConstVal.UTF8); + BufferedWriter writer = new BufferedWriter(ow)) { + template.merge(new VelocityContext(objectMap), writer); + log.info("生成成功!模板:{};文件:{}", templatePath, outputFile); + } catch (IOException e) { + log.error("生成失败!模板:{}; 文件:{}", templatePath, outputFile); + log.error(e.getMessage(), e); + throw new RuntimeException(e); + } + } + +} diff --git a/src/main/java/com/github/mengweijin/code/generator/engine/ITemplateEngine.java b/src/main/java/com/github/mengweijin/code/generator/engine/ITemplateEngine.java new file mode 100644 index 0000000000000000000000000000000000000000..d9903c4b4e3b442cebc60c342c701c0aef92b4c1 --- /dev/null +++ b/src/main/java/com/github/mengweijin/code/generator/engine/ITemplateEngine.java @@ -0,0 +1,64 @@ +package com.github.mengweijin.code.generator.engine; + +import com.baomidou.mybatisplus.generator.config.po.TableField; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import com.github.mengweijin.code.generator.dto.Config; +import com.github.mengweijin.code.generator.util.GeneratorUtils; +import org.dromara.hutool.core.collection.CollUtil; +import org.dromara.hutool.core.date.DatePattern; +import org.dromara.hutool.core.date.DateUtil; +import org.dromara.hutool.core.text.StrUtil; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author mengweijin + */ +public interface ITemplateEngine { + + ITemplateEngine init(Config config, List tableInfoList); + + void write(); + + default Map getObjectMap(Config config, TableInfo tableInfo) { + List baseEntityColumns = GeneratorUtils.resolveBaseEntityColumns(config); + String entityName = GeneratorUtils.resolveEntityName(tableInfo.getName(), config); + List entityFields = GeneratorUtils.resolveEntityFields(tableInfo, baseEntityColumns); + List commonFields = GeneratorUtils.resolveCommonFields(tableInfo, baseEntityColumns); + + List entityColumns = GeneratorUtils.resolveEntityColumns(entityFields); + List commonColumns = GeneratorUtils.resolveCommonColumns(commonFields); + + String requestMapping = "/" + StrUtil.toSymbolCase(entityName, '-'); + if(StrUtil.isNotBlank(config.getModuleName())) { + requestMapping = StrUtil.addPrefixIfNot(config.getModuleName(), "/") + requestMapping; + } + + Map objectMap = new HashMap<>(); + objectMap.put("package", config.getPackages()); + objectMap.put("author", config.getAuthor()); + objectMap.put("date", DateUtil.format(LocalDateTime.now(), DatePattern.NORM_DATE_PATTERN)); + objectMap.put("baseEntity", config.getBaseEntity()); + objectMap.put("baseEntityPackage", StrUtil.subBefore(config.getBaseEntity(), ".", true)); + objectMap.put("baseEntityName", StrUtil.subAfter(config.getBaseEntity(), ".", true)); + objectMap.put("baseEntityColumns", baseEntityColumns); + objectMap.put("table", tableInfo); + objectMap.put("idField", GeneratorUtils.getIdField(tableInfo)); + objectMap.put("entityName", entityName); + objectMap.put("entityPropertyName", StrUtil.lowerFirst(entityName)); + objectMap.put("entityFields", entityFields); + objectMap.put("commonFields", commonFields); + objectMap.put("allFields", CollUtil.addAll(new ArrayList<>(entityFields), new ArrayList<>(commonFields))); + objectMap.put("entityColumns", entityColumns); + objectMap.put("commonColumns", commonColumns); + objectMap.put("allColumns", CollUtil.addAll(new ArrayList<>(entityColumns), new ArrayList<>(commonColumns))); + objectMap.put("requestMapping", requestMapping); + return objectMap; + } + + +} diff --git a/src/main/java/com/github/mengweijin/code/generator/engine/VelocityClasspathTemplateEngine.java b/src/main/java/com/github/mengweijin/code/generator/engine/VelocityClasspathTemplateEngine.java new file mode 100644 index 0000000000000000000000000000000000000000..97d2adb9aa28e70cffdd628cb067d9c6dda53c0d --- /dev/null +++ b/src/main/java/com/github/mengweijin/code/generator/engine/VelocityClasspathTemplateEngine.java @@ -0,0 +1,59 @@ +package com.github.mengweijin.code.generator.engine; + +import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.generator.config.ConstVal; +import com.github.mengweijin.code.generator.dto.Config; +import com.github.mengweijin.code.generator.enums.TemplateType; +import org.apache.velocity.app.Velocity; +import org.apache.velocity.app.VelocityEngine; +import org.dromara.hutool.core.io.resource.ClassPathResource; +import org.dromara.hutool.core.io.resource.JarResource; + +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.Properties; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +/** + * @author mengweijin + */ +public class VelocityClasspathTemplateEngine extends AbstractVelocityTemplateEngine { + + /** + * classpath + * @param templateDir keep null value + * @return VelocityEngine + */ + @Override + protected VelocityEngine getVelocityEngine(String templateDir) { + Properties p = new Properties(); + p.setProperty(ConstVal.VM_LOAD_PATH_KEY, ConstVal.VM_LOAD_PATH_VALUE); + p.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, StringPool.EMPTY); + p.setProperty(Velocity.ENCODING_DEFAULT, ConstVal.UTF8); + p.setProperty(Velocity.INPUT_ENCODING, ConstVal.UTF8); + p.setProperty("file.resource.loader.unicode", StringPool.TRUE); + return new VelocityEngine(p); + } + + @Override + protected List getTemplates() { + Config config = this.getConfig(); + List templateFilePathList = new ArrayList<>(); + + ClassPathResource classPathResource = new ClassPathResource(config.getTemplateDir()); + JarResource jarResource = new JarResource(classPathResource.getUrl()); + JarFile jarFile = jarResource.getJarFile(); + Enumeration enumeration = jarFile.entries(); + + String templateLocationPrefixPath = config.getTemplateDir().endsWith("/") ? config.getTemplateDir() : config.getTemplateDir() + "/"; + while (enumeration.hasMoreElements()) { + String jarEntryName = enumeration.nextElement().getName(); + if(jarEntryName.startsWith(templateLocationPrefixPath) && jarEntryName.endsWith(TemplateType.velocity.getSuffix())) { + templateFilePathList.add(jarEntryName); + } + } + return templateFilePathList; + } +} diff --git a/src/main/java/com/github/mengweijin/code/generator/engine/VelocityFileSystemTemplateEngine.java b/src/main/java/com/github/mengweijin/code/generator/engine/VelocityFileSystemTemplateEngine.java new file mode 100644 index 0000000000000000000000000000000000000000..87fae78093bf809ea329972bdf87cf302e9402c5 --- /dev/null +++ b/src/main/java/com/github/mengweijin/code/generator/engine/VelocityFileSystemTemplateEngine.java @@ -0,0 +1,40 @@ +package com.github.mengweijin.code.generator.engine; + +import com.baomidou.mybatisplus.generator.config.ConstVal; +import com.github.mengweijin.code.generator.dto.Config; +import com.github.mengweijin.code.generator.enums.TemplateType; +import org.apache.velocity.app.Velocity; +import org.apache.velocity.app.VelocityEngine; +import org.dromara.hutool.core.io.file.FileUtil; + +import java.io.File; +import java.util.List; +import java.util.Properties; +import java.util.stream.Collectors; + +/** + * @author mengweijin + */ +public class VelocityFileSystemTemplateEngine extends AbstractVelocityTemplateEngine { + + /** + * file system + * @param templateDir absolute path. E.g.: D:/code/template + * @return VelocityEngine + */ + @Override + protected VelocityEngine getVelocityEngine(String templateDir) { + Properties p = new Properties(); + p.setProperty(VelocityEngine.FILE_RESOURCE_LOADER_PATH, templateDir); + p.setProperty(Velocity.ENCODING_DEFAULT, ConstVal.UTF8); + p.setProperty(Velocity.INPUT_ENCODING, ConstVal.UTF8); + return new VelocityEngine(p); + } + + @Override + protected List getTemplates() { + Config config = this.getConfig(); + List loopFiles = FileUtil.loopFiles(config.getTemplateDir(), file -> file.isFile() && file.getName().toLowerCase().endsWith(TemplateType.velocity.getSuffix())); + return loopFiles.stream().map(File::getName).collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/github/mengweijin/generator/enums/TemplateType.java b/src/main/java/com/github/mengweijin/code/generator/enums/TemplateType.java similarity index 66% rename from src/main/java/com/github/mengweijin/generator/enums/TemplateType.java rename to src/main/java/com/github/mengweijin/code/generator/enums/TemplateType.java index 3fed25aa8f5360b0400494f08551b3d30a59d223..65b25ae5f564101584cca46e32af5e66baaa45b8 100644 --- a/src/main/java/com/github/mengweijin/generator/enums/TemplateType.java +++ b/src/main/java/com/github/mengweijin/code/generator/enums/TemplateType.java @@ -1,4 +1,4 @@ -package com.github.mengweijin.generator.enums; +package com.github.mengweijin.code.generator.enums; /** * @author mengweijin @@ -6,7 +6,7 @@ package com.github.mengweijin.generator.enums; public enum TemplateType { - beetl("btl"), velocity("vm"), freemarker("ftl"); + velocity("vm"), freemarker("ftl"), beetl("btl"), enjoy("ej"); private final String suffix; diff --git a/src/main/java/com/github/mengweijin/code/generator/mojo/AbstractClasspathGeneratorMojo.java b/src/main/java/com/github/mengweijin/code/generator/mojo/AbstractClasspathGeneratorMojo.java new file mode 100644 index 0000000000000000000000000000000000000000..103e39151bdcf5779bffc5e015b6df765dca5634 --- /dev/null +++ b/src/main/java/com/github/mengweijin/code/generator/mojo/AbstractClasspathGeneratorMojo.java @@ -0,0 +1,32 @@ +package com.github.mengweijin.code.generator.mojo; + +import com.github.mengweijin.code.generator.dto.Config; +import com.github.mengweijin.code.generator.engine.ITemplateEngine; +import com.github.mengweijin.code.generator.engine.VelocityClasspathTemplateEngine; +import lombok.extern.slf4j.Slf4j; + +/** + * @author mengweijin + */ +@Slf4j +public abstract class AbstractClasspathGeneratorMojo extends AbstractGeneratorMojo { + + @Override + protected void checkTemplateExists() throws RuntimeException { + // ignore for classpath + } + + @Override + protected void initConfigTemplateDir() { + Config config = this.getConfig(); + config.setTemplateDir(this.getTemplateDir()); + } + + @Override + protected ITemplateEngine getTemplateEngine() { + return new VelocityClasspathTemplateEngine(); + } + + protected abstract String getTemplateDir(); + +} diff --git a/src/main/java/com/github/mengweijin/code/generator/mojo/AbstractFileSystemGeneratorMojo.java b/src/main/java/com/github/mengweijin/code/generator/mojo/AbstractFileSystemGeneratorMojo.java new file mode 100644 index 0000000000000000000000000000000000000000..a3cd580f249845411035800d859a9d80758510f2 --- /dev/null +++ b/src/main/java/com/github/mengweijin/code/generator/mojo/AbstractFileSystemGeneratorMojo.java @@ -0,0 +1,48 @@ +package com.github.mengweijin.code.generator.mojo; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.github.mengweijin.code.generator.dto.Config; +import com.github.mengweijin.code.generator.engine.ITemplateEngine; +import com.github.mengweijin.code.generator.engine.VelocityFileSystemTemplateEngine; +import com.github.mengweijin.code.generator.enums.TemplateType; +import lombok.extern.slf4j.Slf4j; +import org.dromara.hutool.core.io.file.FileUtil; +import org.dromara.hutool.core.text.StrUtil; + +import java.io.File; +import java.util.List; + +/** + * @author mengweijin + */ +@Slf4j +public abstract class AbstractFileSystemGeneratorMojo extends AbstractGeneratorMojo { + + @Override + protected void checkTemplateExists() throws RuntimeException { + Config config = this.getConfig(); + File baseDir = this.getBaseDir(); + if(StrUtil.isBlank(config.getTemplateDir())) { + throw new RuntimeException("No template location is configured!"); + } + String templateLocation = baseDir.getAbsolutePath() + StrUtil.addPrefixIfNot(config.getTemplateDir(), "/"); + List templateFileList = FileUtil.loopFiles(templateLocation, file -> file.isFile() && file.getName().toLowerCase().endsWith(TemplateType.velocity.getSuffix())); + if(CollectionUtils.isEmpty(templateFileList)) { + throw new RuntimeException("No template file exists in path " + templateLocation); + } + } + + @Override + protected void initConfigTemplateDir() { + Config config = this.getConfig(); + File baseDir = this.getBaseDir(); + String templateDir = baseDir.getAbsolutePath() + StrUtil.addPrefixIfNot(config.getTemplateDir(), "/"); + config.setTemplateDir(templateDir); + } + + @Override + protected ITemplateEngine getTemplateEngine() { + return new VelocityFileSystemTemplateEngine(); + } + +} diff --git a/src/main/java/com/github/mengweijin/code/generator/mojo/AbstractGeneratorMojo.java b/src/main/java/com/github/mengweijin/code/generator/mojo/AbstractGeneratorMojo.java new file mode 100644 index 0000000000000000000000000000000000000000..96d8e829e295581384de690e07664da033c30348 --- /dev/null +++ b/src/main/java/com/github/mengweijin/code/generator/mojo/AbstractGeneratorMojo.java @@ -0,0 +1,184 @@ +package com.github.mengweijin.code.generator.mojo; + +import com.baomidou.mybatisplus.generator.config.DataSourceConfig; +import com.baomidou.mybatisplus.generator.config.StrategyConfig; +import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder; +import com.baomidou.mybatisplus.generator.config.builder.GeneratorBuilder; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import com.github.mengweijin.code.generator.driver.DynamicDriverDataSource; +import com.github.mengweijin.code.generator.dto.Config; +import com.github.mengweijin.code.generator.dto.DbInfo; +import com.github.mengweijin.code.generator.engine.ITemplateEngine; +import com.github.mengweijin.code.generator.util.DbInfoUtils; +import com.github.mengweijin.code.generator.util.GeneratorUtils; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.apache.maven.execution.MavenSession; +import org.apache.maven.model.Resource; +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.project.MavenProject; +import org.dromara.hutool.core.array.ArrayUtil; +import org.dromara.hutool.core.classloader.JarClassLoader; +import org.dromara.hutool.core.io.file.FileUtil; +import org.dromara.hutool.core.text.StrUtil; + +import java.io.File; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Scanner; +import java.util.Set; + +/** + * @author mengweijin + */ +@Slf4j +@Getter +public abstract class AbstractGeneratorMojo extends AbstractMojo { + + @Parameter + private Config config; + + @Parameter(defaultValue = "${project}") + private MavenProject project; + + @Parameter(defaultValue = "${basedir}") + private File baseDir; + + @Parameter(defaultValue = "${project.build.resources}", readonly = true, required = true) + private List resources; + + @Parameter(defaultValue = "${project.build.sourceDirectory}", required = true, readonly = true) + private File sourceDir; + + @Parameter(defaultValue = "${project.build.testResources}", readonly = true, required = true) + private List testResources; + + @Parameter(defaultValue = "${project.build.testSourceDirectory}", readonly = true, required = true) + private File testSourceDir; + + @Parameter(defaultValue = "${project.compileClasspathElements}", readonly = true, required = true) + private List compilePath; + + @Parameter(defaultValue = "${session}", readonly = true) + private MavenSession session; + + protected abstract void checkTemplateExists() throws RuntimeException; + + protected abstract void initConfigTemplateDir(); + + protected abstract ITemplateEngine getTemplateEngine(); + + @Override + public void execute() throws MojoExecutionException, MojoFailureException { + try { + this.checkTemplateExists(); + + this.initConfigTemplateDir(); + + if(StrUtil.isBlank(config.getPackages())) { + config.setPackages(project.getGroupId()); + } + + String baseOutputDirPath = baseDir.getAbsolutePath() + "/target/code-generator/"; + String packagePath = StrUtil.replace(config.getPackages(), ".", "/"); + config.setOutputDir(baseOutputDirPath + packagePath); + + Set allProjectRuntimeClasspathElements = this.getAllProjectRuntimeClasspathElements(); + this.loadProjectClassToContextClassLoader(allProjectRuntimeClasspathElements); + + if(config.getDbInfo() == null) { + DbInfo dbInfo = DbInfoUtils.getDbInfo(config, allProjectRuntimeClasspathElements); + config.setDbInfo(dbInfo); + } + if(config.getDbInfo() == null) { + throw new RuntimeException("No datasource info was found! Please add database url, username, password configurations."); + } + + Scanner sc = new Scanner(System.in); + System.out.println("请输入数据库表名称(多个表名用逗号隔开),按 Enter 键继续:"); + String tableNames = sc.nextLine(); + while (StrUtil.isBlank(tableNames)) { + System.out.println("请输入数据库表名称(多个表名用逗号隔开),按 Enter 键继续:"); + tableNames = sc.nextLine(); + } + String[] tables = GeneratorUtils.trimItems(tableNames.split("[,,]")); + + System.out.println("请输入包模块名称(可以为空),按 Enter 键继续:"); + String moduleName = sc.nextLine(); + if(StrUtil.isNotBlank(moduleName)) { + config.setModuleName(StrUtil.trim(moduleName.toLowerCase())); + config.setPackages(config.getPackages() + "." + config.getModuleName()); + config.setOutputDir(config.getOutputDir() + "/" + config.getModuleName()); + } + + DynamicDriverDataSource dataSource = new DynamicDriverDataSource(config.getDbInfo().getUrl(), config.getDbInfo().getUsername(), config.getDbInfo().getPassword()); + DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder(dataSource).build(); + + StrategyConfig.Builder strategyConfigBuilder = GeneratorBuilder.strategyConfigBuilder(); + if(ArrayUtil.isNotEmpty(config.getTablePrefix())) { + strategyConfigBuilder.addTablePrefix(config.getTablePrefix()); + } + StrategyConfig strategyConfig = strategyConfigBuilder.addInclude(tables).build(); + + // ConfigBuilder 类不能扩展,会报错。 + ConfigBuilder configBuilder = new ConfigBuilder(null, dataSourceConfig, strategyConfig, null, null, null); + List tableInfoList = configBuilder.getTableInfoList(); + + System.out.println("----------------------------------------------------------------------------------------"); + System.out.println("主要输出配置信息:"); + System.out.println("数据库表:" + String.join(",", tables)); + System.out.println("数据库表前缀配置:" + (config.getTablePrefix() == null ? "" : String.join(",", config.getTablePrefix()))); + System.out.println("模板文件夹:" + config.getTemplateDir()); + System.out.println("包路径:" + config.getPackages()); + System.out.println("作者:" + config.getAuthor()); + System.out.println("实体父类:" + config.getBaseEntity()); + System.out.println("输出位置:" + config.getOutputDir()); + System.out.println("----------------------------------------------------------------------------------------"); + + log.info("---------------------------------- 清理输出目录!----------------------------------"); + FileUtil.del(baseOutputDirPath); + log.info("---------------------------------- 开始生成代码!----------------------------------"); + this.getTemplateEngine().init(config, tableInfoList).write(); + log.info("---------------------------------- 代码生成成功!----------------------------------"); + log.info("代码输出位置:{}", config.getOutputDir()); + log.info("---------------------------------- 代码生成完成!----------------------------------"); + } catch (Exception e) { + getLog().error(e); + throw new RuntimeException(e); + } + } + + private Set getAllProjectRuntimeClasspathElements() { + try { + List allProjects = session.getAllProjects(); + Set runtimeElements = new HashSet<>(); + for (MavenProject project : allProjects) { + runtimeElements.addAll(project.getRuntimeClasspathElements()); + } + return runtimeElements; + } catch (Exception e) { + getLog().error(e.getMessage()); + throw new RuntimeException(e); + } + } + + private void loadProjectClassToContextClassLoader(Set allProjectRuntimeClasspathElements) { + try { + List urlList = new ArrayList<>(); + for (String element : allProjectRuntimeClasspathElements) { + urlList.add(new File(element).toURI().toURL()); + } + JarClassLoader jarClassLoader = new JarClassLoader(urlList.toArray(new URL[0])); + Thread.currentThread().setContextClassLoader(jarClassLoader); + } catch (Exception e) { + getLog().error(e.getMessage()); + throw new RuntimeException(e); + } + } + +} diff --git a/src/main/java/com/github/mengweijin/code/generator/mojo/CodeMojo.java b/src/main/java/com/github/mengweijin/code/generator/mojo/CodeMojo.java new file mode 100644 index 0000000000000000000000000000000000000000..1e1ba8929263b035091569930009ab22438c55c5 --- /dev/null +++ b/src/main/java/com/github/mengweijin/code/generator/mojo/CodeMojo.java @@ -0,0 +1,24 @@ +package com.github.mengweijin.code.generator.mojo; + +import org.apache.maven.plugins.annotations.Execute; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.ResolutionScope; + +/** + * 说明:@Execute(phase = LifecyclePhase.COMPILE) 在运行该目标前,让maven先运行一个并行的生命周期,到指定的阶段为止。到phase执行完,才执行插件目标 + * ResolutionScope.COMPILE_PLUS_RUNTIME: + * Will add the classpath jars into list when call method project.getRuntimeClasspathElements(); + * maven scope=compile + system + provided + runtime dependencies + * + * @author mengweijin + */ +@Execute(phase = LifecyclePhase.COMPILE) +@Mojo( + name = "code", + aggregator = true, + requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME +) +public class CodeMojo extends AbstractFileSystemGeneratorMojo { + +} diff --git a/src/main/java/com/github/mengweijin/generator/mojo/MybatisGeneratorMojo.java b/src/main/java/com/github/mengweijin/code/generator/mojo/MybatisMojo.java similarity index 35% rename from src/main/java/com/github/mengweijin/generator/mojo/MybatisGeneratorMojo.java rename to src/main/java/com/github/mengweijin/code/generator/mojo/MybatisMojo.java index 1749597b6ef4f5a37a8155857f28fe39de157a5b..64f74dc3111880efd383dca4fcf283b481e369e5 100644 --- a/src/main/java/com/github/mengweijin/generator/mojo/MybatisGeneratorMojo.java +++ b/src/main/java/com/github/mengweijin/code/generator/mojo/MybatisMojo.java @@ -1,25 +1,28 @@ -package com.github.mengweijin.generator.mojo; +package com.github.mengweijin.code.generator.mojo; -import com.github.mengweijin.generator.entity.Parameters; -import com.github.mengweijin.generator.entity.ProjectInfo; -import com.github.mengweijin.generator.enums.Template; -import com.github.mengweijin.generator.enums.TemplateType; +import org.apache.maven.plugins.annotations.Execute; +import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.ResolutionScope; /** + * 说明:@Execute(phase = LifecyclePhase.COMPILE) 在运行该目标前,让maven先运行一个并行的生命周期,到指定的阶段为止。到phase执行完,才执行插件目标 * ResolutionScope.COMPILE_PLUS_RUNTIME: * Will add the classpath jars into list when call method project.getRuntimeClasspathElements(); * maven scope=compile + system + provided + runtime dependencies * * @author mengweijin */ -@Mojo(name = "MyBatis", requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME) -public class MybatisGeneratorMojo extends AbstractGeneratorMojo { +@Execute(phase = LifecyclePhase.COMPILE) +@Mojo( + name = "mybatis", + aggregator = true, + requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME +) +public class MybatisMojo extends AbstractClasspathGeneratorMojo { @Override - protected void setDefaultFixedParameters(Parameters parameters) { - parameters.setTemplateLocation(ProjectInfo.TMP_DIR + Template.MYBATIS.getPath()); - parameters.setTemplateType(TemplateType.beetl); + protected String getTemplateDir() { + return "templates/mybatis"; } } diff --git a/src/main/java/com/github/mengweijin/code/generator/mojo/MybatisPlusMojo.java b/src/main/java/com/github/mengweijin/code/generator/mojo/MybatisPlusMojo.java new file mode 100644 index 0000000000000000000000000000000000000000..c734eec84cd049375d74c4ad66ea439c0c43d998 --- /dev/null +++ b/src/main/java/com/github/mengweijin/code/generator/mojo/MybatisPlusMojo.java @@ -0,0 +1,28 @@ +package com.github.mengweijin.code.generator.mojo; + +import org.apache.maven.plugins.annotations.Execute; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.ResolutionScope; + +/** + * 说明:@Execute(phase = LifecyclePhase.COMPILE) 在运行该目标前,让maven先运行一个并行的生命周期,到指定的阶段为止。到phase执行完,才执行插件目标 + * ResolutionScope.COMPILE_PLUS_RUNTIME: + * Will add the classpath jars into list when call method project.getRuntimeClasspathElements(); + * maven scope=compile + system + provided + runtime dependencies + * + * @author mengweijin + */ +@Execute(phase = LifecyclePhase.COMPILE) +@Mojo( + name = "mybatis-plus", + aggregator = true, + requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME +) +public class MybatisPlusMojo extends AbstractClasspathGeneratorMojo { + + @Override + protected String getTemplateDir() { + return "templates/mybatis-plus"; + } +} diff --git a/src/main/java/com/github/mengweijin/code/generator/mojo/ScriptMojo.java b/src/main/java/com/github/mengweijin/code/generator/mojo/ScriptMojo.java new file mode 100644 index 0000000000000000000000000000000000000000..890057f9a7572f25de14ff757d91f2ac323be392 --- /dev/null +++ b/src/main/java/com/github/mengweijin/code/generator/mojo/ScriptMojo.java @@ -0,0 +1,70 @@ +package com.github.mengweijin.code.generator.mojo; + +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.plugins.annotations.ResolutionScope; +import org.dromara.hutool.core.io.file.FileUtil; +import org.dromara.hutool.core.io.resource.ClassPathResource; +import org.dromara.hutool.core.io.resource.JarResource; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Enumeration; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +/** + * 说明:@Execute(phase = LifecyclePhase.COMPILE) 在运行该目标前,让maven先运行一个并行的生命周期,到指定的阶段为止。到phase执行完,才执行插件目标 + * ResolutionScope.COMPILE_PLUS_RUNTIME: + * Will add the classpath jars into list when call method project.getRuntimeClasspathElements(); + * maven scope=compile + system + provided + runtime dependencies + * + * @author mengweijin + */ +@Mojo( + name = "script", + aggregator = true, + requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME +) +public class ScriptMojo extends AbstractMojo { + + @Parameter(defaultValue = "${basedir}") + private File baseDir; + + private static final String SCRIPT_DIR = "script/"; + + @Override + public void execute() throws MojoExecutionException, MojoFailureException { + String baseOutputDirPath = baseDir.getAbsolutePath() + "/target/code-generator/"; + FileUtil.del(baseOutputDirPath); + + try { + this.outputScripts(baseOutputDirPath); + } catch (IOException e) { + getLog().error(e); + throw new RuntimeException(e); + } + } + + private void outputScripts(String baseOutputDirPath) throws IOException { + ClassPathResource classPathResource = new ClassPathResource(SCRIPT_DIR); + JarResource jarResource = new JarResource(classPathResource.getUrl()); + JarFile jarFile = jarResource.getJarFile(); + Enumeration enumeration = jarFile.entries(); + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + while (enumeration.hasMoreElements()) { + JarEntry jarEntry = enumeration.nextElement(); + String jarEntryName = jarEntry.getName(); + if(!jarEntry.isDirectory() && jarEntryName.startsWith(SCRIPT_DIR)) { + InputStream inputStream = classLoader.getResource(jarEntryName).openConnection().getInputStream(); + File fileTargetDir = FileUtil.file(baseOutputDirPath + jarEntryName); + FileUtil.mkParentDirs(fileTargetDir); + FileUtil.copy(inputStream, fileTargetDir); + } + } + } +} diff --git a/src/main/java/com/github/mengweijin/generator/reader/BootFileReader.java b/src/main/java/com/github/mengweijin/code/generator/reader/BootFileReader.java similarity index 83% rename from src/main/java/com/github/mengweijin/generator/reader/BootFileReader.java rename to src/main/java/com/github/mengweijin/code/generator/reader/BootFileReader.java index 66b057cbdf43f26baaa936eb19f4e5155d5b4cc0..adaddeabc1116244a119ee94b16049662d766b34 100644 --- a/src/main/java/com/github/mengweijin/generator/reader/BootFileReader.java +++ b/src/main/java/com/github/mengweijin/code/generator/reader/BootFileReader.java @@ -1,6 +1,6 @@ -package com.github.mengweijin.generator.reader; +package com.github.mengweijin.code.generator.reader; -import com.github.mengweijin.generator.entity.DbInfo; +import com.github.mengweijin.code.generator.dto.DbInfo; import java.io.File; @@ -22,7 +22,7 @@ public interface BootFileReader { * @param file file * @return active profiles env */ - String getActiveProfilesEnv(File file); + String[] getActiveProfiles(File file); /** * get db info diff --git a/src/main/java/com/github/mengweijin/generator/reader/BootFileReaderFactory.java b/src/main/java/com/github/mengweijin/code/generator/reader/BootFileReaderFactory.java similarity index 70% rename from src/main/java/com/github/mengweijin/generator/reader/BootFileReaderFactory.java rename to src/main/java/com/github/mengweijin/code/generator/reader/BootFileReaderFactory.java index 63b20f3ece44e8e2fc0647660f96af581a4b244c..53350c185a41ab406a63d9c9bf48892a112b41ce 100644 --- a/src/main/java/com/github/mengweijin/generator/reader/BootFileReaderFactory.java +++ b/src/main/java/com/github/mengweijin/code/generator/reader/BootFileReaderFactory.java @@ -1,9 +1,9 @@ -package com.github.mengweijin.generator.reader; - -import cn.hutool.core.io.file.FileNameUtil; -import cn.hutool.core.util.EnumUtil; -import com.github.mengweijin.generator.entity.DbInfo; +package com.github.mengweijin.code.generator.reader; +import com.github.mengweijin.code.generator.dto.DbInfo; +import lombok.extern.slf4j.Slf4j; +import org.dromara.hutool.core.io.file.FileNameUtil; +import org.dromara.hutool.core.util.EnumUtil; import java.io.File; import java.util.HashMap; import java.util.Map; @@ -11,6 +11,7 @@ import java.util.Map; /** * @author mengweijin */ +@Slf4j public class BootFileReaderFactory { private static final Map map = new HashMap<>(); @@ -21,8 +22,8 @@ public class BootFileReaderFactory { map.put(BootFileType.properties, PropertiesBootFileReader.class); } - public static String getActiveProfilesEnv(File file) { - return getBootFileReader(file).getActiveProfilesEnv(file); + public static String[] getActiveProfiles(File file) { + return getBootFileReader(file).getActiveProfiles(file); } public static DbInfo getDbInfo(File file) { @@ -36,7 +37,7 @@ public class BootFileReaderFactory { Class cls = map.get(bootFileType); return (BootFileReader) cls.newInstance(); } catch (IllegalAccessException | InstantiationException e) { - e.printStackTrace(); + log.error(e.getMessage(), e); throw new RuntimeException(e); } } diff --git a/src/main/java/com/github/mengweijin/generator/reader/BootFileType.java b/src/main/java/com/github/mengweijin/code/generator/reader/BootFileType.java similarity index 64% rename from src/main/java/com/github/mengweijin/generator/reader/BootFileType.java rename to src/main/java/com/github/mengweijin/code/generator/reader/BootFileType.java index 0e33af57375b6d9961f9a9e77985e4e73e3a4697..1bcbc136008947d75e8fe15d0f81d94336702526 100644 --- a/src/main/java/com/github/mengweijin/generator/reader/BootFileType.java +++ b/src/main/java/com/github/mengweijin/code/generator/reader/BootFileType.java @@ -1,4 +1,4 @@ -package com.github.mengweijin.generator.reader; +package com.github.mengweijin.code.generator.reader; /** * @author mengweijin diff --git a/src/main/java/com/github/mengweijin/code/generator/reader/PropertiesBootFileReader.java b/src/main/java/com/github/mengweijin/code/generator/reader/PropertiesBootFileReader.java new file mode 100644 index 0000000000000000000000000000000000000000..7063f1cf4ca4e1960cbaf6a56d840c14c45faae1 --- /dev/null +++ b/src/main/java/com/github/mengweijin/code/generator/reader/PropertiesBootFileReader.java @@ -0,0 +1,37 @@ +package com.github.mengweijin.code.generator.reader; + +import com.github.mengweijin.code.generator.dto.DbInfo; +import org.dromara.hutool.core.text.StrUtil; +import org.dromara.hutool.setting.props.Props; + +import java.io.File; +import java.nio.charset.StandardCharsets; + +public class PropertiesBootFileReader implements BootFileReader { + + @Override + public String[] getActiveProfiles(File file) { + Props props = new Props(file, StandardCharsets.UTF_8); + String activeProfiles = props.getStr(SPRING_PROFILES_ACTIVE); + activeProfiles = StrUtil.cleanBlank(activeProfiles); + if(StrUtil.isBlank(activeProfiles)) { + return null; + } + return activeProfiles.split(","); + } + + @Override + public DbInfo getDbInfo(File file) { + Props props = new Props(file, StandardCharsets.UTF_8); + String url = props.getStr(SPRING_DATASOURCE_URL); + if(StrUtil.isBlank(url)) { + return null; + } + + DbInfo dbInfo = new DbInfo(); + dbInfo.setUrl(url); + dbInfo.setUsername(props.getStr(SPRING_DATASOURCE_USERNAME)); + dbInfo.setPassword(props.getStr(SPRING_DATASOURCE_PASSWORD)); + return dbInfo; + } +} diff --git a/src/main/java/com/github/mengweijin/generator/reader/YamlBootFileReader.java b/src/main/java/com/github/mengweijin/code/generator/reader/YamlBootFileReader.java similarity index 47% rename from src/main/java/com/github/mengweijin/generator/reader/YamlBootFileReader.java rename to src/main/java/com/github/mengweijin/code/generator/reader/YamlBootFileReader.java index 99e3cf2893ee11f98c48b2cb7625b3789c716d5d..58a4f52dc90d386f0d87aeb6f56d73baf0de2050 100644 --- a/src/main/java/com/github/mengweijin/generator/reader/YamlBootFileReader.java +++ b/src/main/java/com/github/mengweijin/code/generator/reader/YamlBootFileReader.java @@ -1,8 +1,9 @@ -package com.github.mengweijin.generator.reader; +package com.github.mengweijin.code.generator.reader; -import com.alibaba.fastjson.JSONPath; -import com.github.mengweijin.generator.entity.DbInfo; -import com.github.mengweijin.generator.util.YamlUtils; +import com.alibaba.fastjson2.JSONPath; +import com.github.mengweijin.code.generator.dto.DbInfo; +import com.github.mengweijin.code.generator.util.YamlUtils; +import org.dromara.hutool.core.text.StrUtil; import java.io.File; import java.util.LinkedHashMap; @@ -12,10 +13,14 @@ import java.util.LinkedHashMap; */ public class YamlBootFileReader implements BootFileReader { @Override - public String getActiveProfilesEnv(File file) { + public String[] getActiveProfiles(File file) { LinkedHashMap map = YamlUtils.loadAs(file, LinkedHashMap.class); - Object object = JSONPath.eval(map, "$." + SPRING_PROFILES_ACTIVE); - return object == null ? null : String.valueOf(object); + Object object = JSONPath.eval(map, "$.spring.profiles.active"); + String activeProfiles = StrUtil.cleanBlank(StrUtil.toStringOrNull(object)); + if(StrUtil.isBlank(activeProfiles)) { + return null; + } + return activeProfiles.split(","); } @Override @@ -26,16 +31,11 @@ public class YamlBootFileReader implements BootFileReader { return null; } - DbInfo dbInfo = new DbInfo(); - Object url = JSONPath.eval(map, "$." + SPRING_DATASOURCE_URL); - Object driverName = JSONPath.eval(map, "$." + SPRING_DATASOURCE_DRIVERCLASSNAME); - if (driverName == null) { - // JSONPath中,中划线是特殊字符 - driverName = JSONPath.eval(map, "$.spring.datasource['driver-class-name']"); - } - Object username = JSONPath.eval(map, "$." + SPRING_DATASOURCE_USERNAME); - Object password = JSONPath.eval(map, "$." + SPRING_DATASOURCE_PASSWORD); + Object url = JSONPath.eval(map, "$.spring.datasource.url"); + Object username = JSONPath.eval(map, "$.spring.datasource.username"); + Object password = JSONPath.eval(map, "$.spring.datasource.password"); + DbInfo dbInfo = new DbInfo(); dbInfo.setUrl(url == null ? null : String.valueOf(url)); dbInfo.setUsername(username == null ? null : String.valueOf(username)); dbInfo.setPassword(password == null ? null : String.valueOf(password)); diff --git a/src/main/java/com/github/mengweijin/generator/util/DbInfoUtils.java b/src/main/java/com/github/mengweijin/code/generator/util/DbInfoUtils.java similarity index 34% rename from src/main/java/com/github/mengweijin/generator/util/DbInfoUtils.java rename to src/main/java/com/github/mengweijin/code/generator/util/DbInfoUtils.java index 90e515a3cb8185ee419438ce5896f7d977d9abfe..06f099be13dd29e7dcda0224dc2b676581b0a56c 100644 --- a/src/main/java/com/github/mengweijin/generator/util/DbInfoUtils.java +++ b/src/main/java/com/github/mengweijin/code/generator/util/DbInfoUtils.java @@ -1,16 +1,18 @@ -package com.github.mengweijin.generator.util; +package com.github.mengweijin.code.generator.util; + +import com.alibaba.fastjson2.JSON; +import com.github.mengweijin.code.generator.dto.Config; +import com.github.mengweijin.code.generator.dto.DbInfo; +import com.github.mengweijin.code.generator.reader.BootFileReaderFactory; +import org.dromara.hutool.core.collection.CollUtil; +import org.dromara.hutool.core.io.file.FileNameUtil; +import org.dromara.hutool.core.io.file.FileUtil; +import org.dromara.hutool.core.text.StrUtil; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.io.file.FileNameUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; -import com.github.mengweijin.generator.entity.DbInfo; -import com.github.mengweijin.generator.entity.ProjectInfo; -import com.github.mengweijin.generator.reader.BootFileReaderFactory; -import org.apache.maven.model.Resource; import java.io.File; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** * @author mengweijin @@ -37,50 +39,54 @@ public class DbInfoUtils { /** * Initialize the default parameter. */ - public static DbInfo getDbInfo(ProjectInfo projectInfo) { - DbInfo dbInfo = projectInfo.getParameters().getDbInfo(); + public static DbInfo getDbInfo(Config config, Set allProjectRuntimeClasspathElements) { + DbInfo dbInfo = config.getDbInfo(); if (dbInfo == null || StrUtil.isBlank(dbInfo.getUrl())) { - dbInfo = generateDefaultDbInfo(projectInfo); + dbInfo = generateDefaultDbInfo(allProjectRuntimeClasspathElements); } return dbInfo; } - private static DbInfo generateDefaultDbInfo(ProjectInfo projectInfo) { - List resourceList = projectInfo.getResourceList(); - Resource resource = resourceList.stream().filter(res -> res.getDirectory().endsWith("\\resources")).findFirst().get(); - - File applicationFile = getBootFile(resource, APPLICATION_FILE); + private static DbInfo generateDefaultDbInfo(Set allProjectRuntimeClasspathElements) { + List classesList = allProjectRuntimeClasspathElements.stream().filter(el -> el.endsWith("\\classes")).collect(Collectors.toList()); + // classes: D:\code\vitality\vitality-admin\target\classes + File applicationFile = null; + for (String classes : classesList) { + applicationFile = getBootFile(classes); + if(applicationFile != null) { + break; + } + } if (applicationFile == null) { - throw new RuntimeException("Can't find any file " + JSON.toJSONString(APPLICATION_FILE)); + throw new RuntimeException("Can't find any file " + JSON.toJSONString(APPLICATION_FILE)); } - String activeProfilesEnv = BootFileReaderFactory.getActiveProfilesEnv(applicationFile); + String[] activeProfilesEnv = BootFileReaderFactory.getActiveProfiles(applicationFile); DbInfo dbInfo = null; - if(StrUtil.isNotBlank(activeProfilesEnv)) { - String activeBootFilePath = resource.getDirectory() + File.separator + - "application-" + activeProfilesEnv + StrUtil.DOT + FileNameUtil.getSuffix(applicationFile); - File activeBootFile = FileUtil.file(activeBootFilePath); - dbInfo = BootFileReaderFactory.getDbInfo(activeBootFile); + if(activeProfilesEnv != null) { + for (String env : activeProfilesEnv) { + String activeBootFilePath = applicationFile.getParent() + File.separator + "application-" + env + StrUtil.DOT + FileNameUtil.getSuffix(applicationFile); + dbInfo = BootFileReaderFactory.getDbInfo(FileUtil.file(activeBootFilePath)); + if(dbInfo != null) { + break; + } + } } - if(dbInfo == null) { - dbInfo = BootFileReaderFactory.getDbInfo(applicationFile); + dbInfo = BootFileReaderFactory.getDbInfo(applicationFile); } - return dbInfo; } - private static File getBootFile(Resource resource, String[] filterNames) { - File resourcesDir = FileUtil.file(resource.getDirectory()); - List fileList = FileUtil.loopFiles(resourcesDir, 1, file -> { - for (String fileName : filterNames) { + private static File getBootFile(String resources) { + List fileList = FileUtil.loopFiles(FileUtil.file(resources), 1, file -> { + for (String fileName : DbInfoUtils.APPLICATION_FILE) { if (fileName.equals(file.getName())) { return true; } } return false; }); - - return CollectionUtil.isEmpty(fileList) ? null : fileList.get(0); + return CollUtil.isEmpty(fileList) ? null : fileList.get(0); } } diff --git a/src/main/java/com/github/mengweijin/code/generator/util/GeneratorUtils.java b/src/main/java/com/github/mengweijin/code/generator/util/GeneratorUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..7094f3e85ba9c7eea7f5c264d7c70ba3c66509de --- /dev/null +++ b/src/main/java/com/github/mengweijin/code/generator/util/GeneratorUtils.java @@ -0,0 +1,99 @@ +package com.github.mengweijin.code.generator.util; + +import com.baomidou.mybatisplus.generator.config.po.TableField; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import com.github.mengweijin.code.generator.dto.Config; +import lombok.extern.slf4j.Slf4j; +import org.dromara.hutool.core.reflect.FieldUtil; +import org.dromara.hutool.core.text.StrUtil; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +/** + * @author mengweijin + */ +@Slf4j +public class GeneratorUtils { + + /** + * If the user configured superEntityColumns, the configuration will prevail; + * if not, the default configuration of superEntityColumns will be generated according to the superEntityClass. + * + * @return String + */ + public static List resolveBaseEntityColumns(Config config) { + String baseEntity = config.getBaseEntity(); + if(StrUtil.isBlank(baseEntity)) { + return new ArrayList<>(); + } + try { + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + Class cls = Class.forName(baseEntity, true, classLoader); + Field[] declaredFields = FieldUtil.getFieldsDirectly(cls, true); + return Arrays.stream(declaredFields).map(field -> StrUtil.toUnderlineCase(field.getName()).toUpperCase()).collect(Collectors.toList()); + } catch (ClassNotFoundException e) { + log.error(e.getMessage(), e); + throw new RuntimeException(e); + } + } + + public static String[] trimItems(String[] items) { + if (items == null) { + return new String[]{}; + } + return Arrays.stream(items).map(String::trim).toArray(String[]::new); + } + + public static String resolveEntityName(String tableName, Config config) { + String val = tableName; + if (config.getTablePrefix() != null) { + for (String tablePrefix : config.getTablePrefix()) { + if(tableName.toLowerCase().startsWith(tablePrefix.toLowerCase())) { + val = tableName.substring(tablePrefix.length()); + break; + } + } + } + return StrUtil.upperFirst(StrUtil.toCamelCase(val.toLowerCase())); + } + + public static List resolveCommonColumns(List commonFields) { + return commonFields.stream().map(tableField -> tableField.getColumnName().toUpperCase()).collect(Collectors.toList()); + } + + public static List resolveEntityColumns(List entityFields) { + return entityFields.stream().map(tableField -> tableField.getColumnName().toUpperCase()).collect(Collectors.toList()); + } + + public static List resolveCommonFields(TableInfo tableInfo, List baseEntityColumns) { + return tableInfo.getFields().stream().filter(tableField -> baseEntityColumns.contains(tableField.getColumnName().toUpperCase())).collect(Collectors.toList()); + } + + public static List resolveEntityFields(TableInfo tableInfo, List baseEntityColumns) { + return tableInfo.getFields().stream().filter(tableField -> !baseEntityColumns.contains(tableField.getColumnName().toUpperCase())).collect(Collectors.toList()); + } + + public static TableField getIdField(TableInfo tableInfo) { + return tableInfo.getFields().stream().filter(TableField::isKeyFlag).findFirst().orElse(null); + } + + public static String renderString(String content, Map map){ + Set> sets = map.entrySet(); + for(Map.Entry entry : sets) { + String regex = "\\$\\{" + entry.getKey() + "}"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(content); + content = matcher.replaceAll(StrUtil.toString(entry.getValue())); + } + return content; + } + +} diff --git a/src/main/java/com/github/mengweijin/generator/util/YamlUtils.java b/src/main/java/com/github/mengweijin/code/generator/util/YamlUtils.java similarity index 67% rename from src/main/java/com/github/mengweijin/generator/util/YamlUtils.java rename to src/main/java/com/github/mengweijin/code/generator/util/YamlUtils.java index d53827aa70bb7913fd372e4ff2b84bac8da424a5..6792c5b39e7d2c5bd6f06001ebb17d50b972373a 100644 --- a/src/main/java/com/github/mengweijin/generator/util/YamlUtils.java +++ b/src/main/java/com/github/mengweijin/code/generator/util/YamlUtils.java @@ -1,9 +1,8 @@ -package com.github.mengweijin.generator.util; +package com.github.mengweijin.code.generator.util; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.util.ReUtil; -import cn.hutool.core.util.StrUtil; -import com.github.mengweijin.generator.entity.ProjectInfo; +import org.dromara.hutool.core.io.file.FileUtil; +import org.dromara.hutool.core.regex.ReUtil; +import org.dromara.hutool.core.text.StrUtil; import org.yaml.snakeyaml.Yaml; import java.io.File; @@ -30,11 +29,9 @@ public class YamlUtils { } return line; }).collect(Collectors.toList()); - File tempFile = FileUtil.file(ProjectInfo.TMP_DIR + file.getName()); - FileUtil.writeLines(lineCollect, tempFile, StandardCharsets.UTF_8); - + String joined = String.join("\r\n", lineCollect); Yaml yaml = new Yaml(); - return yaml.loadAs(FileUtil.getInputStream(tempFile), type); + return yaml.loadAs(joined, type); } } diff --git a/src/main/java/com/github/mengweijin/generator/DefaultAutoGenerator.java b/src/main/java/com/github/mengweijin/generator/DefaultAutoGenerator.java deleted file mode 100644 index fbad12e408b89c311b00f3e37e02f65475f7a94e..0000000000000000000000000000000000000000 --- a/src/main/java/com/github/mengweijin/generator/DefaultAutoGenerator.java +++ /dev/null @@ -1,188 +0,0 @@ -package com.github.mengweijin.generator; - -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.util.ClassUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.generator.FastAutoGenerator; -import com.baomidou.mybatisplus.generator.config.DataSourceConfig; -import com.baomidou.mybatisplus.generator.config.TemplateConfig; -import com.baomidou.mybatisplus.generator.config.po.TableField; -import com.baomidou.mybatisplus.generator.config.po.TableInfo; -import com.baomidou.mybatisplus.generator.config.rules.DateType; -import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; -import com.github.mengweijin.generator.config.CustomerDataSource; -import com.github.mengweijin.generator.config.FileOutput; -import com.github.mengweijin.generator.entity.DbInfo; -import com.github.mengweijin.generator.entity.IdField; -import com.github.mengweijin.generator.entity.Parameters; -import com.github.mengweijin.generator.entity.ProjectInfo; -import com.github.mengweijin.generator.factory.TemplateEngineFactory; -import com.github.mengweijin.generator.util.DbInfoUtils; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; - -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.function.Consumer; - -/** - * @author mengweijin - */ -@Slf4j -public class DefaultAutoGenerator { - - @Getter - private ProjectInfo projectInfo; - - public DefaultAutoGenerator(ProjectInfo projectInfo) { - this.projectInfo = projectInfo; - } - - public void execute() { - Parameters parameters = projectInfo.getParameters(); - - String outputDir = FileUtil.file(projectInfo.getBaseDir(), "target/code-generator/").getAbsolutePath(); - // clean directory target/code-generator - FileUtil.del(outputDir); - - FastAutoGenerator fastAutoGenerator = FastAutoGenerator.create(dataSourceConfigBuilder()) - .globalConfig(builder -> builder - .fileOverride() - .author(parameters.getAuthor()) - .enableSwagger() - .disableOpenDir() - .outputDir(outputDir) - .dateType(DateType.TIME_PACK).commentDate("yyyy-MM-dd")) - .packageConfig(builder -> builder.parent(parameters.getOutputPackage())) - // 禁用所有默认模板,我们需要使用自定义的模板 - .templateConfig((Consumer) TemplateConfig.Builder::disable) - .strategyConfig(builder -> builder - .addInclude(this.trimItemName(parameters.getTables())) - .addTablePrefix(this.trimItemName(parameters.getTablePrefix())) - .entityBuilder() - .superClass(parameters.getSuperEntityClass()) - //.disableSerialVersionUID() - .enableChainModel() - .enableLombok() - .enableTableFieldAnnotation() - // 乐观锁数据库列名 - .versionColumnName("version") - // 乐观锁 Entity 属性名 - .versionPropertyName("version") - // 逻辑删除数据库列名 - .logicDeleteColumnName("deleted") - // 逻辑删除 Entity 属性名 - .logicDeletePropertyName("deleted") - // 数据库表映射到实体的命名策略 - .naming(NamingStrategy.underline_to_camel) - .addSuperEntityColumns(this.generateDefaultSuperEntityColumns()) - - .controllerBuilder() - .superClass(parameters.getSuperControllerClass()) - // 开启驼峰转连字符 - .enableHyphenStyle() - // 开启生成@RestController控制器 - .enableRestStyle() - - .serviceBuilder() - .superServiceClass(parameters.getSuperServiceClass()) - .superServiceImplClass(parameters.getSuperServiceImplClass()) - - .mapperBuilder() - .superClass(parameters.getSuperDaoClass()) - .enableBaseColumnList() - .enableBaseResultMap()) - .injectionConfig(builder -> { - builder - .beforeOutputFile(((tableInfo, objectMap) -> { - enhanceObjectMap(objectMap, parameters); - FileOutput.outputFile(tableInfo, objectMap, projectInfo, outputDir); - })) - //.customMap(Collections.singletonMap("test", "baomidou")) - //.customFile(Collections.singletonMap("test.txt", "/templates/test.vm")) - ; - }) - .templateEngine(TemplateEngineFactory.getTemplateEngine(this.projectInfo.getParameters().getTemplateType())); - - - fastAutoGenerator.execute(); - } - - private DataSourceConfig.Builder dataSourceConfigBuilder() { - DbInfo dbInfo = DbInfoUtils.getDbInfo(projectInfo); - // 自定义 CustomerDataSource, 使用自定义的 ClassLoader 加载类获取连接。 - CustomerDataSource dataSource = new CustomerDataSource(dbInfo.getUrl(), dbInfo.getUsername(), dbInfo.getPassword()); - return new DataSourceConfig.Builder(dataSource); - } - - /** - * If the user configured superEntityColumns, the configuration will prevail; - * if not, the default configuration of superEntityColumns will be generated according to the superEntityClass. - * - * @return String[] - */ - private String[] generateDefaultSuperEntityColumns() { - String superEntityClass = projectInfo.getParameters().getSuperEntityClass(); - if(StrUtil.isBlank(superEntityClass)) { - return new String[]{}; - } - try { - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - Class cls = Class.forName(superEntityClass, true, classLoader); - Field[] declaredFields = ClassUtil.getDeclaredFields(cls); - return Arrays.stream(declaredFields) - .map(field -> StrUtil.toUnderlineCase(field.getName())).toArray(String[]::new); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - - private String[] trimItemName(String[] items) { - if (items == null) { - return new String[]{}; - } - return Arrays.stream(items).map(String::trim).toArray(String[]::new); - } - - private static void enhanceObjectMap(Map objectMap, Parameters parameters) { - objectMap.remove("package"); - objectMap.put("parameters", parameters); - objectMap.put("idField", getIdField((TableInfo) objectMap.get("table"))); - objectMap.put("allFieldList", handleAllFieldList((TableInfo) objectMap.get("table"))); - objectMap.put("superEntityClassPackage", parameters.getSuperEntityClass()); - objectMap.put("hasLongField", hasLongField((TableInfo) objectMap.get("table"))); - - log.info("Beetl parameter map: {}", objectMap); - } - - private static boolean hasLongField(TableInfo tableInfo) { - return tableInfo.getFields().stream().anyMatch(item -> "Long".equalsIgnoreCase(item.getPropertyType())); - } - - private static IdField getIdField(TableInfo tableInfo) { - TableField tableField = tableInfo.getFields().stream().filter(TableField::isKeyFlag).findFirst().orElse(null); - - IdField idField = new IdField(); - if(tableField != null) { - idField.setColumnName(tableField.getName()); - idField.setPropertyName(tableField.getPropertyName()); - idField.setPropertyType(tableField.getColumnType().getType()); - } - return idField; - } - - private static List handleAllFieldList(TableInfo tableInfo) { - List fieldList = tableInfo.getFields(); - List commonFields = tableInfo.getCommonFields(); - - // 为了不影响其他地方的引用,这里必须创建一个新的集合来存放所有字段 - List allList = new ArrayList<>(); - allList.addAll(fieldList); - allList.addAll(commonFields); - return allList; - } -} diff --git a/src/main/java/com/github/mengweijin/generator/config/FileOutput.java b/src/main/java/com/github/mengweijin/generator/config/FileOutput.java deleted file mode 100644 index 33188929fc54fcb8defbd80ce744f3980b320229..0000000000000000000000000000000000000000 --- a/src/main/java/com/github/mengweijin/generator/config/FileOutput.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.github.mengweijin.generator.config; - -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.generator.config.po.TableInfo; -import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; -import com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine; -import com.github.mengweijin.generator.entity.Parameters; -import com.github.mengweijin.generator.entity.ProjectInfo; -import com.github.mengweijin.generator.factory.TemplateEngineFactory; -import lombok.extern.slf4j.Slf4j; -import java.io.File; -import java.util.List; -import java.util.Map; - -/** - * @author mengweijin - */ -@Slf4j -public class FileOutput { - - public static void outputFile(TableInfo tableInfo, Map objectMap, ProjectInfo projectInfo, String outputDir) { - Parameters parameters = projectInfo.getParameters(); - AbstractTemplateEngine templateEngine = TemplateEngineFactory.getTemplateEngine(parameters.getTemplateType()); - String outputPackage = parameters.getOutputPackage(); - - List templateFileList = FileUtil.loopFiles(parameters.getTemplateLocation(), - file -> file.isFile() && file.getName().toLowerCase().endsWith(parameters.getTemplateType().getSuffix())); - - if (CollectionUtil.isEmpty(templateFileList)) { - throw new RuntimeException("No template files found in location " + parameters.getTemplateLocation()); - } else { - String message = "Found " + templateFileList.size() + " template files in location " + parameters.getTemplateLocation(); - log.info(message); - } - - try { - for (File templateFile: templateFileList) { - // 初始化输出文件的名称和路径 - File outputFile = buildOutputFile(tableInfo, templateFile.getAbsolutePath(), outputDir, outputPackage); - FileUtil.mkParentDirs(outputFile); - // 使用模板引擎,渲染并输出文件 - templateEngine.writer(objectMap, templateFile.getAbsolutePath(), outputFile); - } - } catch (Exception e) { - log.error("Template engine writer error!", e); - throw new RuntimeException(e); - } - } - - /** - * - * @param tableInfo - * @param templatePath 绝对路径 - * @param outputDir - * @param outputPackage - * @return 全路径名文件 - */ - private static File buildOutputFile(TableInfo tableInfo, String templatePath, String outputDir, String outputPackage) { - StringBuilder outputPath = new StringBuilder(outputDir); - - if(!outputDir.endsWith(StrUtil.SLASH) && !outputDir.endsWith(StrUtil.BACKSLASH)) { - outputPath.append(File.separator); - } - if(!StrUtil.isBlank(outputPackage)) { - outputPath.append(outputPackage).append(File.separator); - } - - StringBuilder componentName = new StringBuilder(); - File templateFile = FileUtil.file(templatePath); - String[] packageHierarchy = templateFile.getName().split("\\."); - if ("entity".equalsIgnoreCase(packageHierarchy[0])) { - outputPath.append(packageHierarchy[0]).append(File.separator); - } else { - for (int i = 0; i < packageHierarchy.length - 2; i++) { - componentName.append(NamingStrategy.capitalFirst(packageHierarchy[i])); - outputPath.append(packageHierarchy[i].toLowerCase()).append(File.separator); - } - } - - outputPath.append(tableInfo.getEntityName()).append(componentName); - String path = StrUtil.replace(outputPath.toString(), StrUtil.DOT, StrUtil.SLASH); - return new File(path + StrUtil.DOT + packageHierarchy[packageHierarchy.length - 2]); - } - -} diff --git a/src/main/java/com/github/mengweijin/generator/engine/BeetlStringTemplateEngine.java b/src/main/java/com/github/mengweijin/generator/engine/BeetlStringTemplateEngine.java deleted file mode 100644 index 5b2575f553cb275e0455536829c76f7ce083a61b..0000000000000000000000000000000000000000 --- a/src/main/java/com/github/mengweijin/generator/engine/BeetlStringTemplateEngine.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.github.mengweijin.generator.engine; - -import cn.hutool.core.io.FileUtil; -import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder; -import com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine; -import lombok.extern.slf4j.Slf4j; -import org.beetl.core.Configuration; -import org.beetl.core.GroupTemplate; -import org.beetl.core.Template; -import org.beetl.core.resource.StringTemplateResourceLoader; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.Map; - -/** - * @author mengweijin - */ -@Slf4j -public class BeetlStringTemplateEngine extends AbstractTemplateEngine { - - private GroupTemplate groupTemplate; - - @Override - public AbstractTemplateEngine init(ConfigBuilder configBuilder) { - try { - Configuration cfg = new Configuration(ClassLoader.getSystemClassLoader()); - groupTemplate = new GroupTemplate(new StringTemplateResourceLoader(), cfg); - return this; - } catch (IOException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - - @Override - public void writer(Map objectMap, String templatePath, File outputFile) throws Exception { - // read template content from template path - String templateContent = FileUtil.readUtf8String(templatePath); - Template template = groupTemplate.getTemplate(templateContent); - try (FileOutputStream fileOutputStream = new FileOutputStream(outputFile)) { - template.binding(objectMap); - template.renderTo(fileOutputStream); - } catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - - log.info("模板:" + templatePath + "; 文件:" + outputFile); - } - - @Override - public String templateFilePath(String filePath) { - return filePath + ".btl"; - } -} diff --git a/src/main/java/com/github/mengweijin/generator/entity/Docker.java b/src/main/java/com/github/mengweijin/generator/entity/Docker.java deleted file mode 100644 index 6e8bb6ad9f43b14ee6f0ee4f93db033d3fea9766..0000000000000000000000000000000000000000 --- a/src/main/java/com/github/mengweijin/generator/entity/Docker.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.github.mengweijin.generator.entity; - -import lombok.Data; - -/** - * @author mengweijin - */ -@Data -public class Docker { - - private String name; - -} diff --git a/src/main/java/com/github/mengweijin/generator/entity/IdField.java b/src/main/java/com/github/mengweijin/generator/entity/IdField.java deleted file mode 100644 index 4135a80977ca56ef8d452aa2adfb0c1d1b072118..0000000000000000000000000000000000000000 --- a/src/main/java/com/github/mengweijin/generator/entity/IdField.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.github.mengweijin.generator.entity; - -import lombok.Data; - -/** - * @author mengweijin - */ -@Data -public class IdField { - - private String columnName = "id"; - - private String propertyName = "id"; - - private String propertyType = "Long"; -} diff --git a/src/main/java/com/github/mengweijin/generator/entity/Parameters.java b/src/main/java/com/github/mengweijin/generator/entity/Parameters.java deleted file mode 100644 index b3c35ced7494c3b6a924b114a28452f2890b1fe4..0000000000000000000000000000000000000000 --- a/src/main/java/com/github/mengweijin/generator/entity/Parameters.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.github.mengweijin.generator.entity; - -import cn.hutool.system.SystemUtil; -import com.github.mengweijin.generator.enums.TemplateType; -import lombok.Data; - -/** - * @author mengweijin - */ -@Data -public class Parameters { - - /** - * default: com.github.mengweijin - */ - private String outputPackage = "com.github.mengweijin"; - - private String author = SystemUtil.get("user.name", false); - - /** - * The absolute path to the folder. - */ - private String templateLocation; - - private TemplateType templateType = TemplateType.beetl; - - private DbInfo dbInfo; - - /** - * For example: SYS_USER, SYS_ROLE - * Note: Separated by commas. - */ - private String[] tables; - - /** - * For example: SYS_, FTL_ - * Note: Separated by commas. - */ - private String[] tablePrefix; - - private String superEntityClass; - private String superDaoClass; - private String superServiceClass; - private String superServiceImplClass; - private String superControllerClass; - - /** - * 【实体】是否为lombok模型(默认 true) - */ - private boolean lombokModel = true; -} diff --git a/src/main/java/com/github/mengweijin/generator/entity/ProjectInfo.java b/src/main/java/com/github/mengweijin/generator/entity/ProjectInfo.java deleted file mode 100644 index 1dee68668309493b4cc7b070bdf050f2e9a63e6d..0000000000000000000000000000000000000000 --- a/src/main/java/com/github/mengweijin/generator/entity/ProjectInfo.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.github.mengweijin.generator.entity; - -import cn.hutool.system.SystemUtil; -import lombok.Data; -import org.apache.maven.model.Resource; - -import java.io.File; -import java.util.List; - -/** - * @author mengweijin - */ -@Data -public class ProjectInfo { - - public static final String TMP_DIR = SystemUtil.get(SystemUtil.TMPDIR) + "code-generator/"; - - private Parameters parameters; - - private List resourceList; - - private File baseDir; - - private File sourceDir; - - -} diff --git a/src/main/java/com/github/mengweijin/generator/enums/Template.java b/src/main/java/com/github/mengweijin/generator/enums/Template.java deleted file mode 100644 index b5f5798bf912243f9634a21e53a2952bbb6d0ca8..0000000000000000000000000000000000000000 --- a/src/main/java/com/github/mengweijin/generator/enums/Template.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.github.mengweijin.generator.enums; - -/** - * @author mengweijin - */ - -public enum Template { - - JPA("templates/jpa/"), - MYBATIS("templates/mybatis/"), - MYBATIS_PLUS("templates/mybatis-plus/"); - - private final String path; - - Template(String path) { - this.path = path; - } - - public String getPath() { - return this.path; - } -} diff --git a/src/main/java/com/github/mengweijin/generator/factory/TemplateEngineFactory.java b/src/main/java/com/github/mengweijin/generator/factory/TemplateEngineFactory.java deleted file mode 100644 index 3a97824abf1a58953cd6a4c121bf3f7d99dc10d8..0000000000000000000000000000000000000000 --- a/src/main/java/com/github/mengweijin/generator/factory/TemplateEngineFactory.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.github.mengweijin.generator.factory; - -import com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine; -import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; -import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine; -import com.github.mengweijin.generator.engine.BeetlStringTemplateEngine; -import com.github.mengweijin.generator.enums.TemplateType; - -import java.util.HashMap; - -/** - * @author mengweijin - */ -public class TemplateEngineFactory { - - public static final HashMap map = new HashMap<>(3); - - static { - map.put(TemplateType.beetl, new BeetlStringTemplateEngine()); - map.put(TemplateType.freemarker, new FreemarkerTemplateEngine()); - map.put(TemplateType.velocity, new VelocityTemplateEngine()); - } - - private TemplateEngineFactory() { - } - - public static AbstractTemplateEngine getTemplateEngine(TemplateType templateType) { - AbstractTemplateEngine engine = map.get(templateType); - if(engine == null) { - throw new RuntimeException("TemplateType can't be null!"); - } - - return engine; - } -} diff --git a/src/main/java/com/github/mengweijin/generator/mojo/AbstractDockerMojo.java b/src/main/java/com/github/mengweijin/generator/mojo/AbstractDockerMojo.java deleted file mode 100644 index 1c611d8258352a2e4be0bd545d0f5244ec3f4bed..0000000000000000000000000000000000000000 --- a/src/main/java/com/github/mengweijin/generator/mojo/AbstractDockerMojo.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.github.mengweijin.generator.mojo; - -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.util.RuntimeUtil; -import cn.hutool.core.util.StrUtil; -import com.github.mengweijin.generator.engine.BeetlStringTemplateEngine; -import com.github.mengweijin.generator.entity.Docker; -import com.github.mengweijin.generator.entity.ProjectInfo; -import com.github.mengweijin.generator.util.TemplateUtils; -import lombok.Getter; -import org.apache.maven.execution.MavenSession; -import org.apache.maven.model.Resource; -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugins.annotations.Parameter; -import org.apache.maven.project.MavenProject; -import java.io.File; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; - -/** - * 注释说明:@Execute(phase = LifecyclePhase.PACKAGE) 在执行当前 Mojo 前先打包 - * @author mengweijin - */ -@Getter -public abstract class AbstractDockerMojo extends AbstractMojo { - - @Parameter - private Docker docker; - - @Parameter(defaultValue = "${project}") - private MavenProject project; - - @Parameter(defaultValue = "${basedir}") - private File baseDir; - - @Parameter(defaultValue = "${project.build.resources}", readonly = true, required = true) - private List resources; - - @Parameter(defaultValue = "${project.build.sourceDirectory}", required = true, readonly = true) - private File sourceDir; - - @Parameter(defaultValue = "${project.build.testResources}", readonly = true, required = true) - private List testResources; - - @Parameter(defaultValue = "${project.build.testSourceDirectory}", readonly = true, required = true) - private File testSourceDir; - - @Parameter(defaultValue = "${project.compileClasspathElements}", readonly = true, required = true) - private List compilePath; - - @Parameter(defaultValue = "${session}", readonly = true) - private MavenSession session; - - protected void generate() throws Exception { - // clean TMP folder - FileUtil.del(FileUtil.file(ProjectInfo.TMP_DIR)); - TemplateUtils.copyTemplateFolderToJavaTmp("templates/"); - - Map objectMap = new HashMap<>(2); - objectMap.put("ARTIFACT_ID", project.getArtifactId()); - objectMap.put("VERSION", project.getVersion()); - - BeetlStringTemplateEngine templateEngine = new BeetlStringTemplateEngine(); - templateEngine.init(null); - - this.generateDockerScript(templateEngine, objectMap); - } - - protected void execBash(String bashName) throws Exception { - this.generate(); - - // return C: - String currentFileSystemMount = StrUtil.subPre(this.dockerfileDirector(), 2).toUpperCase(Locale.ROOT); - - StringBuilder builder = - new StringBuilder("cmd /c ").append(currentFileSystemMount).append(" && ") - .append("cd ").append(this.dockerfileDirector()).append(" && ") - .append(bashName); - - String cmdOutput = RuntimeUtil.execForStr(builder.toString()); - getLog().info(cmdOutput); - } - - private void generateDockerScript(BeetlStringTemplateEngine templateEngine, Map objectMap) throws Exception { - String templatePath = ProjectInfo.TMP_DIR + "templates/docker"; - List templateFileList = FileUtil.loopFiles(templatePath, - file -> file.isFile() && file.getName().toLowerCase().endsWith(".btl")); - - String outputFilePath; - for (File templateFile: templateFileList) { - outputFilePath = dockerfileDirector() + StrUtil.subBefore(templateFile.getName(), StrUtil.DOT, true); - getLog().info("Template " + templateFile.getAbsolutePath() + "--->" + outputFilePath); - render(templateFile.getAbsolutePath(), outputFilePath, templateEngine, objectMap); - } - } - - protected String dockerfileDirector() { - return baseDir.getAbsolutePath() + File.separator + "target" + File.separator; - } - - private File render(String templatePath, String outputFilePath, BeetlStringTemplateEngine templateEngine, Map objectMap) throws Exception { - File outputFile = FileUtil.file(outputFilePath); - FileUtil.mkParentDirs(outputFile); - templateEngine.writer(objectMap, templatePath, outputFile); - return outputFile; - } - -} diff --git a/src/main/java/com/github/mengweijin/generator/mojo/AbstractGeneratorMojo.java b/src/main/java/com/github/mengweijin/generator/mojo/AbstractGeneratorMojo.java deleted file mode 100644 index be74b9c74d2b0f4469a103bc00dfd818be4fd90b..0000000000000000000000000000000000000000 --- a/src/main/java/com/github/mengweijin/generator/mojo/AbstractGeneratorMojo.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.github.mengweijin.generator.mojo; - -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.lang.JarClassLoader; -import com.github.mengweijin.generator.entity.Parameters; -import com.github.mengweijin.generator.entity.ProjectInfo; -import com.github.mengweijin.generator.DefaultAutoGenerator; -import com.github.mengweijin.generator.util.TemplateUtils; -import lombok.Getter; -import org.apache.maven.execution.MavenSession; -import org.apache.maven.model.Resource; -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugin.MojoFailureException; -import org.apache.maven.plugins.annotations.Parameter; -import org.apache.maven.project.MavenProject; - -import java.io.File; -import java.lang.reflect.Method; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.List; -import java.util.Optional; - -/** - * @author mengweijin - */ -@Getter -public abstract class AbstractGeneratorMojo extends AbstractMojo { - - @Parameter - private Parameters parameters; - - @Parameter(defaultValue = "${project}") - private MavenProject project; - - @Parameter(defaultValue = "${basedir}") - private File baseDir; - - @Parameter(defaultValue = "${project.build.resources}", readonly = true, required = true) - private List resources; - - @Parameter(defaultValue = "${project.build.sourceDirectory}", required = true, readonly = true) - private File sourceDir; - - @Parameter(defaultValue = "${project.build.testResources}", readonly = true, required = true) - private List testResources; - - @Parameter(defaultValue = "${project.build.testSourceDirectory}", readonly = true, required = true) - private File testSourceDir; - - @Parameter(defaultValue = "${project.compileClasspathElements}", readonly = true, required = true) - private List compilePath; - - @Parameter(defaultValue = "${session}", readonly = true) - private MavenSession session; - - @Override - public void execute() throws MojoExecutionException, MojoFailureException { - try { - // clean TMP folder - FileUtil.del(FileUtil.file(ProjectInfo.TMP_DIR)); - - this.loadParentProjectClassToJarClassLoader(); - TemplateUtils.copyTemplateFolderToJavaTmp("templates/"); - this.parameters = Optional.ofNullable(this.parameters).orElse(new Parameters()); - this.setDefaultFixedParameters(this.parameters); - - ProjectInfo projectInfo = new ProjectInfo(); - projectInfo.setParameters(this.parameters); - projectInfo.setResourceList(this.getResources()); - projectInfo.setBaseDir(this.baseDir); - projectInfo.setSourceDir(this.sourceDir); - - new DefaultAutoGenerator(projectInfo).execute(); - } catch (Exception e) { - getLog().error(e); - throw new RuntimeException(e); - } - } - - /** - * set default fixed parameters - * @param parameters parameters - */ - protected abstract void setDefaultFixedParameters(Parameters parameters); - - private void loadParentProjectClassToJarClassLoader() { - try { - List runtimeElements = project.getRuntimeClasspathElements(); - - URL[] urls = new URL[runtimeElements.size()]; - for (int i = 0; i < runtimeElements.size(); ++i) { - urls[i] = new File(runtimeElements.get(i)).toURI().toURL(); - } - JarClassLoader jarClassLoader = new JarClassLoader(urls); - Thread.currentThread().setContextClassLoader(jarClassLoader); - } catch (Exception e) { - getLog().error(e.getMessage()); - throw new RuntimeException(e); - } - } - - private void loadParentProjectClassToApplicationClassLoader() { - URLClassLoader urlLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); - - try { - Method method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class }); - method.setAccessible(true); - - List classpathElements = project.getCompileClasspathElements(); - URL[] urls = new URL[classpathElements.size()]; - for (int i = 0; i < classpathElements.size(); ++i) { - urls[i] = new File(classpathElements.get(i)).toURI().toURL(); - method.invoke(urlLoader, urls[i]); - } - } catch (Exception e) { - getLog().error(e.getMessage()); - throw new RuntimeException(e); - } - } -} diff --git a/src/main/java/com/github/mengweijin/generator/mojo/CustomerGeneratorMojo.java b/src/main/java/com/github/mengweijin/generator/mojo/CustomerGeneratorMojo.java deleted file mode 100644 index 812675d781582c3207aae4bdff5d910c9fce6d26..0000000000000000000000000000000000000000 --- a/src/main/java/com/github/mengweijin/generator/mojo/CustomerGeneratorMojo.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.github.mengweijin.generator.mojo; - -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.util.ArrayUtil; -import com.github.mengweijin.generator.entity.Parameters; -import com.github.mengweijin.generator.enums.TemplateType; -import org.apache.maven.plugins.annotations.Mojo; -import org.apache.maven.plugins.annotations.ResolutionScope; -import java.io.File; - -/** - * ResolutionScope.COMPILE_PLUS_RUNTIME: - * Will add the classpath jars into list when call method project.getRuntimeClasspathElements(); - * maven scope=compile + system + provided + runtime dependencies - * - * @author mengweijin - */ -@Mojo(name = "Customer", requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME) -public class CustomerGeneratorMojo extends AbstractGeneratorMojo { - - @Override - protected void setDefaultFixedParameters(Parameters parameters) { - getLog().info("Note: The [templateLocation] and correct [templateType] must be configured! The default [templateType] value is btl."); - String templateLocation = parameters.getTemplateLocation(); - if(!FileUtil.isDirectory(templateLocation)) { - String msg = "Can't found valid template location, please check your configuration for args templateLocation. ===>"; - getLog().error(msg + templateLocation); - throw new RuntimeException(msg + templateLocation); - } - - TemplateType templateType = parameters.getTemplateType(); - File[] tplFiles = FileUtil.file(templateLocation).listFiles((dir, name) -> name.toLowerCase().endsWith(templateType.getSuffix())); - if(ArrayUtil.isEmpty(tplFiles)) { - String msg = "Can't found valid template files. Please check your configuration for args [templateLocation] and [templateType]!"; - getLog().error(msg); - getLog().error("Current args [templateLocation] is: " + templateLocation); - getLog().error("Current args [templateType] is: " + templateType.name()); - throw new RuntimeException(msg); - } - } -} diff --git a/src/main/java/com/github/mengweijin/generator/mojo/DockerBuildMojo.java b/src/main/java/com/github/mengweijin/generator/mojo/DockerBuildMojo.java deleted file mode 100644 index a6b52b70c058f6e68a648ec386ba6bd5438a0025..0000000000000000000000000000000000000000 --- a/src/main/java/com/github/mengweijin/generator/mojo/DockerBuildMojo.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.github.mengweijin.generator.mojo; - -import lombok.Getter; -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugin.MojoFailureException; -import org.apache.maven.plugins.annotations.Execute; -import org.apache.maven.plugins.annotations.LifecyclePhase; -import org.apache.maven.plugins.annotations.Mojo; - -/** - * 注释说明:@Execute(phase = LifecyclePhase.PACKAGE) 在执行当前 Mojo 前先打包 - * @author mengweijin - */ -@Getter -@Mojo(name = "Docker-Build") -@Execute(phase = LifecyclePhase.PACKAGE) -public class DockerBuildMojo extends DockerfileGeneratorMojo { - - public static final String DOCKER_IMAGE_BUILD = "DockerImageBuild.bat"; - - @Override - public void execute() throws MojoExecutionException, MojoFailureException { - try { - this.execBash(DOCKER_IMAGE_BUILD); - } catch (Exception e) { - getLog().error(e); - throw new RuntimeException(e); - } - } - -} diff --git a/src/main/java/com/github/mengweijin/generator/mojo/DockerDeleteMojo.java b/src/main/java/com/github/mengweijin/generator/mojo/DockerDeleteMojo.java deleted file mode 100644 index d3304a69757d7c8b93cfd92f3a605613150197e4..0000000000000000000000000000000000000000 --- a/src/main/java/com/github/mengweijin/generator/mojo/DockerDeleteMojo.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.github.mengweijin.generator.mojo; - -import lombok.Getter; -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugin.MojoFailureException; -import org.apache.maven.plugins.annotations.Mojo; - -/** - * 注释说明:@Execute(phase = LifecyclePhase.PACKAGE) 在执行当前 Mojo 前先打包 - * @author mengweijin - */ -@Getter -@Mojo(name = "Docker-Delete") -public class DockerDeleteMojo extends DockerfileGeneratorMojo { - - public static final String DOCKER_IMAGE_DELETE = "DockerImageDelete.bat"; - - @Override - public void execute() throws MojoExecutionException, MojoFailureException { - try { - this.execBash(DOCKER_IMAGE_DELETE); - } catch (Exception e) { - getLog().error(e); - throw new RuntimeException(e); - } - } - -} diff --git a/src/main/java/com/github/mengweijin/generator/mojo/DockerDeployMojo.java b/src/main/java/com/github/mengweijin/generator/mojo/DockerDeployMojo.java deleted file mode 100644 index 64824881b5ab5b6241736f926c72b3cb32a53949..0000000000000000000000000000000000000000 --- a/src/main/java/com/github/mengweijin/generator/mojo/DockerDeployMojo.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.github.mengweijin.generator.mojo; - -import lombok.Getter; -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugin.MojoFailureException; -import org.apache.maven.plugins.annotations.Execute; -import org.apache.maven.plugins.annotations.LifecyclePhase; -import org.apache.maven.plugins.annotations.Mojo; - -/** - * 注释说明:@Execute(phase = LifecyclePhase.PACKAGE) 在执行当前 Mojo 前先打包 - * @author mengweijin - */ -@Getter -@Mojo(name = "Docker-Deploy") -@Execute(phase = LifecyclePhase.PACKAGE) -public class DockerDeployMojo extends DockerfileGeneratorMojo { - - public static final String DOCKER_IMAGE_BUILD_RUN = "DockerImageBuildRun.bat"; - - @Override - public void execute() throws MojoExecutionException, MojoFailureException { - try { - this.execBash(DOCKER_IMAGE_BUILD_RUN); - } catch (Exception e) { - getLog().error(e); - throw new RuntimeException(e); - } - } - -} diff --git a/src/main/java/com/github/mengweijin/generator/mojo/DockerfileGeneratorMojo.java b/src/main/java/com/github/mengweijin/generator/mojo/DockerfileGeneratorMojo.java deleted file mode 100644 index 7ee9f28090911d0f3f6ee2418d431b5cb6367d93..0000000000000000000000000000000000000000 --- a/src/main/java/com/github/mengweijin/generator/mojo/DockerfileGeneratorMojo.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.github.mengweijin.generator.mojo; - -import lombok.Getter; -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugin.MojoFailureException; -import org.apache.maven.plugins.annotations.Execute; -import org.apache.maven.plugins.annotations.LifecyclePhase; -import org.apache.maven.plugins.annotations.Mojo; - -/** - * 注释说明:@Execute(phase = LifecyclePhase.PACKAGE) 在执行当前 Mojo 前先打包 - * @author mengweijin - */ -@Getter -@Mojo(name = "Dockerfile") -@Execute(phase = LifecyclePhase.PACKAGE) -public class DockerfileGeneratorMojo extends AbstractDockerMojo { - - @Override - public void execute() throws MojoExecutionException, MojoFailureException { - try { - this.generate(); - } catch (Exception e) { - getLog().error(e); - throw new RuntimeException(e); - } - } - -} diff --git a/src/main/java/com/github/mengweijin/generator/mojo/JpaGeneratorMojo.java b/src/main/java/com/github/mengweijin/generator/mojo/JpaGeneratorMojo.java deleted file mode 100644 index 1f1af44714f7e5b08dd2c100f85d18fe0fe09baf..0000000000000000000000000000000000000000 --- a/src/main/java/com/github/mengweijin/generator/mojo/JpaGeneratorMojo.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.github.mengweijin.generator.mojo; - -import com.github.mengweijin.generator.entity.Parameters; -import com.github.mengweijin.generator.entity.ProjectInfo; -import com.github.mengweijin.generator.enums.Template; -import com.github.mengweijin.generator.enums.TemplateType; -import org.apache.maven.plugins.annotations.Mojo; -import org.apache.maven.plugins.annotations.ResolutionScope; - -/** - * @author mengweijin - */ -@Mojo(name = "JPA", requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME) -public class JpaGeneratorMojo extends AbstractGeneratorMojo { - - private static final String JpaRepository = "org.springframework.data.jpa.repository.JpaRepository"; - - @Override - protected void setDefaultFixedParameters(Parameters parameters) { - parameters.setTemplateLocation(ProjectInfo.TMP_DIR + Template.JPA.getPath()); - parameters.setSuperDaoClass(JpaRepository); - parameters.setTemplateType(TemplateType.beetl); - } -} diff --git a/src/main/java/com/github/mengweijin/generator/mojo/MybatisPlusGeneratorMojo.java b/src/main/java/com/github/mengweijin/generator/mojo/MybatisPlusGeneratorMojo.java deleted file mode 100644 index 258518a85880ae905e0515d56d043d105c5f3901..0000000000000000000000000000000000000000 --- a/src/main/java/com/github/mengweijin/generator/mojo/MybatisPlusGeneratorMojo.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.github.mengweijin.generator.mojo; - -import com.github.mengweijin.generator.entity.Parameters; -import com.github.mengweijin.generator.entity.ProjectInfo; -import com.github.mengweijin.generator.enums.Template; -import com.github.mengweijin.generator.enums.TemplateType; -import org.apache.maven.plugins.annotations.Mojo; -import org.apache.maven.plugins.annotations.ResolutionScope; - -/** - * @author mengweijin - */ -@Mojo(name = "MyBatis-Plus", requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME) -public class MybatisPlusGeneratorMojo extends AbstractGeneratorMojo { - - private static final String BaseMapper = "com.baomidou.mybatisplus.core.mapper.BaseMapper"; - private static final String IService = "com.baomidou.mybatisplus.extension.service.IService"; - private static final String ServiceImpl = "com.baomidou.mybatisplus.extension.service.impl.ServiceImpl"; - - @Override - protected void setDefaultFixedParameters(Parameters parameters) { - parameters.setTemplateLocation(ProjectInfo.TMP_DIR + Template.MYBATIS_PLUS.getPath()); - parameters.setSuperDaoClass(BaseMapper); - parameters.setSuperServiceClass(IService); - parameters.setSuperServiceImplClass(ServiceImpl); - parameters.setTemplateType(TemplateType.beetl); - } -} diff --git a/src/main/java/com/github/mengweijin/generator/reader/PropertiesBootFileReader.java b/src/main/java/com/github/mengweijin/generator/reader/PropertiesBootFileReader.java deleted file mode 100644 index c73201d97721084bff28ae9df114e4e4ba780699..0000000000000000000000000000000000000000 --- a/src/main/java/com/github/mengweijin/generator/reader/PropertiesBootFileReader.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.github.mengweijin.generator.reader; - -import cn.hutool.core.util.StrUtil; -import cn.hutool.setting.dialect.Props; -import com.github.mengweijin.generator.entity.DbInfo; - -import java.io.File; -import java.net.MalformedURLException; -import java.nio.charset.StandardCharsets; - -public class PropertiesBootFileReader implements BootFileReader { - - @Override - public String getActiveProfilesEnv(File file) { - try { - Props props = new Props(file.toURI().toURL(), StandardCharsets.UTF_8); - return props.getStr(SPRING_PROFILES_ACTIVE); - } catch (MalformedURLException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - - @Override - public DbInfo getDbInfo(File file) { - try { - Props props = new Props(file.toURI().toURL(), StandardCharsets.UTF_8); - String url = props.getStr(SPRING_DATASOURCE_URL); - if(StrUtil.isBlank(url)) { - return null; - } - - DbInfo dbInfo = new DbInfo(); - dbInfo.setUrl(url); - dbInfo.setUsername(props.getStr(SPRING_DATASOURCE_USERNAME)); - dbInfo.setPassword(props.getStr(SPRING_DATASOURCE_PASSWORD)); - - return dbInfo; - } catch (MalformedURLException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } -} diff --git a/src/main/java/com/github/mengweijin/generator/util/TemplateUtils.java b/src/main/java/com/github/mengweijin/generator/util/TemplateUtils.java deleted file mode 100644 index 3e7246ce01a339059283d631477f294cb9cff1b0..0000000000000000000000000000000000000000 --- a/src/main/java/com/github/mengweijin/generator/util/TemplateUtils.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.github.mengweijin.generator.util; - -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.core.util.URLUtil; -import com.github.mengweijin.generator.entity.ProjectInfo; -import lombok.extern.slf4j.Slf4j; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.util.Enumeration; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; - -/** - * @author mengweijin - */ -@Slf4j -public final class TemplateUtils { - /** - * - * @param classPathResource "templates/" - */ - public static void copyTemplateFolderToJavaTmp(String classPathResource) { - File tmpFile; - JarFile jarFile = null; - InputStream inputStream = null; - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - URL url = classLoader.getResource(classPathResource); - try { - if (URLUtil.isJarURL(url)) { - jarFile = URLUtil.getJarFile(url); - Enumeration enumeration = jarFile.entries(); - String jarEntryName; - while (enumeration.hasMoreElements()) { - jarEntryName = enumeration.nextElement().getName(); - if (jarEntryName.startsWith(classPathResource) && !jarEntryName.endsWith(StrUtil.SLASH)) { - inputStream = classLoader.getResource(jarEntryName).openConnection().getInputStream(); - tmpFile = FileUtil.file(ProjectInfo.TMP_DIR + jarEntryName); - FileUtil.writeFromStream(inputStream, tmpFile); - } - } - } - } catch (IOException e) { - log.error(e.getMessage()); - e.printStackTrace(); - throw new RuntimeException(e); - } finally { - IoUtil.close(inputStream); - IoUtil.close(jarFile); - } - } -} diff --git a/src/main/resources/script/docker/Dockerfile b/src/main/resources/script/docker/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..e4580186e8afe469c55b778fa67b145bbc88d9db --- /dev/null +++ b/src/main/resources/script/docker/Dockerfile @@ -0,0 +1,20 @@ +#FROM findepi/graalvm:java17-native +FROM openjdk:17.0.2-oraclelinux8 + +LABEL maintainer="Meng Wei Jin" + +ARG DIR=/opt/app + +RUN mkdir -p ${DIR} + +WORKDIR ${DIR} + +ENV SERVER_PORT=8080 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" + +EXPOSE ${SERVER_PORT} + +#ADD ./target/app-admin.jar ./app.jar + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ + -XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \ + -jar app.jar \ No newline at end of file diff --git a/src/main/resources/script/linux/app.service b/src/main/resources/script/linux/app.service new file mode 100644 index 0000000000000000000000000000000000000000..526af39b06b818b697bc27bdfbbc8883576ad141 --- /dev/null +++ b/src/main/resources/script/linux/app.service @@ -0,0 +1,16 @@ +[Unit] +Description=app-server +After=syslog.target network.target + +[Service] +Type=forking +WorkingDirectory=/opt/app/ +ExecStart=/bin/bash ./app.sh start +ExecStop=/bin/bash ./app.sh stop +ExecReload=/bin/bash ./app.sh restart +PrivateTmp=true +TimeoutStartSec=0 +KillMode=none + +[Install] +WantedBy=multi-user.target diff --git a/src/main/resources/script/linux/app.sh b/src/main/resources/script/linux/app.sh new file mode 100644 index 0000000000000000000000000000000000000000..876d5ba95e32510ba667c60661cdfef8f0838b6e --- /dev/null +++ b/src/main/resources/script/linux/app.sh @@ -0,0 +1,86 @@ +#!/bin/sh +# ./app.sh start 启动 stop 停止 restart 重启 status 状态 +AppName=app-admin.jar + +# JVM参数 +JVM_OPTS="-Dname=$AppName -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC" +APP_HOME=`pwd` +LOG_PATH=$APP_HOME/logs/$AppName.log + +if [ "$1" = "" ]; +then + echo -e "\033[0;31m 未输入操作名 \033[0m \033[0;34m {start|stop|restart|status} \033[0m" + exit 1 +fi + +if [ "$AppName" = "" ]; +then + echo -e "\033[0;31m 未输入应用名 \033[0m" + exit 1 +fi + +function start() +{ + PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'` + + if [ x"$PID" != x"" ]; then + echo "$AppName is running..." + else + nohup java $JVM_OPTS -jar $AppName > /dev/null 2>&1 & + echo "Start $AppName success..." + fi +} + +function stop() +{ + echo "Stop $AppName" + + PID="" + query(){ + PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'` + } + + query + if [ x"$PID" != x"" ]; then + kill -TERM $PID + echo "$AppName (pid:$PID) exiting..." + while [ x"$PID" != x"" ] + do + sleep 1 + query + done + echo "$AppName exited." + else + echo "$AppName already stopped." + fi +} + +function restart() +{ + stop + sleep 2 + start +} + +function status() +{ + PID=`ps -ef |grep java|grep $AppName|grep -v grep|wc -l` + if [ $PID != 0 ];then + echo "$AppName is running..." + else + echo "$AppName is not running..." + fi +} + +case $1 in + start) + start;; + stop) + stop;; + restart) + restart;; + status) + status;; + *) + +esac diff --git a/src/main/resources/script/windows/app.bat b/src/main/resources/script/windows/app.bat new file mode 100644 index 0000000000000000000000000000000000000000..b4a132be99e8222412b8c4e8652e742d5d3a8b03 --- /dev/null +++ b/src/main/resources/script/windows/app.bat @@ -0,0 +1,68 @@ +rem 使用者应根据自身平台编码自行转换 防止乱码 例如 win使用gbk编码 +@echo off + +rem jar平级目录 +set AppName=app-admin.jar + +rem JVM参数 +set JVM_OPTS="-Dname=%AppName% -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC" + + +ECHO. + ECHO. [1] 启动%AppName% + ECHO. [2] 关闭%AppName% + ECHO. [3] 重启%AppName% + ECHO. [4] 启动状态 %AppName% + ECHO. [5] 退 出 +ECHO. + +ECHO.请输入选择项目的序号: +set /p ID= + IF "%id%"=="1" GOTO start + IF "%id%"=="2" GOTO stop + IF "%id%"=="3" GOTO restart + IF "%id%"=="4" GOTO status + IF "%id%"=="5" EXIT +PAUSE +:start + for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do ( + set pid=%%a + set image_name=%%b + ) + if defined pid ( + echo %%is running + PAUSE + ) + +start javaw %JVM_OPTS% -jar %AppName% + +echo starting…… +echo Start %AppName% success... +goto:eof + +rem 函数stop通过jps命令查找pid并结束进程 +:stop + for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do ( + set pid=%%a + set image_name=%%b + ) + if not defined pid (echo process %AppName% does not exists) else ( + echo prepare to kill %image_name% + echo start kill %pid% ... + rem 根据进程ID,kill进程 + taskkill /f /pid %pid% + ) +goto:eof +:restart + call :stop + call :start +goto:eof +:status + for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do ( + set pid=%%a + set image_name=%%b + ) + if not defined pid (echo process %AppName% is dead ) else ( + echo %image_name% is running + ) +goto:eof diff --git a/src/main/resources/script/windows/start.bat b/src/main/resources/script/windows/start.bat new file mode 100644 index 0000000000000000000000000000000000000000..4d6d9ed222e7190aea9cbd2b36148a9b6fd3f712 --- /dev/null +++ b/src/main/resources/script/windows/start.bat @@ -0,0 +1,26 @@ +rem 使用者应根据自身平台编码自行转换 防止乱码 例如 win使用gbk编码 +@echo off +title=App-Service + +echo 启动倒计时: +timeout /T 10 /NOBREAK + +rem jar平级目录 +set AppName=app-admin.jar + +rem JVM参数 +set JVM_OPTS="-Dname=%AppName% -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC" + +for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do ( + set pid=%%a + set image_name=%%b +) +if defined pid ( + echo %%is running + PAUSE +) + +echo starting…… +java %JVM_OPTS% -jar %AppName% +PAUSE + diff --git a/src/main/resources/templates/docker/DockerImageBuild.bat.btl b/src/main/resources/templates/docker/DockerImageBuild.bat.btl deleted file mode 100644 index ad1b142d91d3b0f3187f809ef9f4227ae0905b91..0000000000000000000000000000000000000000 --- a/src/main/resources/templates/docker/DockerImageBuild.bat.btl +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -call DockerImageDelete.bat - -echo Building docker image - -docker build -t ${ARTIFACT_ID}:${VERSION} . - -rem docker build -t registry.cn-hangzhou.aliyuncs.com/mengweijin/${ARTIFACT_ID}:${VERSION} . -rem docker login --username=***@**.com registry.cn-hangzhou.aliyuncs.com -rem docker tag ${ARTIFACT_ID}:${VERSION} registry.cn-hangzhou.aliyuncs.com/mengweijin/${ARTIFACT_ID}:${VERSION} -rem docker push registry.cn-hangzhou.aliyuncs.com/mengweijin/${ARTIFACT_ID}:${VERSION} - diff --git a/src/main/resources/templates/docker/DockerImageBuildRun.bat.btl b/src/main/resources/templates/docker/DockerImageBuildRun.bat.btl deleted file mode 100644 index 1d4989807986a062de20cc6330ba3b524de2de48..0000000000000000000000000000000000000000 --- a/src/main/resources/templates/docker/DockerImageBuildRun.bat.btl +++ /dev/null @@ -1,7 +0,0 @@ -@echo off - -call DockerImageBuild.bat - -echo Starting docker container - -docker run --name ${ARTIFACT_ID} -d -p 8080:8080 ${ARTIFACT_ID}:${VERSION} diff --git a/src/main/resources/templates/docker/DockerImageDelete.bat.btl b/src/main/resources/templates/docker/DockerImageDelete.bat.btl deleted file mode 100644 index ddcd9862c1fba10bcac0087076e71d3661aea4a1..0000000000000000000000000000000000000000 --- a/src/main/resources/templates/docker/DockerImageDelete.bat.btl +++ /dev/null @@ -1,27 +0,0 @@ -@echo off - -echo Deleting docker container and image - -set REPOSITORY=${ARTIFACT_ID} -set TAG=${VERSION} - -for /f "skip=1 tokens=1,2 delims= " %%i in ('docker ps -a') do ( - if "%REPOSITORY%:%TAG%"=="%%j" ( - echo delete docker container %%i %%j - docker rm -f %%i - ) -) - -rem skip=1 skip the first row -rem tokens=1,2,3 Get only the 1,2,3 entries of the delims delimiter, and the three corresponding variables are also required in do() to receive, for example: echo %%i %%j %%k -rem delims= A string separated by a space on each line in the list -rem %%i in ('docker images') %%i is used to receive the values returned by the 'docker images' command and delimit them according to delims -rem do() The code in do() is executed once for each line in the list -for /f "skip=1 tokens=1,2,3 delims= " %%i in ('docker images') do ( - if "%REPOSITORY%"=="%%i" ( - if "%TAG%"=="%%j" ( - echo delete docker image %%i %%j %%k - docker rmi -f %%k - ) - ) -) diff --git a/src/main/resources/templates/docker/Dockerfile.btl b/src/main/resources/templates/docker/Dockerfile.btl deleted file mode 100644 index 7419e9212546e1e25aee4798edcc424b0519f843..0000000000000000000000000000000000000000 --- a/src/main/resources/templates/docker/Dockerfile.btl +++ /dev/null @@ -1,11 +0,0 @@ -FROM java:8 -MAINTAINER Meng Wei Jin mengweijin.work@foxmail.com - -ARG JAR_FILE=${ARTIFACT_ID}-${VERSION}.jar - -RUN mkdir /app -COPY \${JAR_FILE} /app/application.jar -# RUN bash -c 'touch /app/application.jar' - -ENTRYPOINT ["java", "-jar", "/app/application.jar"] -EXPOSE 8080 diff --git a/src/main/resources/templates/jpa/${entityName}.java.vm b/src/main/resources/templates/jpa/${entityName}.java.vm new file mode 100644 index 0000000000000000000000000000000000000000..c5345ed7978586230d6271849bc0eb67d2fc49ab --- /dev/null +++ b/src/main/resources/templates/jpa/${entityName}.java.vm @@ -0,0 +1,54 @@ +package ${package}; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +#if("$!{baseEntity}" != "") +import ${baseEntity}; +#else +import java.io.Serializable; +#end +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + *

+ * $!{table.comment} + *

+ * + * @author ${author} + * @since ${date} + */ +@Data +#if("$!{baseEntity}" != "") +@EqualsAndHashCode(callSuper = true) +#else +@EqualsAndHashCode(callSuper = false) +#end +@Accessors(chain = true) +@Entity +@Table(name = "${table.name}") +#if("$!{baseEntityName}" != "") +public class ${entityName} extends ${baseEntityName} { +#else +public class ${entityName} implements Serializable { + + private static final long serialVersionUID = 1L; +#end +#foreach($field in ${entityFields}) + +#if("$!field.comment" != "") + /** + * ${field.comment} + */ +#end +#if(${field.keyFlag}) + @Id +#else + @Column(name= "${field.name}") +#end + private ${field.propertyType} ${field.propertyName}; +#end +} diff --git a/src/main/resources/templates/jpa/${entityName}Controller.java.vm b/src/main/resources/templates/jpa/${entityName}Controller.java.vm new file mode 100644 index 0000000000000000000000000000000000000000..098d993c064a9e2181095770512db1b3b1a1896c --- /dev/null +++ b/src/main/resources/templates/jpa/${entityName}Controller.java.vm @@ -0,0 +1,81 @@ +package ${package}; + +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import jakarta.validation.Valid; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestParam; +import java.util.Optional; + +/** + *

+ * $!{table.comment} Controller + *

+ * + * @author ${author} + * @since ${date} + */ +@Slf4j +@Validated +@RestController +@RequestMapping("${requestMapping}") +public class ${entityName}Controller { + + private ${entityName}Service ${entityPropertyName}Service; + + private ${entityName}Repository ${entityPropertyName}Repository; + + /** + *

+ * Get ${entityName} by id + *

+ * @param id id + * @return ${entityName} + */ + @GetMapping("/{id}") + public Optional<${entityName}> getById(@PathVariable("id") ${idField.columnType.type} id) { + return ${entityPropertyName}Repository.findById(id); + } + + /** + *

+ * Add ${entityName} + *

+ * @param ${entityPropertyName} {@link ${entityName}} + */ + @PostMapping + public void add(@Valid @RequestBody ${entityName} ${entityPropertyName}) { + ${entityPropertyName}Repository.save(${entityPropertyName}); + } + + /** + *

+ * Update ${entityName} + *

+ * @param ${entityPropertyName} {@link ${entityName}} + */ + @PutMapping + public void update(@Valid @RequestBody ${entityName} ${entityPropertyName}) { + ${entityPropertyName}Repository.save(${entityPropertyName}); + } + + /** + *

+ * Delete ${entityName} by id + *

+ * @param id id + */ + @DeleteMapping("/{id}") + public void delete(@Valid @PathVariable("id") ${idField.columnType.type} id) { + ${entityPropertyName}Repository.deleteById(id); + } + +} diff --git a/src/main/resources/templates/jpa/${entityName}DTO.java.vm b/src/main/resources/templates/jpa/${entityName}DTO.java.vm new file mode 100644 index 0000000000000000000000000000000000000000..145c510ff1a6b5db12e44657cb72c6d4a88cc24b --- /dev/null +++ b/src/main/resources/templates/jpa/${entityName}DTO.java.vm @@ -0,0 +1,25 @@ +package ${package}; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import java.io.Serial; +import java.io.Serializable; + +/** + *

+ * ${entityName} DTO + *

+ * + * @author ${author} + * @since ${date} + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class ${entityName}DTO extends ${entityName} implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + +} diff --git a/src/main/resources/templates/jpa/${entityName}Repository.java.vm b/src/main/resources/templates/jpa/${entityName}Repository.java.vm new file mode 100644 index 0000000000000000000000000000000000000000..ce0bf42cfddd98daefd538a753240eca78eb902d --- /dev/null +++ b/src/main/resources/templates/jpa/${entityName}Repository.java.vm @@ -0,0 +1,17 @@ +package ${package}; + +import org.springframework.stereotype.Repository; + +/** + *

+ * $!{table.comment} ${entityName} Repository + *

+ * + * @author ${author} + * @since ${date} + */ +@Repository +public interface ${entityName}Repository { + +} + diff --git a/src/main/resources/templates/jpa/${entityName}Service.java.vm b/src/main/resources/templates/jpa/${entityName}Service.java.vm new file mode 100644 index 0000000000000000000000000000000000000000..b51f9f1d1c37dcde23cf8807bc56c473901533b0 --- /dev/null +++ b/src/main/resources/templates/jpa/${entityName}Service.java.vm @@ -0,0 +1,25 @@ +package ${package}; + +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + *

+ * $!{table.comment} ${entityName} Service + * Add @Transactional(rollbackFor = Exception.class) if you need. + *

+ * + * @author ${author} + * @since ${date} + */ +@Slf4j +@AllArgsConstructor +@Service +public class ${entityName}Service { + + private ${entityName}Repository ${entityPropertyName}Repository; + +} + diff --git a/src/main/resources/templates/jpa/controller.java.btl b/src/main/resources/templates/jpa/controller.java.btl deleted file mode 100644 index 03b3ff8162fcdf2c002964a1d3d5154b207e0426..0000000000000000000000000000000000000000 --- a/src/main/resources/templates/jpa/controller.java.btl +++ /dev/null @@ -1,114 +0,0 @@ -package ${parameters.outputPackage}.controller; - -<% if(entityLombokModel){ %> -import lombok.extern.slf4j.Slf4j; -<% } %> -import javax.validation.Valid; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -<% if(restControllerStyle){ %> -import org.springframework.web.bind.annotation.RestController; -<% }else{ %> -import org.springframework.stereotype.Controller; -<% } %> -<% if(isNotEmpty(superControllerClassPackage)){ %> -import ${superControllerClassPackage}; -<% } %> -import ${parameters.outputPackage}.entity.${entity}; -import ${parameters.outputPackage}.repository.${entity}Repository; -import ${parameters.outputPackage}.service.${entity}Service; -import java.util.Optional; - -/** - *

- * ${table.comment!} Controller - *

- * - * @author ${author} - * @since ${date} - */ -<% if(entityLombokModel){ %> -@Slf4j -<% } %> -@Validated -<% if(restControllerStyle){ %> -@RestController -<% }else{ %> -@Controller -<% } %> -@RequestMapping("<% if(isNotEmpty(package.ModuleName)){ %>/${package.ModuleName}<% } %>/<% if(isNotEmpty(controllerMappingHyphenStyle)){ %>${controllerMappingHyphen}<% }else{ %>${table.entityPath}<% } %>") -<% if(isNotEmpty(superControllerClass)){ %> -public class ${entity}Controller extends ${superControllerClass} { -<% }else{ %> -public class ${entity}Controller { -<% } %> - - /** - *

- * ${entity}Service - *

- */ - @Autowired - private ${entity}Service ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Service; - - /** - *

- * ${entity}Repository - *

- */ - @Autowired - private ${entity}Repository ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Repository; - - /** - *

- * Get ${entity} by id - *

- * @param id id - * @return ${entity} - */ - @GetMapping("/{id}") - public Optional<${entity}> getById(@PathVariable("id") ${idField.propertyType} id) { - return ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Repository.findById(id); - } - - /** - *

- * Add ${entity} - *

- * @param ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} - */ - @PostMapping - public void add(@Valid @RequestBody ${entity} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}) { - ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Repository.save(${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}); - } - - /** - *

- * Update ${entity} - *

- * @param ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} - */ - @PutMapping - public void update(@Valid @RequestBody ${entity} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}) { - ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Repository.save(${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}); - } - - /** - *

- * Delete ${entity} by id - *

- * @param id id - */ - @DeleteMapping("/{id}") - public void delete(@Valid @PathVariable("id") ${idField.propertyType} id) { - ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Repository.deleteById(id); - } - -} diff --git a/src/main/resources/templates/jpa/entity.java.btl b/src/main/resources/templates/jpa/entity.java.btl deleted file mode 100644 index 5748441e0cd942c2a95ddc8e494e0ced4d457560..0000000000000000000000000000000000000000 --- a/src/main/resources/templates/jpa/entity.java.btl +++ /dev/null @@ -1,117 +0,0 @@ -package ${parameters.outputPackage}.entity; - -<% if(hasLongField){ %> -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -<% } %> -<% if(isNotEmpty(superEntityClassPackage)){ %> -import ${superEntityClassPackage}; -<% }else{ %> -import java.io.Serializable; -<% } %> -<% if(entityLombokModel){ %> -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; -<% } %> -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; - -/** - *

- * ${table.comment!} - *

- * - * @author ${author} - * @since ${date} - */ -<% if(entityLombokModel){ %> -@Data - <% if(isNotEmpty(superEntityClass)){ %> -@EqualsAndHashCode(callSuper = true) - <% }else{ %> -@EqualsAndHashCode(callSuper = false) - <% } %> -@Accessors(chain = true) -<% } %> -@Entity -@Table(name = "${table.name}") -<% if(isNotEmpty(superEntityClass)){ %> -public class ${entity} extends ${superEntityClass} { -<% }else{ %> -public class ${entity} implements Serializable { -<% } %> - -<% if(entitySerialVersionUID){ %> - private static final long serialVersionUID = 1L; -<% } %> -<% /** -----------BEGIN 字段循环遍历----------- **/ %> -<% for(field in table.fields){ %> - - <% if(isNotEmpty(field.comment)){ %> - /** - * ${field.comment!} - */ - <% } %> - <% if(field.keyFlag){ %> - @Id - <% } else { %> - @Column(name= "${field.name}") - <% } %> - <% if('Long' == field.propertyType){ %> - @JsonSerialize(using = ToStringSerializer.class) - <% } %> - private ${field.propertyType} ${field.propertyName}; -<% } %> -<% /** -----------END 字段循环遍历----------- **/ %> - -<% if(!entityLombokModel){ %> - <% for(field in table.fields){ %> - <% - var getprefix =''; - if(field.propertyType=='boolean'){ - getprefix='is'; - }else{ - getprefix='get'; - } - %> - public ${field.propertyType} ${getprefix}${field.capitalName}() { - return ${field.propertyName}; - } - - <% if(entityBuilderModel){ %> - public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) { - <% }else{ %> - public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) { - <% } %> - this.${field.propertyName} = ${field.propertyName}; - <% if(entityBuilderModel){ %> - return this; - <% } %> - } - - <% } %> -<% } %> -<% if(entityColumnConstant){ %> - <% for(field in table.fields){ %> - public static final String ${strutil.toUpperCase(field.name)} = "${field.name}"; - - <% } %> -<% } %> -<% if(!entityLombokModel){ %> - @Override - public String toString() { - return "${entity}{" + - <% for(field in table.fields){ %> - <% if(fieldLP.index==0){ %> - "${field.propertyName}=" + ${field.propertyName} + - <% }else{ %> - ", ${field.propertyName}=" + ${field.propertyName} + - <% } %> - <% } %> - "}"; - } -<% } %> -} diff --git a/src/main/resources/templates/jpa/repository.java.btl b/src/main/resources/templates/jpa/repository.java.btl deleted file mode 100644 index 2ab5316d81a722532ee2287bf57ee38aec32198a..0000000000000000000000000000000000000000 --- a/src/main/resources/templates/jpa/repository.java.btl +++ /dev/null @@ -1,21 +0,0 @@ -package ${parameters.outputPackage}.repository; - -import ${parameters.outputPackage}.entity.${entity}; -<% if(isNotEmpty(superMapperClassPackage)){ %> -import ${superMapperClassPackage}; -<% } %> -import org.springframework.stereotype.Repository; -import java.io.Serializable; - -/** - *

- * ${entity} Repository Interface - *

- * - * @author ${author} - * @since ${date} - */ -@Repository -public interface ${entity}Repository extends ${superMapperClass}<${entity}, Serializable> { - -} diff --git a/src/main/resources/templates/jpa/service.java.btl b/src/main/resources/templates/jpa/service.java.btl deleted file mode 100644 index 9047d83b2da21fd2df611ffd5415bf829cbc7e0d..0000000000000000000000000000000000000000 --- a/src/main/resources/templates/jpa/service.java.btl +++ /dev/null @@ -1,33 +0,0 @@ -package ${parameters.outputPackage}.service; - -<% if(entityLombokModel){ %> -import lombok.extern.slf4j.Slf4j; -<% } %> -import ${parameters.outputPackage}.entity.${entity}; -import ${parameters.outputPackage}.repository.${entity}Repository; -import ${parameters.outputPackage}.service.${entity}Service; -<% if(isNotEmpty(superServiceImplClassPackage)){ %> -import ${superServiceImplClassPackage}; -<% } %> -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -/** - *

- * ${table.comment!} implement - * Add @Transactional(rollbackFor = Exception.class) if you need. - *

- * - * @author ${author} - * @since ${date} - */ -<% if(entityLombokModel){ %> -@Slf4j -<% } %> -@Service -public class ${entity}Service { - - @Autowired - private ${entity}Repository ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Repository; - -} diff --git a/src/main/resources/templates/mybatis-plus/${entityName}.java.vm b/src/main/resources/templates/mybatis-plus/${entityName}.java.vm new file mode 100644 index 0000000000000000000000000000000000000000..f6f2a99c97341d2f6575b441c670f4f9e194cd4b --- /dev/null +++ b/src/main/resources/templates/mybatis-plus/${entityName}.java.vm @@ -0,0 +1,57 @@ +package ${package}; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +#if("$!{baseEntity}" != "") +import ${baseEntity}; +#else +import java.io.Serializable; +#end + +/** + *

+ * $!{table.comment} + *

+ * + * @author ${author} + * @since ${date} + */ +@Data +#if("$!{baseEntity}" != "") +@EqualsAndHashCode(callSuper = true) +#else +@EqualsAndHashCode(callSuper = false) +#end +@Accessors(chain = true) +@TableName("${table.name}") +#if("$!{baseEntityName}" != "") +public class ${entityName} extends ${baseEntityName} { +#else +public class ${entityName} implements Serializable { + + private static final long serialVersionUID = 1L; +#end +#foreach($field in ${entityFields}) + +#if("$!field.comment" != "") + /** + * ${field.comment} + */ +#end +#if(${field.keyFlag}) + @TableId("${field.annotationColumnName}") +#end +## 乐观锁注解 +#if(${field.versionField}) + @Version +#end +## 逻辑删除注解 +#if(${field.logicDeleteField}) + @TableLogic +#end + private ${field.propertyType} ${field.propertyName}; +#end +} diff --git a/src/main/resources/templates/mybatis/controller.java.btl b/src/main/resources/templates/mybatis-plus/${entityName}Controller.java.vm similarity index 33% rename from src/main/resources/templates/mybatis/controller.java.btl rename to src/main/resources/templates/mybatis-plus/${entityName}Controller.java.vm index 72d0eb6d01a66b15a2344753d91050c42d7469f2..dc6a1ae84bcc78c307c0c2602d4493c401ac05f3 100644 --- a/src/main/resources/templates/mybatis/controller.java.btl +++ b/src/main/resources/templates/mybatis-plus/${entityName}Controller.java.vm @@ -1,100 +1,100 @@ -package ${parameters.outputPackage}.controller; +package ${package}; -<% if(entityLombokModel){ %> +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.mengweijin.vitality.framework.domain.R; +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -<% } %> -import javax.validation.Valid; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; -<% if(restControllerStyle){ %> +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -<% }else{ %> -import org.springframework.stereotype.Controller; -<% } %> -<% if(isNotEmpty(superControllerClassPackage)){ %> -import ${superControllerClassPackage}; -<% } %> -import ${parameters.outputPackage}.entity.${entity}; -import ${parameters.outputPackage}.service.${entity}Service; +import org.springframework.web.bind.annotation.RequestParam; /** *

- * ${table.comment!} Controller + * $!{table.comment} ${entityName} Controller *

* * @author ${author} * @since ${date} */ -<% if(entityLombokModel){ %> @Slf4j -<% } %> +@AllArgsConstructor @Validated -<% if(restControllerStyle){ %> @RestController -<% }else{ %> -@Controller -<% } %> -@RequestMapping("<% if(isNotEmpty(moduleName)){ %>/${moduleName}<% } %>/${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}") -public class ${entity}Controller <% if(isNotEmpty(superControllerName)){ %>extends ${superControllerName}<% } %> { +@RequestMapping("${requestMapping}") +public class ${entityName}Controller { + + private ${entityName}Service ${entityPropertyName}Service; /** *

- * ${entity}Service + * Get ${entityName} page by ${entityName} *

+ * @param page page + * @param ${entityPropertyName} {@link ${entityName}} + * @return Page<${entityName}> */ - @Autowired - private ${entity}Service ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Service; + @GetMapping("/page") + public Page<${entityName}> page(Page<${entityName}> page, ${entityName} ${entityPropertyName}) { + return ${entityPropertyName}Service.page(page, new QueryWrapper<>(${entityPropertyName})); + } /** *

- * Get ${entity} by id + * Get ${entityName} by id *

* @param id id - * @return ${entity} + * @return ${entityName} */ @GetMapping("/{id}") - public ${entity} getById(@PathVariable("id") ${idField.propertyType} id) { - return ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Service.getById(id); + public ${entityName} getById(@PathVariable("id") ${idField.columnType.type} id) { + return ${entityPropertyName}Service.getById(id); } /** *

- * Add ${entity} + * Add ${entityName} *

- * @param ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} + * @param ${entityPropertyName} {@link ${entityName}} */ @PostMapping - public void add(@Valid @RequestBody ${entity} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}) { - ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Service.save(${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}); + public R add(@Valid @RequestBody ${entityName} ${entityPropertyName}) { + boolean bool = ${entityPropertyName}Service.save(${entityPropertyName}); + return R.bool(bool); } /** *

- * Update ${entity} + * Update ${entityName} *

- * @param ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} + * @param ${entityPropertyName} {@link ${entityName}} */ @PutMapping - public void update(@Valid @RequestBody ${entity} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}) { - ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Service.updateById(${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}); + public R update(@Valid @RequestBody ${entityName} ${entityPropertyName}) { + boolean bool = ${entityPropertyName}Service.updateById(${entityPropertyName}); + return R.bool(bool); } /** *

- * Delete ${entity} by id + * Delete ${entityName} by id(s), Multiple ids can be separated by commas ",". *

- * @param id id + * @param ids id */ - @DeleteMapping("/{id}") - public void delete(@PathVariable("id") ${idField.propertyType} id) { - ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Service.removeById(id); + @DeleteMapping("/{ids}") + public R delete(@PathVariable("ids") ${idField.columnType.type}[] ids) { + int i = ${entityPropertyName}Service.getBaseMapper().deleteBatchIds(Arrays.asList(ids)); + return R.ajax(i); } } + diff --git a/src/main/resources/templates/mybatis-plus/${entityName}DTO.java.vm b/src/main/resources/templates/mybatis-plus/${entityName}DTO.java.vm new file mode 100644 index 0000000000000000000000000000000000000000..145c510ff1a6b5db12e44657cb72c6d4a88cc24b --- /dev/null +++ b/src/main/resources/templates/mybatis-plus/${entityName}DTO.java.vm @@ -0,0 +1,25 @@ +package ${package}; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import java.io.Serial; +import java.io.Serializable; + +/** + *

+ * ${entityName} DTO + *

+ * + * @author ${author} + * @since ${date} + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class ${entityName}DTO extends ${entityName} implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + +} diff --git a/src/main/resources/templates/mybatis-plus/${entityName}Mapper.java.vm b/src/main/resources/templates/mybatis-plus/${entityName}Mapper.java.vm new file mode 100644 index 0000000000000000000000000000000000000000..47131e085e10c48d4bf5115bf6de017f7e68f304 --- /dev/null +++ b/src/main/resources/templates/mybatis-plus/${entityName}Mapper.java.vm @@ -0,0 +1,28 @@ +package ${package}; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * $!{table.comment} ${entityName} Mapper + *

+ * + * @author ${author} + * @since ${date} + */ +@Mapper +public interface ${entityName}Mapper extends BaseMapper<${entityName}> { + + /** + * Custom paging query + * @param page page + * @param ${entityPropertyName} {@link ${entityName}} + * @return IPage + */ + IPage<${entityName}> page(IPage<${entityName}> page, @Param("p") ${entityName} ${entityPropertyName}); + +} + diff --git a/src/main/resources/templates/mybatis-plus/${entityName}Mapper.xml.vm b/src/main/resources/templates/mybatis-plus/${entityName}Mapper.xml.vm new file mode 100644 index 0000000000000000000000000000000000000000..645cfe983049a0bfd395e72e1c1c76645f41bb71 --- /dev/null +++ b/src/main/resources/templates/mybatis-plus/${entityName}Mapper.xml.vm @@ -0,0 +1,46 @@ + + + + + + +## id +#foreach($field in ${allFields}) + #if(${field.keyFlag}) + + #end +#end +##生成其他字段 +#foreach($field in ${allFields}) + #if(!${field.keyFlag}) + + #end +#end + + + + +#foreach($field in ${allFields}) + ${field.name}#if($foreach.hasNext),#end +#end + + + + + +#foreach($field in ${allFields}) + + AND ${field.name} = #{${field.propertyName}} + +#end + + + + + + diff --git a/src/main/resources/templates/mybatis-plus/${entityName}Service.java.vm b/src/main/resources/templates/mybatis-plus/${entityName}Service.java.vm new file mode 100644 index 0000000000000000000000000000000000000000..28fffb06dd907bf4972d195c9534e72dd73f96aa --- /dev/null +++ b/src/main/resources/templates/mybatis-plus/${entityName}Service.java.vm @@ -0,0 +1,32 @@ +package ${package}; + +import lombok.extern.slf4j.Slf4j; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + *

+ * $!{table.comment} ${entityName} Service + * Add @Transactional(rollbackFor = Exception.class) if you need. + *

+ * + * @author ${author} + * @since ${date} + */ +@Slf4j +@Service +public class ${entityName}Service extends ServiceImpl<${entityName}Mapper, ${entityName}> { + + /** + * Custom paging query + * @param page page + * @param ${entityPropertyName} {@link ${entityName}} + * @return IPage + */ + public IPage<${entityName}> page(IPage<${entityName}> page, ${entityName} ${entityPropertyName}){ + return this.getBaseMapper().page(page, ${entityPropertyName}); + } +} + diff --git a/src/main/resources/templates/mybatis-plus/controller.java.btl b/src/main/resources/templates/mybatis-plus/controller.java.btl deleted file mode 100644 index 5db3f90337ed0fea2d36c86405890ef3448e37cc..0000000000000000000000000000000000000000 --- a/src/main/resources/templates/mybatis-plus/controller.java.btl +++ /dev/null @@ -1,117 +0,0 @@ -package ${parameters.outputPackage}.controller; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; -<% if(entityLombokModel){ %> -import lombok.extern.slf4j.Slf4j; -<% } %> -import javax.validation.Valid; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -<% if(restControllerStyle){ %> -import org.springframework.web.bind.annotation.RestController; -<% }else{ %> -import org.springframework.stereotype.Controller; -<% } %> -<% if(isNotEmpty(superControllerClassPackage)){ %> -import ${superControllerClassPackage}; -<% } %> -import ${parameters.outputPackage}.entity.${entity}; -import ${parameters.outputPackage}.service.${entity}Service; - -/** - *

- * ${table.comment!} Controller - *

- * - * @author ${author} - * @since ${date} - */ -<% if(entityLombokModel){ %> -@Slf4j -<% } %> -@Validated -<% if(restControllerStyle){ %> -@RestController -<% }else{ %> -@Controller -<% } %> -@RequestMapping("<% if(isNotEmpty(package.ModuleName)){ %>/${package.ModuleName}<% } %>/<% if(isNotEmpty(controllerMappingHyphenStyle)){ %>${controllerMappingHyphen}<% }else{ %>${table.entityPath}<% } %>") -public class ${entity}Controller <% if(isNotEmpty(superControllerClass)){ %>extends ${superControllerClass}<% } %> { - - /** - *

- * ${entity}Service - *

- */ - @Autowired - private ${entity}Service ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Service; - - /** - *

- * Get ${entity} page list by ${entity} - *

- * @param page page - * @param ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} - * @return PageDTO<${entity}> - */ - @GetMapping("/page") - public PageDTO<${entity}> page(PageDTO<${entity}> page, ${entity} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}) { - return ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Service.page(page, new QueryWrapper<>(${@cn.hutool.core.util.StrUtil.lowerFirst(entity)})); - } - - /** - *

- * Get ${entity} by id - *

- * @param id id - * @return ${entity} - */ - @GetMapping("/{id}") - public ${entity} getById(@PathVariable("id") ${idField.propertyType} id) { - return ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Service.getById(id); - } - - /** - *

- * Add ${entity} - *

- * @param ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} - */ - @PostMapping - public void add(@Valid @RequestBody ${entity} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}) { - ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Service.save(${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}); - } - - /** - *

- * Update ${entity} - *

- * @param ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} - */ - @PutMapping - public void update(@Valid @RequestBody ${entity} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}) { - ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Service.updateById(${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}); - } - - /** - *

- * Delete ${entity} by id - *

- * @param id id - */ - @DeleteMapping("/{id}") - public void delete(@PathVariable("id") ${idField.propertyType} id) { - ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Service.removeById(id); - } - -} - diff --git a/src/main/resources/templates/mybatis-plus/entity.java.btl b/src/main/resources/templates/mybatis-plus/entity.java.btl deleted file mode 100644 index 407a12fba592742a63b6fa492ec45e28ee96141d..0000000000000000000000000000000000000000 --- a/src/main/resources/templates/mybatis-plus/entity.java.btl +++ /dev/null @@ -1,151 +0,0 @@ -package ${parameters.outputPackage}.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.annotation.TableField; -<% if(hasLongField){ %> -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -<% } %> -<% if(isNotEmpty(superEntityClassPackage)){ %> -import ${superEntityClassPackage}; -<% }else{ %> -import java.io.Serializable; -<% } %> -<% if(entityLombokModel){ %> -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; -<% } %> - -/** - *

- * ${table.comment!} - *

- * - * @author ${author} - * @since ${date} - */ -<% if(entityLombokModel){ %> -@Data - <% if(isNotEmpty(superEntityClass)){ %> -@EqualsAndHashCode(callSuper = true) - <% }else{ %> -@EqualsAndHashCode(callSuper = false) - <% } %> -@Accessors(chain = true) -<% } %> -<% if(table.convert){ %> -@TableName("${table.name}") -<% } %> -<% if(isNotEmpty(superEntityClass)){ %> -public class ${entity} extends ${superEntityClass} { -<% }else{ %> -public class ${entity} implements Serializable { -<% } %> - -<% if(entitySerialVersionUID){ %> - private static final long serialVersionUID = 1L; -<% } %> -<% /** -----------BEGIN 字段循环遍历----------- **/ %> -<% for(field in table.fields){ %> - <% - if(field.keyFlag){ - var keyPropertyName = field.propertyName; - } - %> - - <% if(isNotEmpty(field.comment)){ %> - /** - * ${field.comment} - */ - <% } %> - <% if(field.keyFlag){ %> - <% - /*主键*/ - %> - <% if(field.keyIdentityFlag){ %> - @TableId(value = "${field.name}", type = IdType.AUTO) - <% }else if(isNotEmpty(idType)){ %> - @TableId(value = "${field.name}", type = IdType.${idType}) - <% }else if(field.convert){ %> - @TableId("${field.name}") - <% } %> - <% - /*普通字段*/ - %> - <% }else if(isNotEmpty(field.fill)){ %> - <% if(field.convert){ %> - @TableField(value = "${field.name}", fill = FieldFill.${field.fill}) - <% }else{ %> - @TableField(fill = FieldFill.${field.fill}) - <% } %> - <% }else if(field.convert){ %> - @TableField("${field.name}") - <% } %> - <% - /*乐观锁注解*/ - %> - <% if(versionFieldName!'' == field.name){ %> - @Version - <% } %> - <% - /*逻辑删除注解*/ - %> - <% if(logicDeleteFieldName!'' == field.name){ %> - @TableLogic - <% } %> - <% if('Long' == field.propertyType){ %> - @JsonSerialize(using = ToStringSerializer.class) - <% } %> - private ${field.propertyType} ${field.propertyName}; -<% } %> -<% /** -----------END 字段循环遍历----------- **/ %> - -<% if(!entityLombokModel){ %> - <% for(field in table.fields){ %> - <% - var getprefix =''; - if(field.propertyType=='boolean'){ - getprefix='is'; - }else{ - getprefix='get'; - } - %> - public ${field.propertyType} ${getprefix}${field.capitalName}() { - return ${field.propertyName}; - } - - <% if(entityBuilderModel){ %> - public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) { - <% }else{ %> - public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) { - <% } %> - this.${field.propertyName} = ${field.propertyName}; - <% if(entityBuilderModel){ %> - return this; - <% } %> - } - - <% } %> -<% } %> -<% if(entityColumnConstant){ %> - <% for(field in table.fields){ %> - public static final String ${strutil.toUpperCase(field.name)} = "${field.name}"; - - <% } %> -<% } %> -<% if(!entityLombokModel){ %> - @Override - public String toString() { - return "${entity}{" + - <% for(field in table.fields){ %> - <% if(fieldLP.index==0){ %> - "${field.propertyName}=" + ${field.propertyName} + - <% }else{ %> - ", ${field.propertyName}=" + ${field.propertyName} + - <% } %> - <% } %> - "}"; - } -<% } %> -} diff --git a/src/main/resources/templates/mybatis-plus/mapper.java.btl b/src/main/resources/templates/mybatis-plus/mapper.java.btl deleted file mode 100644 index 903fd2f4072ff0269568d3eef01f257e2e6e584a..0000000000000000000000000000000000000000 --- a/src/main/resources/templates/mybatis-plus/mapper.java.btl +++ /dev/null @@ -1,21 +0,0 @@ -package ${parameters.outputPackage}.mapper; - -import ${parameters.outputPackage}.entity.${entity}; -<% if(isNotEmpty(superMapperClassPackage)){ %> -import ${superMapperClassPackage}; -<% } %> -import org.apache.ibatis.annotations.Mapper; - -/** - *

- * ${table.comment!} Mapper Interface - *

- * - * @author ${author} - * @since ${date} - */ -@Mapper -public interface ${entity}Mapper extends ${superMapperClass}<${entity}> { - -} - diff --git a/src/main/resources/templates/mybatis-plus/mapper.xml.btl b/src/main/resources/templates/mybatis-plus/mapper.xml.btl deleted file mode 100644 index da9a6a5607ec2f644cb23a664ebdbd6ba77e746d..0000000000000000000000000000000000000000 --- a/src/main/resources/templates/mybatis-plus/mapper.xml.btl +++ /dev/null @@ -1,44 +0,0 @@ - - - -<% if(enableCache){ %> - - -<% } %> - -<% if(baseResultMap){ %> - - -<% for(field in table.fields){ %> - <% /** 生成主键排在第一位 **/ %> - <% if(field.keyFlag){ %> - - <% } %> -<% } %> -<% for(field in table.commonFields){ %> - <% /** 生成公共字段 **/ %> - -<% } %> -<% for(field in table.fields){ %> - <% /** 生成普通字段 **/ %> - <% if(!field.keyFlag){ %> - - <% } %> -<% } %> - -<% } %> -<% if(baseColumnList){ %> - - -<% for(field in allFieldList){ %> - <% if(!fieldLP.last){ %> - ${field.name}, - <% } %> - <% if(fieldLP.last){ %> - ${field.name} - <% } %> -<% } %> - - -<% } %> - diff --git a/src/main/resources/templates/mybatis-plus/service.java.btl b/src/main/resources/templates/mybatis-plus/service.java.btl deleted file mode 100644 index bdddfe0d2fe4549e47113aaa37d359157cdc726c..0000000000000000000000000000000000000000 --- a/src/main/resources/templates/mybatis-plus/service.java.btl +++ /dev/null @@ -1,36 +0,0 @@ -package ${parameters.outputPackage}.service; - -<% if(entityLombokModel){ %> -import lombok.extern.slf4j.Slf4j; -<% } %> -import ${parameters.outputPackage}.entity.${entity}; -import ${parameters.outputPackage}.mapper.${entity}Mapper; -import ${superServiceClassPackage}; -import ${superServiceImplClassPackage}; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -/** - *

- * ${table.comment!} implement - * Add @Transactional(rollbackFor = Exception.class) if you need. - *

- * - * @author ${author} - * @since ${date} - */ -<% if(entityLombokModel){ %> -@Slf4j -<% } %> -@Service -public class ${entity}Service extends ${superServiceImplClass}<${entity}Mapper, ${entity}> implements ${superServiceClass}<${entity}> { - - /** - *

- * ${entity}Mapper - *

- */ - @Autowired - private ${entity}Mapper ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Mapper; -} - diff --git a/src/main/resources/templates/mybatis/${entityName}.java.vm b/src/main/resources/templates/mybatis/${entityName}.java.vm new file mode 100644 index 0000000000000000000000000000000000000000..db2a01f5bad7324f331bdf4165eff70062bec444 --- /dev/null +++ b/src/main/resources/templates/mybatis/${entityName}.java.vm @@ -0,0 +1,43 @@ +package ${package}; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +#if("$!{baseEntity}" != "") +import ${baseEntity}; +#else +import java.io.Serializable; +#end + +/** + *

+ * $!{table.comment} + *

+ * + * @author ${author} + * @since ${date} + */ +@Data +#if("$!{baseEntity}" != "") +@EqualsAndHashCode(callSuper = true) +#else +@EqualsAndHashCode(callSuper = false) +#end +@Accessors(chain = true) +#if("$!{baseEntityName}" != "") +public class ${entityName} extends ${baseEntityName} { +#else +public class ${entityName} implements Serializable { + + private static final long serialVersionUID = 1L; +#end +#foreach($field in ${entityFields}) + +#if("$!field.comment" != "") + /** + * ${field.comment} + */ +#end + private ${field.propertyType} ${field.propertyName}; +#end +} diff --git a/src/main/resources/templates/mybatis/${entityName}Controller.java.vm b/src/main/resources/templates/mybatis/${entityName}Controller.java.vm new file mode 100644 index 0000000000000000000000000000000000000000..0f15a2d3f6b1b5c1c49a71c773ea4c58a9a06cf6 --- /dev/null +++ b/src/main/resources/templates/mybatis/${entityName}Controller.java.vm @@ -0,0 +1,98 @@ +package ${package}; + +import com.github.mengweijin.vitality.framework.domain.R; +import jakarta.validation.Valid; +import java.util.Arrays; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestParam; + +/** + *

+ * $!{table.comment} ${entityName} Controller + *

+ * + * @author ${author} + * @since ${date} + */ +@Slf4j +@AllArgsConstructor +@Validated +@RestController +@RequestMapping("${requestMapping}") +public class ${entityName}Controller { + + private ${entityName}Service ${entityPropertyName}Service; + + /** + *

+ * Get ${entityName} list by ${entityName} + *

+ * @param ${entityPropertyName} {@link ${entityName}} + * @return List<${entityName}> + */ + @GetMapping("/list") + public List<${entityName}> list(${entityName} ${entityPropertyName}) { + return ${entityPropertyName}Service.list(${entityPropertyName}); + } + + /** + *

+ * Get ${entityName} by id + *

+ * @param id id + * @return ${entityName} + */ + @GetMapping("/{id}") + public ${entityName} getById(@PathVariable("id") ${idField.columnType.type} id) { + return ${entityPropertyName}Service.getById(id); + } + + /** + *

+ * Add ${entityName} + *

+ * @param ${entityPropertyName} {@link ${entityName}} + */ + @PostMapping + public R add(@Valid @RequestBody ${entityName} ${entityPropertyName}) { + int i = ${entityPropertyName}Service.save(${entityPropertyName}); + return R.ajax(i); + } + + /** + *

+ * Update ${entityName} + *

+ * @param ${entityPropertyName} {@link ${entityName}} + */ + @PutMapping + public R update(@Valid @RequestBody ${entityName} ${entityPropertyName}) { + int i = ${entityPropertyName}Service.updateById(${entityPropertyName}); + return R.ajax(i); + } + + /** + *

+ * Delete ${entityName} by id(s), Multiple ids can be separated by commas ",". + *

+ * @param ids id + */ + @DeleteMapping("/{ids}") + public R delete(@PathVariable("ids") ${idField.columnType.type}[] ids) { + int i = ${entityPropertyName}Service.deleteBatchIds(Arrays.asList(ids)); + return R.ajax(i); + } + +} + diff --git a/src/main/resources/templates/mybatis/${entityName}DTO.java.vm b/src/main/resources/templates/mybatis/${entityName}DTO.java.vm new file mode 100644 index 0000000000000000000000000000000000000000..145c510ff1a6b5db12e44657cb72c6d4a88cc24b --- /dev/null +++ b/src/main/resources/templates/mybatis/${entityName}DTO.java.vm @@ -0,0 +1,25 @@ +package ${package}; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import java.io.Serial; +import java.io.Serializable; + +/** + *

+ * ${entityName} DTO + *

+ * + * @author ${author} + * @since ${date} + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class ${entityName}DTO extends ${entityName} implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + +} diff --git a/src/main/resources/templates/mybatis/${entityName}Mapper.java.vm b/src/main/resources/templates/mybatis/${entityName}Mapper.java.vm new file mode 100644 index 0000000000000000000000000000000000000000..44e626b07aa5ca1ceed1df00f63ec378746fc669 --- /dev/null +++ b/src/main/resources/templates/mybatis/${entityName}Mapper.java.vm @@ -0,0 +1,67 @@ +package ${package}; + +import java.util.List; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * $!{table.comment} ${entityName} Mapper + *

+ * + * @author ${author} + * @since ${date} + */ +@Mapper +public interface ${entityName}Mapper { + + /** + * select ${entityName} by id + * + * @param id id + * @return ${entityName} + */ + ${entityName} getById(${idField.columnType.type} id); + + /** + * select ${entityName} List + * + * @param ${entityPropertyName} {@link ${entityName}} + * @return ${entityName} + */ + List<${entityName}> selectList(${entityName} ${entityPropertyName}); + + /** + * insert ${entityName} + * + * @param ${entityPropertyName} {@link ${entityName}} + * @return int + */ + int save(${entityName} ${entityPropertyName}); + + /** + * update ${entityName} + * + * @param ${entityPropertyName} {@link ${entityName}} + * @return int + */ + int updateById(${entityName} ${entityPropertyName}); + + /** + * delete ${entityName} by id + * + * @param id id + * @return int + */ + int deleteById(${idField.columnType.type} id); + + /** + * delete batch by ids + * + * @param ids ids + * @return int + */ + int deleteBatchIds(List<${idField.columnType.type}> ids); + +} + diff --git a/src/main/resources/templates/mybatis/${entityName}Mapper.xml.vm b/src/main/resources/templates/mybatis/${entityName}Mapper.xml.vm new file mode 100644 index 0000000000000000000000000000000000000000..f24abe6bc5a53c3c6153867a62696af191158daa --- /dev/null +++ b/src/main/resources/templates/mybatis/${entityName}Mapper.xml.vm @@ -0,0 +1,88 @@ + + + + + + +## id +#foreach($field in ${allFields}) + #if(${field.keyFlag}) + + #end +#end +##生成其他字段 +#foreach($field in ${allFields}) + #if(!${field.keyFlag}) + + #end +#end + + + + +#foreach($field in ${allFields}) + ${field.columnName}#if($foreach.hasNext),#end +#end + + + + + +#foreach($field in ${allFields}) + + AND ${field.name} = #{${field.propertyName}} + +#end + + + + + + + + + insert into ${table.name} ( + #foreach($field in ${allFields}) + + ${field.name}#if($foreach.hasNext),#end + + #end + ) VALUES ( + #foreach($field in ${allFields}) + + ${field.propertyName}#if($foreach.hasNext),#end + + #end + ) + + + + UPDATE ${table.name} + + #foreach($field in ${allFields}) + + ${field.name} = #{${field.propertyName}}#if($foreach.hasNext),#end + + #end + + + ${idField.name} = #{${idField.propertyName}} + + + + + DELETE FROM ${table.name} WHERE ${idField.name} = #{${idField.propertyName}} + + + + DELETE FROM ${table.name} WHERE ${idField.columnName} IN + + #{id} + + + + diff --git a/src/main/resources/templates/mybatis/${entityName}Service.java.vm b/src/main/resources/templates/mybatis/${entityName}Service.java.vm new file mode 100644 index 0000000000000000000000000000000000000000..7d74d68d510dfab417eef97c48d8321834133afc --- /dev/null +++ b/src/main/resources/templates/mybatis/${entityName}Service.java.vm @@ -0,0 +1,85 @@ +package ${package}; + +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + *

+ * $!{table.comment} ${entityName} Service + * Add @Transactional(rollbackFor = Exception.class) if you need. + *

+ * + * @author ${author} + * @since ${date} + */ +@Slf4j +@AllArgsConstructor +@Service +public class ${entityName}Service { + + private ${entityName}Mapper ${entityPropertyName}Mapper; + + /** + *

+ * Select ${entityName} by id + *

+ * @param id id + */ + public ${entityName} getById(${idField.columnType.type} id) { + return ${entityPropertyName}Mapper.getById(id); + } + + /** + *

+ * Select List<${entityName}> + *

+ * @param ${entityPropertyName} {@link ${entityName}} + */ + public List<${entityName}> list(${entityName} ${entityPropertyName}) { + return ${entityPropertyName}Mapper.selectList(${entityPropertyName}); + } + + /** + *

+ * Add ${entityName} + *

+ * @param ${entityPropertyName} {@link ${entityName}} + */ + public int save(${entityName} ${entityPropertyName}) { + return ${entityPropertyName}Mapper.save(${entityPropertyName}); + } + + /** + *

+ * Update ${entityName} + *

+ * @param ${entityPropertyName} {@link ${entityName}} + */ + public int updateById(${entityName} ${entityPropertyName}) { + return ${entityPropertyName}Mapper.updateById(${entityPropertyName}); + } + + /** + *

+ * Delete ${entityName} by id + *

+ * @param id id + */ + public int deleteById(${idField.columnType.type} id) { + return ${entityPropertyName}Mapper.deleteById(id); + } + + /** + *

+ * Delete ${entityName} batch by ids + *

+ * @param ids id + */ + public int deleteBatchIds(List<${idField.columnType.type}> ids) { + return ${entityPropertyName}Mapper.deleteBatchIds(ids); + } +} + diff --git a/src/main/resources/templates/mybatis/entity.java.btl b/src/main/resources/templates/mybatis/entity.java.btl deleted file mode 100644 index a91253d3434830ef25b2b985d078bdbc335da3ce..0000000000000000000000000000000000000000 --- a/src/main/resources/templates/mybatis/entity.java.btl +++ /dev/null @@ -1,106 +0,0 @@ -package ${parameters.outputPackage}.entity; - -<% if(hasLongField){ %> -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -<% } %> -<% if(isNotEmpty(superEntityClassPackage)){ %> -import ${superEntityClassPackage}; -<% }else{ %> -import java.io.Serializable; -<% } %> -<% if(entityLombokModel){ %> -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; -<% } %> - -/** - *

- * ${table.comment!} - *

- * - * @author ${author} - * @since ${date} - */ -<% if(entityLombokModel){ %> -@Data - <% if(isNotEmpty(superEntityClass)){ %> -@EqualsAndHashCode(callSuper = true) - <% }else{ %> -@EqualsAndHashCode(callSuper = false) - <% } %> -@Accessors(chain = true) -<% } %> -<% if(isNotEmpty(superEntityClass)){ %> -public class ${entity} extends ${superEntityClass} { -<% }else{ %> -public class ${entity} implements Serializable { -<% } %> - -<% if(entitySerialVersionUID){ %> - private static final long serialVersionUID = 1L; -<% } %> -<% /** -----------BEGIN 字段循环遍历----------- **/ %> -<% for(field in table.fields){ %> - - <% if(isNotEmpty(field.comment)){ %> - /** - * ${field.comment!} - */ - <% } %> - <% if('Long' == field.propertyType){ %> - @JsonSerialize(using = ToStringSerializer.class) - <% } %> - private ${field.propertyType} ${field.propertyName}; -<% } %> -<% /** -----------END 字段循环遍历----------- **/ %> - -<% if(!entityLombokModel){ %> - <% for(field in table.fields){ %> - <% - var getprefix =''; - if(field.propertyType=='boolean'){ - getprefix='is'; - }else{ - getprefix='get'; - } - %> - public ${field.propertyType} ${getprefix}${field.capitalName}() { - return ${field.propertyName}; - } - - <% if(entityBuilderModel){ %> - public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) { - <% }else{ %> - public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) { - <% } %> - this.${field.propertyName} = ${field.propertyName}; - <% if(entityBuilderModel){ %> - return this; - <% } %> - } - - <% } %> -<% } %> -<% if(entityColumnConstant){ %> - <% for(field in table.fields){ %> - public static final String ${strutil.toUpperCase(field.name)} = "${field.name}"; - - <% } %> -<% } %> -<% if(!entityLombokModel){ %> - @Override - public String toString() { - return "${entity}{" + - <% for(field in table.fields){ %> - <% if(fieldLP.index==0){ %> - "${field.propertyName}=" + ${field.propertyName} + - <% }else{ %> - ", ${field.propertyName}=" + ${field.propertyName} + - <% } %> - <% } %> - "}"; - } -<% } %> -} diff --git a/src/main/resources/templates/mybatis/mapper.java.btl b/src/main/resources/templates/mybatis/mapper.java.btl deleted file mode 100644 index dff2ac4a83257973f9ba98528bac9b6db0a4d70b..0000000000000000000000000000000000000000 --- a/src/main/resources/templates/mybatis/mapper.java.btl +++ /dev/null @@ -1,67 +0,0 @@ -package ${parameters.outputPackage}.mapper; - -import ${parameters.outputPackage}.entity.${entity}; -import org.apache.ibatis.annotations.Mapper; -import java.util.List; - -/** - *

- * ${table.comment!} Mapper Interface - *

- * - * @author ${author} - * @since ${date} - */ -@Mapper -public interface ${entity}Mapper { - - /** - * select ${entity} by id - * - * @param id id - * @return ${entity} - */ - ${entity} getById(${idField.propertyType} id); - - /** - * select ${entity} List - * - * @param ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} - * @return ${entity} - */ - List<${entity}> selectList(${entity} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}); - - /** - * insert ${entity} - * - * @param ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} - * @return int - */ - int save(${entity} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}); - - /** - * update ${entity} - * - * @param ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} - * @return int - */ - int updateById(${entity} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}); - - /** - * delete ${entity} by id - * - * @param id id - * @return int - */ - int removeById(${idField.propertyType} id); - - /** - * delete batch by ids - * - * @param ids ids - * @return int - */ - int deleteBatchByIds(${idField.propertyType}[] ids); - -} - diff --git a/src/main/resources/templates/mybatis/mapper.xml.btl b/src/main/resources/templates/mybatis/mapper.xml.btl deleted file mode 100644 index 908bcb64affc4f912efa14e0a71a6b079e19cf60..0000000000000000000000000000000000000000 --- a/src/main/resources/templates/mybatis/mapper.xml.btl +++ /dev/null @@ -1,116 +0,0 @@ - - - - -<% if(enableCache){ %> - - - -<% } %> -<% if(baseResultMap){ %> - - -<% for(field in table.fields){ %> - <% /** 生成主键排在第一位 **/ %> - <% if(field.keyFlag){ %> - - <% } %> -<% } %> -<% for(field in table.commonFields){ %> - <% /** 生成公共字段 **/ %> - -<% } %> -<% for(field in table.fields){ %> - <% /** 生成普通字段 **/ %> - <% if(!field.keyFlag){ %> - - <% } %> -<% } %> - -<% } %> -<% if(baseColumnList){ %> - - -<% for(field in allFieldList){ %> - <% if(!fieldLP.last){ %> - ${field.name}, - <% } %> - <% if(fieldLP.last){ %> - ${field.name} - <% } %> -<% } %> - - - - - - <% for(field in allFieldList){ %> - and ${field.propertyName} != ''<%}%>"> - and ${field.name} = #{${field.propertyName}} - - <% } %> - - - -<% } %> - - - - - - insert into ${table.name} ( - <% for(field in allFieldList){ %> - and ${field.propertyName} != ''<%}%>"> - ${field.name}<% if(!fieldLP.last){ %>,<%}%> - - <% } %> - )values( - <% for(field in allFieldList){ %> - and ${field.propertyName} != ''<%}%>"> - #{${field.propertyName}}<% if(!fieldLP.last){ %>,<%}%> - - <% } %> - ) - - - - update ${table.name} - - <% for(field in allFieldList){ %> - and ${field.propertyName} != ''<%}%>"> - ${field.name} = #{${field.propertyName}}<% if(!fieldLP.last){ %>,<%}%> - - <% } %> - - - ${idField.columnName} = #{${idField.propertyName}} - - - - - delete from ${table.name} - - ${idField.columnName} = #{${idField.propertyName}} - - - - - delete from ${table.name} where ${idField.columnName} in - - #{itemId} - - - - diff --git a/src/main/resources/templates/mybatis/service.java.btl b/src/main/resources/templates/mybatis/service.java.btl deleted file mode 100644 index d74b1f71f4cebf9ea470bd9bdbcdcdee0b8015c3..0000000000000000000000000000000000000000 --- a/src/main/resources/templates/mybatis/service.java.btl +++ /dev/null @@ -1,102 +0,0 @@ -package ${parameters.outputPackage}.service; - -<% if(entityLombokModel){ %> -import lombok.extern.slf4j.Slf4j; -<% } %> -import ${parameters.outputPackage}.entity.${entity}; -import ${parameters.outputPackage}.mapper.${entity}Mapper; -<% if(isNotEmpty(superServiceClassPackage)){ %> -import ${superServiceClassPackage}; -<% } %> -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import java.util.List; - -/** - *

- * ${entity} Service implement - * Add @Transactional(rollbackFor = Exception.class) if you need. - *

- * - * @author ${author} - * @since ${date} - */ -<% if(entityLombokModel){ %> -@Slf4j -<% } %> -@Service -public class ${entity}Service <% if(isNotEmpty(superServiceClass)){ %>implements ${superServiceClass}<% } %> { - - /** - *

- * ${entity}Mapper - *

- */ - @Autowired - private ${entity}Mapper ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Mapper; - - /** - *

- * Select ${entity} by id - *

- * @param id id - */ - <% if(isNotEmpty(superServiceClass)){ %> - @Override - <% } %> - public ${entity} getById(${idField.propertyType} id) { - return ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Mapper.getById(id); - } - - /** - *

- * Select List<${entity}> - *

- * @param ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} - */ - <% if(isNotEmpty(superServiceClass)){ %> - @Override - <% } %> - public List<${entity}> list(${entity} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}) { - return ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Mapper.selectList(${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}); - } - - /** - *

- * Add ${entity} - *

- * @param ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} - */ - <% if(isNotEmpty(superServiceClass)){ %> - @Override - <% } %> - public void save(${entity} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}) { - ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Mapper.save(${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}); - } - - /** - *

- * Update ${entity} - *

- * @param ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)} - */ - <% if(isNotEmpty(superServiceClass)){ %> - @Override - <% } %> - public void updateById(${entity} ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}) { - ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Mapper.updateById(${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}); - } - - /** - *

- * Delete ${entity} by id - *

- * @param id id - */ - <% if(isNotEmpty(superServiceClass)){ %> - @Override - <% } %> - public void removeById(${idField.propertyType} id) { - ${@cn.hutool.core.util.StrUtil.lowerFirst(entity)}Mapper.removeById(id); - } -} diff --git a/src/test/java/com/github/mengweijin/generator/mojo/DockerDeployMojoTest.java b/src/test/java/com/github/mengweijin/generator/mojo/DockerDeployMojoTest.java index ba284bca485cc411898c6104cfa4c6942197d599..262ce56c2c5e6d6b6a060eaf3da5e7df43f02ffc 100644 --- a/src/test/java/com/github/mengweijin/generator/mojo/DockerDeployMojoTest.java +++ b/src/test/java/com/github/mengweijin/generator/mojo/DockerDeployMojoTest.java @@ -1,8 +1,8 @@ package com.github.mengweijin.generator.mojo; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.util.RuntimeUtil; -import cn.hutool.core.util.StrUtil; +import org.dromara.hutool.core.io.file.FileUtil; +import org.dromara.hutool.core.text.StrUtil; +import org.dromara.hutool.core.util.RuntimeUtil; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test;