How the MyBatis Code Generator Creates Entity Classes from Database Tables in Chat2DB

Chat2DB's MyBatis code generator programmatically constructs a MyBatis Generator configuration to convert database table metadata into Java entity classes, mapper interfaces, and XML mappings through the IDbMybatisGenerateService API.

The Chat2DB open-source project streamlines database management by providing automated ORM code generation capabilities. At the heart of this functionality lies a sophisticated MyBatis integration that transforms live database schemas into production-ready Java code. This article examines exactly how the MyBatis code generator creates entity classes from database tables in Chat2DB, detailing the internal architecture and file paths found in the repository.

Architecture of the MyBatis Generation Service

The generation workflow is orchestrated by the IDbMybatisGenerateService interface located at chat2db-community-server/chat2db-community-domain/chat2db-community-domain-api/src/main/java/ai/chat2db/community/domain/api/service/db/IDbMybatisGenerateService.java. This contract defines the primary entry point for all code generation operations within the application.

The concrete implementation resides in DbMybatisGenerateServiceImpl at chat2db-community-server/chat2db-community-domain/chat2db-community-domain-impl/src/main/java/ai/chat2db/community/domain/service/db/DbMybatisGenerateServiceImpl.java. This service class bridges Chat2DB's datasource abstraction layer with the MyBatis Generator framework, dynamically assembling generator configurations without relying on static XML files.

Step-by-Step Generation Process

Metadata Extraction via JDBC

The process initiates by obtaining a JDBC Connection from the target datasource identified by the request parameters. The service leverages MyBatis Generator's introspection utilities to query database metadata, capturing column definitions, primary key constraints, indexes, and column comments. This structural information is encapsulated in TableInfo objects that provide a normalized representation of each table's schema.

Dynamic Configuration Assembly

Rather than parsing static XML configuration files, the implementation programmatically constructs a MyBatis Generator Configuration object. This dynamic approach involves several specialized generators:

  • Java Model Generator: Configures the target package (e.g., ai.chat2db.domain.model) and source output path, applying CamelCase naming conventions to transform table names into Java class names.
  • Java Client Generator: Defines the generation strategy for mapper interfaces, supporting both XMLMAPPER and ANNOTATEDMAPPER modes based on user preferences.
  • SQL Map Generator: Specifies the directory location for generated mapper XML files.
  • Table Configuration: Creates individual TableConfiguration instances for each target table, linking introspected metadata and optionally enabling Lombok annotations or custom type handlers.

Execution and File Writing

The populated Configuration object is passed to the MyBatis Generator's MyBatisGenerator class for execution. During this phase, the generator writes Java source files and XML resources to the specified target directories, typically under /generated/src/main/java and /generated/src/main/resources. The implementation aggregates generation errors—such as duplicate class names or unsupported column types—for inclusion in the service response.

Result Packaging

Upon completion, the service returns a MybatisGenerateResponse containing a list of generated file paths. This enables the Chat2DB UI to display the new entities directly or package them into downloadable ZIP archives for external use.

Practical Code Examples

Developers invoke the generator programmatically through Spring-managed beans. The following examples demonstrate common usage patterns using the MybatisGenerateRequest and MybatisGenerateResponse DTOs.

Generating Entities for a Specific Table

// Obtain the service bean from Spring context
IDbMybatisGenerateService mybatisGen = applicationContext.getBean(IDbMybatisGenerateService.class);

// Configure generation parameters
MybatisGenerateRequest request = new MybatisGenerateRequest();
request.setDatasourceId(42L);               // Target datasource identifier
request.setTableNames(List.of("user"));    // Specific tables to process
request.setTargetPackage("ai.chat2db.domain.model");
request.setTargetProject("/tmp/generated");

// Execute generation
MybatisGenerateResponse resp = mybatisGen.generate(request);

// Access generated file paths
resp.getGeneratedFiles().forEach(System.out::println);

Batch Generation for All Tables

MybatisGenerateRequest request = new MybatisGenerateRequest();
request.setDatasourceId(42L);
request.setAllTables(true);                 // Include every table in the datasource
request.setTargetPackage("ai.chat2db.domain.model");
request.setTargetProject("/tmp/generated");

MybatisGenerateResponse resp = mybatisGen.generate(request);
System.out.println("Generated " + resp.getGeneratedFiles().size() + " files.");

Key Source Files

Understanding the complete implementation requires examining these specific source files in the Chat2DB repository:

Summary

  • Service-Oriented Architecture: The generator exposes functionality through the IDbMybatisGenerateService interface, with DbMybatisGenerateServiceImpl handling the concrete MyBatis integration.
  • Dynamic Configuration: Instead of static XML files, the system programmatically constructs MyBatis Generator Configuration objects to define output paths, naming conventions, and generation targets.
  • JDBC Metadata Introspection: The implementation leverages standard JDBC metadata APIs to extract table structures, primary keys, and column comments directly from the connected datasource.
  • Flexible Output Options: Generated files include Java entity classes, mapper interfaces, and XML mappings, written to configurable target directories with full support for batch or selective table processing.
  • Integrated Error Handling: Generation errors are captured and returned in the service response, allowing the application layer to provide feedback without terminating the generation process.

Frequently Asked Questions

What is the entry point for the MyBatis generator in Chat2DB?

The entry point is the IDbMybatisGenerateService interface, which defines the contract for code generation operations. Client code obtains an instance of this service—typically through Spring dependency injection—and invokes the generate() method with a populated MybatisGenerateRequest object to initiate the entity creation process.

How does Chat2DB handle database metadata introspection?

The service obtains a JDBC Connection from the specified datasource and utilizes MyBatis Generator's introspection utilities to query column definitions, primary keys, indexes, and comments. This metadata drives the generation of Java class names, fields, and annotations according to the configured naming strategy.

Can I customize the target package and project directory for generated entities?

Yes. The MybatisGenerateRequest DTO includes setTargetPackage() and setTargetProject() methods that allow you to specify the output package name (e.g., com.example.domain) and the root directory path (e.g., /tmp/generated) where the generator writes the Java source files and XML mappings.

Where does the generator write the output files?

According to the implementation in DbMybatisGenerateServiceImpl, the generator writes files to subdirectories under the path specified by targetProject, typically creating /generated/src/main/java for Java classes and /generated/src/main/resources for mapper XML files. The exact paths are determined by the Java Model Generator and SQL Map Generator configurations assembled at runtime.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →