详解Java Web模板代码生成器的设计与实现
起因
项目中需要根据数据库表写很多Meta、Dao、Service代码,其中很多代码都是重复而繁琐的。因此如果有一个模板代码的生成器,就可以一定程度提高开发效率。
目标
可配置生成Java Web项目中Dao、Meta、Service层模板代码的生成器。
代码框架
mvn archetype:generate -DgroupId=com.zju -DartifactId=JavaWebCodeGenerator -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false -DarchetypeCatalog=internal
设计思路
项目参考Mybatis generator生成代码的过程,具体步骤分为以下5步。
逻辑步骤
解析命令行
解析配置文件
获取数据表信息
生成配置信息
生成文件
代码设计
命令解析类 ShellRunner
该类负责解析命令行的命令,解析配置文件并封装所需的数据给代码生成类。
可解析命令有-config<a href="http://www.php.cn/wiki/1313.html" target="_blank">file</a>
:指定配置文件所在路径和-overwrite
:是否重写目标文件。
配置文件的配置项有:
//Java SQL 驱动所在路径(暂未使用) private static final String CLASS_PATH_ENTRY = "class.path.entry"; //Java 驱动类型(暂未使用) private static final String DRIVER_CLASS = "driver.class"; //数据库地址 private static final String CONNECTION_URL = "connection.url"; //数据库用户名 private static final String USER_ID = "user.id"; //数据库密码 private static final String USER_PASSWORD = "user.password"; //模型生成地址 private static final String JAVA_MODEL_PACKAGE = "java.model.package"; //SQL生成地址 private static final String SQL_MAPPING_PACKAGE = "sql.mapping.package"; //项目地址 private static final String PROJECT = "project"; //数据表名 private static final String TABLE_NAME = "table.name"; //模型名称 private static final String DOMAIN_OBJECT_NAME = "domain.object.name";
代码生成类 CodeGenerator
该类负责连接数据库,查询数据表的表信息,将SQL类型映射成Java类型并封装所需的数据给文件生成类。
Class.forName(configuration.getDriverClass()); //获取数据库连接 Connection connection = DriverManager.getConnection(configuration.getConnectionURL(), configuration.getUserId(), configuration.getPassword()); DatabaseMetaData databaseMetaData = connection.getMetaData(); //获取表结构信息 ResultSet rs = databaseMetaData.getColumns("", "", configuration.getTableName(), "%");
通过以上几行代码,rs变量中已经获得目标数据表的表信息。
databaseMetaData.getColumns
方法的实质是执行了SELECT * FROM information_schema.COLUMNS WHERE TABLE_NAME="tableName"
语句。
在结果集中,后续处理大致需要以下表信息列。
字段 | 描述 |
---|---|
DATA_TYPE | 数据类型 |
COLUMN_SIZE | 数据长度 |
COLUMN_NANE | 列名 |
NULLABLE | 是否允许非空 |
DECIMAL_DIGITS | 小数位数 |
REMARKS | 备注 |
COLUMN_DEF | 默认值 |
最后通过JavaTypeResolver
中的类型映射(Map<Integer, JdbcTypeInformation> typeMap
)和StringUtils
中的驼峰命名转换(getCamelCaseString
)将SQL信息转换成Java信息。
文件生成类 FileGenerator
该类通过FreeMarker模板引擎组合数据成目标代码文件。
主逻辑如下:
/** * @param configuration 封装的配置信息 * @param columns 封装的数据表列信息 * @throws IOException * @throws TemplateException */ public static void writeFile(Configuration configuration, List<TableColumn> columns) throws IOException, TemplateException { File r=new File(""); //测试环境获取项目根目录路径 //String path=Class.class.getClass().getResource("/").getPath(); //Jar包获取根目录路径 String path=r.getAbsolutePath(); //System.out.println("path:"+path); Configuration cfg = new Configuration(); cfg.setDirectoryForTemplateLoading(new File(path + "/ftl")); //需要文件夹绝对路径 cfg.setDefaultEncoding("UTF-8"); cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); Map root = new HashMap(); root.put("configuration", configuration); root.put("columnList", columns); writeSingleFile(cfg, root, "DaoImpl.ftl", configuration.getProjectPath(), configuration.getSqlMappingPackage().replace(".", "/"), configuration.getDomainObjectName(), "DaoImpl.java",configuration.getOverwrite()); writeSingleFile(cfg, root, "Dao.ftl", configuration.getProjectPath(), configuration.getSqlMappingPackage().replace(".", "/"), configuration.getDomainObjectName(), "Dao.java",configuration.getOverwrite()); writeSingleFile(cfg, root, "Meta.ftl", configuration.getProjectPath(), configuration.getJavaModelPackage().replace(".", "/"), configuration.getDomainObjectName(), ".java",configuration.getOverwrite()); }
注意
在测试中,Class.class.getClass().getResource("/").getPath();
该方法可以获取项目根目录,但是在测试生成的Jar包时,该方法时效。因此在生成Jar包前需要把该行修改成new File("").getAbsolutePath();
获取生成路径。
项目结构
配置文件范例
generatorConfig.properties
class.path.entry=src/test/resources/mysql-connector-java-5.1.38.jar driver.class=com.mysql.jdbc.Driver connection.url=jdbc:mysql://localhost:3307/work user.id= user.password= java.model.package=com.model sql.mapping.package=com.dao project=src table.name=holiday domain.object.name=Holiday
运行命令范例
java -jar JavaWebCodeGenerator.jar -configfile generatorConfig.properties -overwrite
实例演示
Atas ialah kandungan terperinci 详解Java Web模板代码生成器的设计与实现. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Selepas ujian sebenar, penjana foto AI ID berfungsi dengan baik dan fungsinya yang hebat sangat menakjubkan. Anda tidak perlu risau lagi untuk mengambil gambar! Ayat ini ditulis semula seperti berikut: Gunakan perisian Chuzhan AI (hak cipta dan tafsiran kepunyaan Chuzhan AI dan hanya digunakan untuk menunjukkan kesan yang dijana) mod lakaran: Sama ada dalam situasi kerja harian atau pejabat perniagaan, imej profesional adalah penting . Foto ID yang cantik boleh meningkatkan imej profesional seseorang. Foto ID yang dijana melalui AI bukan sahaja memenuhi standard foto tradisional, tetapi juga boleh memulihkan ciri wajah unik seseorang. Teknologi AI boleh mengenal pasti kontur muka, warna kulit, pencahayaan dan butiran lain secara bijak untuk menghasilkan foto ID yang paling sesuai. Sama ada rupa atau perangai, ia boleh dipaparkan dengan sempurna dan meninggalkan kesan pertama yang mendalam kepada orang ramai AI menjana foto ID dengan satu klik.

Bagaimana untuk menulis penjana laporan prestasi pelajar yang mudah menggunakan Java? Penjana Laporan Prestasi Pelajar ialah alat yang membantu guru atau pendidik menjana laporan prestasi pelajar dengan cepat. Artikel ini akan memperkenalkan cara menggunakan Java untuk menulis penjana laporan prestasi pelajar yang mudah. Pertama, kita perlu menentukan objek pelajar dan objek gred pelajar. Objek pelajar mengandungi maklumat asas seperti nama pelajar dan nombor pelajar, manakala objek skor pelajar mengandungi maklumat seperti skor mata pelajaran pelajar dan gred purata. Berikut ialah definisi objek pelajar mudah: awam

Jika anda tidak sabar-sabar untuk mencari penjana seni animasi AI percuma teratas, anda boleh menamatkan carian anda. Dunia seni anime telah menawan penonton selama beberapa dekad dengan reka bentuk watak yang unik, warna yang menawan dan plot yang menawan. Walau bagaimanapun, mencipta seni anime memerlukan bakat, kemahiran, dan banyak masa. Walau bagaimanapun, dengan pembangunan kecerdasan buatan (AI) yang berterusan, anda kini boleh meneroka dunia seni animasi tanpa perlu mendalami teknologi yang kompleks dengan bantuan penjana seni animasi AI percuma yang terbaik. Ini akan membuka kemungkinan baharu untuk anda melancarkan kreativiti anda. Apakah penjana seni anime AI? Penjana Seni Animasi AI menggunakan algoritma canggih dan teknik pembelajaran mesin untuk menganalisis pangkalan data karya animasi yang luas. Melalui algoritma ini, sistem mempelajari dan mengenal pasti gaya animasi yang berbeza

Penjana dalam PHP7: Bagaimana untuk mengendalikan data berskala besar dengan cekap dan menjimatkan memori? Gambaran Keseluruhan: PHP7 memperkenalkan penjana sebagai alat yang berkuasa dari segi pemprosesan data berskala besar dan penjimatan memori. Penjana ialah jenis fungsi khas dalam bahasa PHP Tidak seperti fungsi biasa, penjana boleh menjeda pelaksanaan dan mengembalikan hasil perantaraan dan bukannya mengembalikan semua hasil sekaligus. Ini menjadikan penjana ideal untuk memproses kumpulan data yang besar, mengurangkan penggunaan memori dan meningkatkan kecekapan pemprosesan. Artikel ini akan memperkenalkan pelajar

Cara menulis penjana kod QR mudah melalui kod QR PHP telah menjadi sangat biasa dalam masyarakat moden Mereka boleh menghantar maklumat dengan cepat dan meningkatkan pengalaman pengguna. Dalam artikel ini, saya akan memperkenalkan anda kepada cara menulis penjana kod QR mudah menggunakan PHP. 1. Pasang alatan dan perpustakaan yang diperlukan Sebelum memulakan, kita perlu memastikan bahawa alatan dan perpustakaan berikut telah dipasang: PHP: Pastikan versi terkini PHP dipasang Anda boleh menyemak versi PHP semasa dengan menjalankan php -v arahan. Komposer: C

Konsep penjana (Generator) telah diperkenalkan dalam PHP7, yang menyediakan kaedah untuk mengendalikan sejumlah besar data dan pemuatan malas dengan cekap. Artikel ini akan bermula dengan konsep dan prinsip, digabungkan dengan contoh kod khusus, untuk memperkenalkan penggunaan dan kelebihan penjana dalam PHP7. Penjana ialah fungsi khas yang, bukannya memulangkan semua data sekaligus, menjana data atas permintaan. Apabila fungsi melaksanakan pernyataan hasil, nilai yang dihasilkan pada masa ini akan dikembalikan dan keadaan fungsi akan disimpan. Apabila fungsi penjana dipanggil seterusnya, fungsi itu akan

Selepas ChatGPT boleh disambungkan ke Internet, OpenAI juga dengan pantas memperkenalkan penjana kod Dengan sokongan pemalam ini, ChatGPT malah boleh menjana model pembelajaran mesinnya sendiri. Jumaat lalu, OpenAI baru sahaja mengumumkan berita mengejutkan bahawa ChatGPT boleh menyambung ke Internet dan menyambung ke pemalam pihak ketiga! Sebagai tambahan kepada pemalam pihak ketiga, OpenAI juga memperkenalkan "Pentafsir Kod" pemalamnya sendiri dan memberikan beberapa kes penggunaan khas: menyelesaikan masalah matematik kuantitatif dan kualitatif melakukan analisis dan visualisasi data dan menukar format fail dengan cepat; Di samping itu, Greg Brockman menunjukkan bahawa ChatGPT juga boleh memproses fail video yang dimuat naik. Dan pengarang terlaris bernama Andrew Mayne

Apakah perbezaan antara iterator dan penjana dalam Python? Dalam pengaturcaraan Python, iterator dan penjana ialah alat yang digunakan untuk memproses objek boleh lelaran. Kedua-duanya boleh digunakan untuk melintasi data, tetapi terdapat beberapa perbezaan dalam pelaksanaan. Iterator ialah objek yang melaksanakan protokol iterator. Objek iterator perlu mengandungi dua kaedah: __iter__() dan __next__(). Itu
