在 java 项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作。幸运的是,java 领域有许多代码生成工具可以帮助我们快速完成这一任务,大大提高开发效率。
一、代码生成工具概述
常用 java 代码生成工具简介
1.mybatis generator
mybatis generator 是专为 mybatis 框架设计的代码生成工具。它可以根据数据库表结构自动生成对应的 mapper 接口、xml 映射文件、实体类等代码。例如,当我们有一个 “users” 表,包含 “id”“name”“age” 等字段,使用 mybatis generator 可以快速生成 user 实体类,其中包含这些字段以及对应的 getter 和 setter 方法;同时生成 usermapper 接口,里面会有诸如 insert、delete、update、select 等基本的数据库操作方法声明,以及对应的 usermapper.xml 文件,用于书写 mybatis 的映射 sql 语句。
2.spring initializr
spring initializr 是 spring 官方提供的一个在线项目初始化工具。它可以帮助开发者快速生成基于 spring boot 的项目骨架。我们只需要在网页上选择项目的基本信息,如项目名称、版本、依赖(如 spring web、spring data jpa 等),然后点击生成按钮,就会下载一个完整的项目目录结构,里面包含了构建文件(如 maven 的 pom.xml 或 gradle 的 build.gradle)、基础的配置文件(application.properties)、主程序入口类等。
3.freemarker(作为代码生成模板引擎)
freemarker 是一个基于模板的生成代码工具。它本身不是专门为 java 代码生成设计的,但可以结合 java 程序灵活地用于代码生成场景。例如,我们可以定义一套代码模板,如 java 服务类的模板,规定好类的结构、方法的格式等。然后通过 java 程序读取数据库表信息或其他元数据,将这些数据填充到 freemarker 模板中,就可以生成对应的 java 代码文件,如根据表字段生成实体类的字段以及相关的操作方法。
代码生成工具的优势
1.提高开发效率
减少了手动编写重复、模式化代码的工作量。例如,对于数据库持久层代码,像实体类、mapper 接口等,通过代码生成工具可以瞬间生成,而手动编写这些代码可能需要花费较多时间和精力,并且容易出错。
2.保证代码一致性
按照统一的模板生成代码,可以确保代码风格、结构和命名规范的一致性。这对于团队开发来说尤为重要,有助于提高代码的可读性和可维护性。
二、使用 mybatis generator 构建项目骨架
搭建 mybatis generator 环境
1.添加依赖
如果我们使用 maven 构建项目,在项目的 pom.xml 文件中添加 mybatis generator 的依赖:
<dependency> <groupid>org.mybatis.generator</groupid> <artifactid>mybatis-generator-core</artifactid> <version>1.4.1</version> </dependency>
2.配置 mybatis generator 配置文件
创建一个 generatorconfig.xml 文件,用于配置数据库连接信息、代码生成的目标位置、模板等。示例配置如下:
<?xml version="1.0" encoding="utf-8"?> <!doctype generatorconfiguration public "-//mybatis.org//dtd mybatis generator configuration 1.0//en" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorconfiguration> <!-- 数据库连接信息 --> <context id="db2tables" targetruntime="mybatis3simple"> <jdbcconnection driverclass="com.mysql.cj.jdbc.driver" connectionurl="jdbc:mysql://localhost:3306/your_database" userid="root" password="password"> </jdbcconnection> <!-- 生成的实体类等代码的目标位置 --> <javamodelgenerator targetpackage="com.example.entity" targetproject="src/main/java"> </javamodelgenerator> <sqlmapgenerator targetpackage="mapper" targetproject="src/main/resources"> </sqlmapgenerator> <javaclientgenerator type="xmlmapper" targetpackage="com.example.mapper" targetproject="src/main/java"> </javaclientgenerator> <!-- 指定要生成代码的数据库表 --> <table tablename="users" domainobjectname="user" enablecountbyexample="false" enableupdatebyexample="false" enabledeletebyexample="false" enableselectbyexample="false" selectbyexamplequeryid="false"> </table> </context> </generatorconfiguration>
运行 mybatis generator 生成代码
1.编写运行代码的 java 程序
创建一个 java 类,使用 mybatis generator 的 api 加载配置文件并生成代码:
import org.mybatis.generator.api.mybatisgenerator; import org.mybatis.generator.config.configuration; import org.mybatis.generator.config.xml.configurationparser; import org.mybatis.generator.internal.defaultshellcallback; import java.io.file; import java.util.arraylist; import java.util.list; public class generator { public static void main(string[] args) { list<string> warnings = new arraylist<>(); boolean overwrite = true; file configfile = new file("generatorconfig.xml"); configurationparser cp = new configurationparser(warnings); configuration config = null; try { config = cp.parseconfiguration(configfile); defaultshellcallback callback = new defaultshellcallback(overwrite); mybatisgenerator mybatisgenerator = new mybatisgenerator(config, callback, warnings); mybatisgenerator.generate(null); } catch (exception e) { e.printstacktrace(); } for (string warning : warnings) { system.out.println(warning); } } }
2.查看生成的代码
运行上述 java 程序后,在指定的目标位置会自动生成 user 实体类、usermapper 接口和 usermapper.xml 文件。例如,user 实体类代码如下:
public class user { private integer id; private string name; private integer age; // getter 和 setter 方法 public integer getid() { return id; } public void setid(integer id) { this.id = id; } public string getname() { return name; } public void setname(string name) { this.name = name; } public integer getage() { return age; } public void setage(integer age) { this.age = age; } }
三、使用 spring initializr 构建项目骨架
在 spring initializr 网页端操作
1.访问 spring initializr 网址
打开浏览器,访问https://start.spring.io/。
2.填写项目基本信息
在页面上填写项目的基本信息,如 group(项目的 maven groupid)、artifact(项目的 maven artifactid,通常为项目名称)、version(项目版本)、project metadata(项目元数据,如名称、描述等)。
选择项目使用的构建工具,如 maven 或 gradle,以及 java 版本。
3.添加依赖
点击 “dependencies” 下拉菜单,选择所需的依赖。例如,如果我们是要构建一个 web 应用,就选择 “spring web”;如果是需要操作关系型数据库,就添加 “spring data jpa” 以及对应的数据库驱动依赖(如 “mysql driver”)。
4.生成项目
点击 “generate” 按钮后,网站会生成一个压缩包。下载并解压后,我们就可以得到一个完整的 spring boot 项目骨架。
查看生成的项目结构
1.构建文件
对于 maven 项目,生成的 pom.xml 文件包含了所有选定的依赖。例如,添加了 spring web 和 spring data jpa 以及 mysql driver 依赖后的 pom.xml 部分内容如下:
<?xml version="1.0" encoding="utf-8"?> <project xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://maven.apache.org/pom/4.0.0 https://maven.apache.org/xsd/maven -4.0.0.xsd"> <modelversion>4.0.0</modelversion> <parent> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-parent</artifactid> <version>3.1.4</version> <relativepath/> <!-- lookup parent from repository --> </parent> <groupid>com.example</groupid> <artifactid>demo</artifactid> <version>0.0.1-snapshot</version> <name>demo</name> <description>demo project for spring boot</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-data-jpa</artifactid> </dependency> <dependency> <groupid>mysql</groupid> <artifactid>mysql-connector-java</artifactid> <scope>runtime</scope> </dependency> </dependencies> </project>
2.主程序入口类
生成的主程序入口类非常简单,包含一个 main 方法,通过 spring boot 的 springapplication.run() 方法启动应用。示例代码如下:
import org.springframework.boot.springapplication; import org.springframework.boot.autoconfigure.springbootapplication; @springbootapplication public class demoapplication { public static void main(string[] args) { springapplication.run(demoapplication.class, args); } }
四、使用 freemarker 构建项目骨架
引入 freemarker 依赖
maven 依赖配置
在项目的 pom.xml 文件中添加 freemarker 的依赖:
<dependency> <groupid>org.freemarker</groupid> <artifactid>freemarker</artifactid> <version>2.3.32</version> </dependency>
创建代码生成模板
定义实体类模板(entity.ftl)
例如,以下是一个简单的实体类模板,用于根据表字段生成 java 实体类代码:
package ${package}.entity; public class ${classname} { <#list table.columns as column> // ${column.comments} private ${column.javatype} ${column.javafield}; public ${column.javatype} get${column.javacap}() { return this.${column.javafield}; } public void set${column.javacap}(${column.javatype} ${column.javafield}) { this.${column.javafield} = ${column.javafield}; } </#list> }
结合 java 程序生成代码
1.读取数据库表信息
编写 java 程序,通过 jdbc 或其他数据库访问方式读取数据库表的元数据,包括表名、字段名、字段类型、字段注释等信息。然后将这些信息封装成一个数据模型,用于填充到 freemarker 模板中。
.2使用 freemarker 生成代码
示例代码如下:
import freemarker.template.configuration; import freemarker.template.template; import freemarker.template.templateexception; import java.io.filewriter; import java.io.ioexception; import java.io.writer; import java.util.hashmap; import java.util.map; public class codegenerator { public static void main(string[] args) { // 配置 freemarker configuration cfg = new configuration(configuration.version_2_3_32); try { // 设置模板文件所在的目录 cfg.setdirectoryfortemplateloading(new file("templates")); // 加载模板 template template = cfg.gettemplate("entity.ftl"); // 创建数据模型 map<string, object> datamodel = new hashmap<>(); datamodel.put("package", "com.example"); datamodel.put("classname", "user"); datamodel.put("table", gettableinfo()); // 输出代码 writer out = new filewriter(new file("src/main/java/com/example/entity/user.java")); template.process(datamodel, out); out.close(); } catch (ioexception | templateexception e) { e.printstacktrace(); } } // 模拟获取表信息的方法 public static table gettableinfo() { table table = new table(); table.setname("users"); // 添加字段信息 column column1 = new column(); column1.setname("id"); column1.setjavatype("integer"); column1.setjavafield("id"); column1.setjavacap("id"); column1.setcomments("用户 id"); column column2 = new column(); column2.setname("name"); column2.setjavatype("string"); column2.setjavafield("name"); column2.setjavacap("name"); column2.setcomments("用户名字"); column column3 = new column(); column3.setname("age"); column3.setjavatype("integer"); column3.setjavafield("age"); column3.setjavacap("age"); column3.setcomments("用户年龄"); table.setcolumns(new column[]{column1, column2, column3}); return table; } // table 类用于封装表信息 public static class table { private string name; private column[] columns; // getter 和 setter 方法 public string getname() { return name; } public void setname(string name) { this.name = name; } public column[] getcolumns() { return columns; } public void setcolumns(column[] columns) { this.columns = columns; } } // column 类用于封装字段信息 public static class column { private string name; private string javatype; private string javafield; private string javacap; private string comments; // getter 和 setter 方法 public string getname() { return name; } public void setname(string name) { this.name = name; } public string getjavatype() { return javatype; } public void setjavatype(string javatype) { this.javatype = javatype; } public string getjavafield() { return javafield; } public void setjavafield(string javafield) { this.javafield = javafield; } public string getjavacap() { return javacap; } public void setjavacap(string javacap) { this.javacap = javacap; } public string getcomments() { return comments; } public void setcomments(string comments) { this.comments = comments; } } }
通过这种方式,就可以根据数据库表结构生成相应的 java 实体类代码,如根据上述代码生成的 user 实体类代码如下:
package com.example.entity; public class user { // 用户 id private integer id; // 用户名字 private string name; // 用户年龄 private integer age; public integer getid() { return this.id; } public void setid(integer id) { this.id = id; } public string getname() { return this.name; } public void setname(string name) { this.name = name; } public integer getage() { return this.age; } public void setage(integer age) { this.age = age; } }
五、对比不同代码生成工具
功能对比
1.mybatis generator
主要针对 mybatis 持久层框架,功能聚焦在根据数据库表生成 mybatis 相关的代码,如实体类、mapper 接口、xml 映射文件等,对于非 mybatis 项目或不涉及数据库操作的代码生成支持有限。
2.spring initializr
主要用于快速生成 spring boot 项目的初始骨架,侧重于项目的整体搭建,包括构建文件、主程序入口类等,但对于项目内部具体的业务代码(如实体类、服务类等)生成能力较弱,需要开发者进一步手动编码。
3.freemarker(结合 java 程序)
具有高度灵活性,可以根据需求自定义模板,生成各种类型的代码。不仅可以生成 java 代码,还可以生成配置文件、html 页面等。但需要开发者自己编写读取元数据(如数据库表信息)的代码以及处理模板的逻辑,相对来说开发成本较高。
易用性对比
1.mybatis generator
对于熟悉 mybatis 和数据库操作的开发者来说,配置和使用相对简单。只需要编写一个配置文件,通过简单的运行就可以生成代码。但需要一定的 xml 配置知识来设置代码生成的各种细节。
2.spring initializr
提供了非常友好的网页界面,即使是初学者也可以轻松上手。只需要填写项目基本信息和选择依赖,点击生成按钮即可得到项目骨架。在本地使用时,也有对应的 maven 和 gradle 插件,方便集成到开发环境中。
3.freemarker(结合 java 程序)
使用起来相对较复杂。需要先学习 freemarker 的模板语法,同时还要开发配套的 java 程序来读取数据和处理模板。不过,一旦掌握了基本原理和开发模式,就可以灵活地用于各种代码生成场景。
六、总结与展望
java 代码生成工具为我们快速构建项目骨架提供了极大的便利。mybatis generator 在持久层代码生成方面表现出色;spring initializr 是搭建 spring boot 项目的利器;freemarker 则提供了灵活自定义的代码生成方式。在实际项目开发中,我们可以根据项目的技术选型和具体需求,选择合适的代码生成工具,或者结合多种工具来高效地完成项目骨架的构建。随着技术的不断发展,未来的代码生成工具可能会更加智能化、自动化,能够更好地理解业务逻辑,生成更加高质量和贴合实际需求的代码,进一步提升软件开发的效率和质量。
到此这篇关于一文教你java如何快速构建项目骨架的文章就介绍到这了,更多相关java构建项目骨架内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论