如何在jOOQ生成Java表类时去除包名中的数据库/架构名
解决jOOQ代码生成包名包含数据库名和架构名的问题
问题背景
使用JDK11+搭配jOOQ 3.19.9代码生成工具,基于SQL Server 2022开发者版生成数据库表对应的Java类时,生成的类包名自动包含了数据库名bank_dd_0002和架构名dbo,示例包名如下:
package dbmetab.bank_dd_0002.dbo.tables;
需要将包名简化为:
package dbmetab.tables;
当前执行的生成命令:
java -classpath jooq-3.19.9.jar;jooq-meta-3.19.9.jar;jooq-codegen-3.19.9.jar;jakarta.xml.bind-api-3.0.0.jar;r2dbc-spi-1.0.0.RELEASE.jar;reactive-streams-1.0.3.jar;mssql-jdbc-12.6.2.jre11.jar;. org.jooq.codegen.GenerationTool ss.xml
原ss.xml配置文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-3.11.0.xsd"> <!-- Configure the database connection here --> <jdbc> <driver>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver> <url>jdbc:sqlserver://;serverName=localhost;databaseName=bank_dd_0002;encrypt=false</url> <user>abc</user> <password>xxx</password> </jdbc> <generator> <!-- The default code generator. You can override this one, to generate your own code style. Supported generators: - org.jooq.codegen.JavaGenerator - org.jooq.codegen.ScalaGenerator Defaults to org.jooq.codegen.JavaGenerator --> <name>org.jooq.codegen.JavaGenerator</name> <database> <!-- The database type. The format here is: org.util.[database].[database]Database --> <name>org.jooq.meta.sqlserver.SQLServerDatabase</name> <!-- The database schema (or in the absence of schema support, in your RDBMS this can be the owner, user, database name) to be generated --> <!-- All elements that are generated from your schema (A Java regular expression. Use the pipe to separate several expressions) Watch out for case-sensitivity. Depending on your database, this might be important! --> <inputSchema>dbo</inputSchema> <includes> app_dates|dates|holidays|banks|bank_groups|bank_group_banks </includes> <!-- All elements that are excluded from your schema (A Java regular expression. Use the pipe to separate several expressions). Excludes match before includes, i.e. excludes have a higher priority --> <excludes></excludes> </database> <target> <!-- The destination package of your generated classes (within the destination directory) --> <packageName>dbmetab</packageName> <!-- The destination directory of your generated classes. Using Maven directory layout here --> <directory>C:\appdir\src\main\java</directory> </target> </generator> </configuration>
修改方案
在<database>节点下添加两个配置项,将数据库和架构映射到默认值,从而移除包路径中的数据库名和架构名:
<outputSchemaToDefault>true</outputSchemaToDefault>:把指定的输入架构(dbo)转换为默认架构,不生成架构名对应的包层级<outputDatabaseToDefault>true</outputDatabaseToDefault>:把当前连接的数据库(bank_dd_0002)转换为默认数据库,不生成数据库名对应的包层级
修改后的完整配置
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-3.11.0.xsd"> <!-- Configure the database connection here --> <jdbc> <driver>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver> <url>jdbc:sqlserver://;serverName=localhost;databaseName=bank_dd_0002;encrypt=false</url> <user>abc</user> <password>xxx</password> </jdbc> <generator> <!-- The default code generator. You can override this one, to generate your own code style. Supported generators: - org.jooq.codegen.JavaGenerator - org.jooq.codegen.ScalaGenerator Defaults to org.jooq.codegen.JavaGenerator --> <name>org.jooq.codegen.JavaGenerator</name> <database> <!-- The database type. The format here is: org.util.[database].[database]Database --> <name>org.jooq.meta.sqlserver.SQLServerDatabase</name> <!-- 新增配置:移除数据库名和架构名的包层级 --> <outputDatabaseToDefault>true</outputDatabaseToDefault> <outputSchemaToDefault>true</outputSchemaToDefault> <!-- The database schema (or in the absence of schema support, in your RDBMS this can be the owner, user, database name) to be generated --> <!-- All elements that are generated from your schema (A Java regular expression. Use the pipe to separate several expressions) Watch out for case-sensitivity. Depending on your database, this might be important! --> <inputSchema>dbo</inputSchema> <includes> app_dates|dates|holidays|banks|bank_groups|bank_group_banks </includes> <!-- All elements that are excluded from your schema (A Java regular expression. Use the pipe to separate several expressions). Excludes match before includes, i.e. excludes have a higher priority --> <excludes></excludes> </database> <target> <!-- The destination package of your generated classes (within the destination directory) --> <packageName>dbmetab</packageName> <!-- The destination directory of your generated classes. Using Maven directory layout here --> <directory>C:\appdir\src\main\java</directory> </target> </generator> </configuration>
重新执行原生成命令,生成的Java类包名将变为dbmetab.tables,符合需求。
内容的提问来源于stack exchange,提问作者ps0604
相关产品推荐
相关产品推荐

