プロジェクトでは、データベース テーブルに基づいて多くの Meta、Dao、Service コードを記述する必要があり、その多くは反復的で面倒です。そのため、テンプレートコード用のジェネレーターがあれば、開発効率をある程度向上させることができます。
Java Web プロジェクトで Dao、メタ、およびサービス層のテンプレート コードを生成するための構成可能なジェネレーター。
mvn archetype:generate -DgroupId=com.zju -DartifactId=JavaWebCodeGenerator -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false -DarchetypeCatalog=internal
プロジェクトとは、Mybatisジェネレーターでコードを生成するプロセスを指します。具体的な手順は次の5つのステップに分かれています。
論理ステップ
コマンドラインを解析
データテーブル情報を取得
設定情報を生成
ファイルを生成
コマンド解析クラス ShellRunner
このクラスは、コマンド ライン コマンドの解析、構成ファイルの解析、および必要なデータのコード生成クラスへのカプセル化を担当します。
解析可能なコマンドには、-config<a href="http://www.php.cn/wiki/1313.html" target="_blank">file<code>-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();
が含まれます: 構成へのパスを指定しますfile と -overwrite
: ターゲット ファイルを書き換えるかどうか。
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
コード生成クラス CodeGenerator
このクラスは、データベースへの接続、データ テーブルのテーブル情報のクエリ、SQL 型の Java 型へのマッピング、および必要なデータをファイル生成クラスに渡します。java -jar JavaWebCodeGenerator.jar -configfile generatorConfig.properties -overwrite
databaseMetaData.getColumns
メソッドの本質は、SELECT * FROM information_schema.COLUMNS WHERE TABLE_NAME="tableName"
ステートメントを実行することです。 フィールド | 説明 |
---|---|
DATA_TYPE | データ型 |
COLUMN_SIZE | データ長 |
COLUMN_NANE | 列名 |
NULLABLE | 空以外が許可されるかどうか |
DECIMAL_DIGITS | 10 進数 |
REMARKS | 備考 |
COLUMN_DEF | デフォルト値 |
最後に、JavaTypeResolver
の型マッピング (Map<integer jdbctypeinformation> typeMap</integer>
) と、StringUtils のキャメル ケースの名前変換 (<code>getCamelCaseString
) を使用します。 code>) は SQL 情報を Java 情報に変換します。
Class.class.getClass().getResource("/").getPath();
このメソッドは次のことができます。プロジェクトのルート ディレクトリを取得しますが、生成された Jar パッケージをテストする場合、この方法は無効です。したがって、Jar パッケージを生成する前に、この行を new File("").getAbsolutePath();
に変更して生成パスを取得する必要があります。 🎜🎜プロジェクト構造🎜🎜🎜🎜🎜設定ファイルの例🎜🎜generatorConfig.properties🎜rrreee🎜コマンドの実行例🎜rrreee🎜🎜デモ例🎜🎜🎜🎜🎜以上がJava Webテンプレートコードジェネレーターの設計と実装の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。