実際のソフトウェア プロジェクト開発プロセスにおいて、5 年以上実際にコードを書いていれば、責任を持って言えます。追加、削除、変更、検索などの単純な機能要件の開発は完全にやり尽くしたと言えますが、少なくとも私はこのタイプです。
しかし、ソフトウェア機能の大部分は、最も基本的なユニットに至るまで、基本的には 1 つのテーブルの追加、削除、変更、クエリであることは否定できません。
ユーザーのニーズが増え続けるにつれて、以前は 1 つのテーブルで実行できた作業が、現在では複数のテーブルまたは複数のライブラリを必要とする可能性があるというだけです。コード層はブロックを積み上げるようなもので、コード層が増えれば増えるほど、積み重ねると、より複雑になります。
初期のプロジェクトに取り組んでいたとき、プロジェクトに 1 つのテーブルを追加するたびに、コード レベルで CURD## のセットを次のように書き直す必要があったことを思い出します。
MVC フレームワークのアイデアを使用すると、基本的な追加、削除、変更、チェックをすべて書くのに少なくとも 20 分かかります。早い人であれば、次の手順で 10 分かかります。最速。
CURD コードをすべて標準化して公開する方法はありますか?このようにして、ビジネス シナリオの開発に投資する時間を大幅に節約できます。
MybatisGenertor ツールキットだったことを覚えています。このツールキットを通じて、
xml# の大部分を ## に保存できます。 #mybaits ##ファイル
カード 執筆作業。
また、おなじみの
JPA
SQL ステートメントを自動的に生成できます。開発時間を節約できます。多くのことが起こります。
でも、私は怠け者なので、
controller
service、
entity 、
dao## からツールを構築したいと考えています。 #Layer、単体テスト クラスを含むすべての crud
コードはツールによって自動的に生成されます。 現在、インターネット上にはこのようなツールがたくさんあります。たとえば、私たちがよく知っている
Mybatis-plus
プラグインなど、これを行うことができ、非常に使いやすいです。
しかし、一部の企業はこれを好まないのですが、その理由は非常に単純です。その中の多くのパブリック メソッドが深くカプセル化されすぎており、多くの crud
はすべて動的に生成されるため、まったく見えません。 要するに、それは自分のコントロールの範囲内ではありません。多くのプログラマは常にさまざまな疑問を抱いています~~
もちろん、マイクロサービスについても明らかな疑問があります。開発を完全にサポートすることはできません。たとえば、プロジェクトが
の組み合わせを使用して開発されている場合、この時点で生成される
controller はまったく役に立たず、無味です。 したがって、この場合、迅速な開発のニーズを満たすために、現在のプロジェクトのソフトウェア開発ルールに基づいて独自のコード ジェネレーターを開発する必要があります。
ここで、コードジェネレーターを自分で開発する方法を簡単に紹介します。
2. コードの実践
実際、コード ジェネレーターの開発は、誰もが考えているほど複雑ではありません。その中で使用される最も重要なテクノロジは、テンプレートを使用してコード
を生成することです。私たちがよく使用するテンプレート エンジン2.1. まず、freemarker 依存関係パッケージ
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version> </dependency>
2.2 を追加し、コード テンプレートを作成します
例としてエンティティ クラスを動的に作成して、エンティティ クラスのテンプレート。package ${package}; import java.io.Serializable; /** * <p> * ${tableComment} * </p> * * @author ${author} * @since ${date} */ public class ${entityClass} implements Serializable { private static final long serialVersionUID = 1L; <#--属性遍历--> <#list columns as pro> /** * ${pro.comment} */ private ${pro.propertyType} ${pro.propertyName}; </#list> <#--属性get||set方法--> <#list columns as pro> public ${pro.propertyType} get${pro.propertyName?cap_first}() { return this.${pro.propertyName}; } public ${entityClass} set${pro.propertyName?cap_first}(${pro.propertyType} ${pro.propertyName}) { this.${pro.propertyName} = ${pro.propertyName}; return this; } </#list> }
2.3. 最後にターゲット コードを生成します
最後に、
freemarker に基づいてテスト クラスを作成します。 public class CodeGeneratorDemo { public static void main(String[] args) throws IOException, TemplateException { Map<String, Object> objectMap = new HashMap<>(); //定义包路径 objectMap.put("package", "com.example.test"); //定义实体类 objectMap.put("entityClass", "Student"); //定义实体类属性 List<Map<String, Object>> columns = new ArrayList<>(); //姓名字段 Map<String, Object> column1 = new HashMap<>(); column1.put("propertyType", "String"); column1.put("propertyName", "name"); column1.put("comment", "姓名"); columns.add(column1); //年龄字段 Map<String, Object> column2 = new HashMap<>(); column2.put("propertyType", "Integer"); column2.put("propertyName", "age"); column2.put("comment", "年龄"); columns.add(column2); //定义类的属性 objectMap.put("columns", columns); //定义作者 objectMap.put("author", "张三"); //定义创建时间 objectMap.put("date", new SimpleDateFormat("yyyy-MM-dd").format(new Date())); //定义类描述 objectMap.put("tableComment", "学生信息"); //生产目标代码 Configuration configuration = new Configuration(Configuration.VERSION_2_3_23); configuration.setDefaultEncoding(Charset.forName("UTF-8").name()); configuration.setClassForTemplateLoading(CodeGeneratorDemo.class, "/"); Template template = configuration.getTemplate("/templates/entity.java.ftl"); FileOutputStream fileOutputStream = new FileOutputStream(new File("../src/main/java/com/example/generator/Student.java")); template.process(objectMap, new OutputStreamWriter(fileOutputStream, Charset.forName("UTF-8").name())); fileOutputStream.close(); System.out.println("文件创建成功"); } }
package com.example.test; import java.io.Serializable; /** * <p> * 学生信息 * </p> * * @author 张三 * @since 2021-08-22 */ public class Student implements Serializable { private static final long serialVersionUID = 1L; /** * 姓名 */ private String name; /** * 年龄 */ private Integer age; public String getName() { return this.name; } public Student setName(String name) { this.name = name; return this; } public Integer getAge() { return this.age; } public Student setAge(Integer age) { this.age = age; return this; } }
期待された効果と一致し、正常に生成されました。
例として私はこの方法を使っていますが、まずツールで生成するコードをすべてテンプレートで定義します。
次に、データベースに接続して、自動的に生成する必要があるテーブル構造をクエリし、それをデータ レンダリング パラメーターにカプセル化して、最後に
freemarker# に渡します。 ## 必要なコードを生成するのは非常に簡単かつ迅速で、単一テーブルのcrud はすべて 1 ステップで完了します。
以下は、現在のプロジェクトに基づいてエディターによってカスタマイズおよび開発されたコード ジェネレーターです。プロジェクトは、SpringBoot Dubbo
フレームワークを使用して開発されています。Controller
はありません。すべてのコードはコード ジェネレーターを使用して生成され、単体テストを通じて直接実行できます。開発は非常に高速です。
以上がSpringBoot が FreeMarker を統合してコード ジェネレーターを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。