The <table> Element

The <table> element is used to select a table in the database for introspection. Selected tables will cause the following objects to be generated for each table:

Runtime Generated Objects
MyBatis3DynamicSQL
  • A Java "model" class, or record, including all columns from the table
  • A Java interface usable by MyBatis3 including CRUD operations. The methods in the interface are generated to make use of the MyBatis Dynamic SQL library which provides a means to create very flexible SQL
  • A Java "dynamic SQL support" class that is a metamodel representing the columns in the database table. This class provides support for generating SQL with the MyBatis Dynamic SQL library.
MyBatis3Kotlin
  • A Kotlin data class including all columns from the table
  • A Kotin interface usable by MyBatis3 including CRUD operations. The methods and extension functions in the interface are generated to make use of the MyBatis Dynamic SQL library which provides a means to create very flexible SQL
  • A Kotlin "dynamic SQL support" class that is a metamodel representing the columns in the database table. This class provides support for generating SQL with the MyBatis Dynamic SQL library.
MyBatis3
  • Java "model" classes matching the table which may or may not include a separate primary key class and a separate class holding the BLOB columns, or a Java record that contains all columns from the table
  • An "example" class that can be used to create custom where clauses
  • A Java interface usable by MyBatis3 including CRUD operations. This runtime includes a "by example" functionality that provides some level of support for custom where clauses. Note that this functionality is very brittle and generates a large amount of code. For this reason, we recommend all users change to the MyBatis3DynamicSQL runtime which produces smaller and more flexible code.
  • Optionally, an XML mapper file formatted for MyBatis. This runtime can be configured to only use annotations, so the XML may or may not be generated depending on how the runtime is configured.
MyBatis3Simple
  • A Java "model" class, or record, including all columns from the table
  • A Java interface usable by MyBatis3 including CRUD operations. The simple runtime does not include any advanced "by example" methods.
  • Optionally, an XML mapper file formatted for MyBatis. The simple runtime can be configured to only use annotations, so the XML may or may not be generated depending on how the runtime is configured.

At least one <table> element must be specified as a required child element of the <context> element. You can specify unlimited table elements.

Database Identifiers

MyBatis Generator (MBG) tries to deal with the case sensitivity of database identifiers automatically. In most cases, MBG is able to find tables regardless of what you specify for catalog, schema, and tableName attributes. MBG's process follows these steps:

  1. If either of the catalog, schema, or tableName attributes contain a space, then MBG will look for tables based on the exact case specified. In this case, MBG will automatically delimit the table identifiers in the generated SQL.
  2. Else if the database reports that identifiers are stored in upper case, MBG will automatically convert any table identifier to upper case.
  3. Else if the database reports that identifiers are stored in lower case, MBG will automatically convert any table identifier to lower case.
  4. Else MBG will look for tables based on the exact case specified.

In most cases, this process works perfectly. However, there are cases where it will fail. For example, suppose you create a table like this:

  create table "myTable" (
     ...some columns
  )

Because the table name is delimited, most databases will create the table with the exact case specified - even if the database normally stores identifiers in upper case. In this instance, you should specify the attribute delimitIdentifiers="true" in the table configuration.

Required Attributes

Attribute Description
tableName The name of the database table (not including the schema or catalog). The specified value can contain SQL wildcards if so desired.

Optional Attributes

Attribute Description
schema The database schema - not required if your database does not use schemas, or if there is a default schema. The specified value can contain SQL wildcards if so desired.
catalog The database catalog - not required if your database does not use catalogs, or if there is a default catalog.
alias This attribute is ignored is the target runtime is "MyBatis3DynamicSql" or "MyBatis3Kotlin"
If specified, this value will be used to alias the table and all column names in any generated SQL select statement. Column names will be aliased with the pattern alias_actualColumnName.
domainObjectName The base name from which generated object names will be generated. If not specified, MBG will generate a name automatically based on the tableName. The name (either specified here, or generated automatically) will be used to compute generated domain class names and cleint class names.

You can specify a package fragment in the domain object name. For example, if you specify foo.Bar then the domain object will be Bar and package foo will be appended to the target package specified in the generator configurations.

mapperName The name of the MyBatis3 generated mapper class and XML file. If not specified, the name will be whatever the domain object name is, plus the word "Mapper".

You can specify a package fragment in the mapper name. For example, if you specify foo.BarMapper then the mapper will be BarMapper and package foo will be appended to the target package specified in the generator configurations.

Since version 1.3.4

sqlProviderName This attribute is ignored is the target runtime is "MyBatis3DynamicSql" or "MyBatis3Kotlin"
The name of the MyBatis3 generated SQL provider class (which may or may not be generated based on the configuration). If not specified, the name will be whatever the domain object name is, plus the word "SqlProvider".

You can specify a package fragment in the SQL provider name. For example, if you specify foo.BarSqlProvider then the SQL provider will be BarSqlProvider and package foo will be appended to the target package specified in the generator configurations.

Since version 1.3.4

enableInsert This attribute is ignored is the target runtime is "MyBatis3DynamicSql" or "MyBatis3Kotlin"
Signifies whether an insert statement should be generated.

The default is true.

enableSelectByPrimaryKey This attribute is ignored is the target runtime is "MyBatis3DynamicSql" or "MyBatis3Kotlin"
Signifies whether a select by primary key statement should be generated. Regardless of this setting, the statement will not be generated if the table does not have a primary key.

The default is true.

enableSelectByExample This attribute is ignored is the target runtime is "MyBatis3DynamicSql" or "MyBatis3Kotlin"
Signifies whether a select by example statement should be generated. This statement enables many different dynamic queries to be generated at run time.

The default is true.

enableUpdateByPrimaryKey This attribute is ignored is the target runtime is "MyBatis3DynamicSql" or "MyBatis3Kotlin"
Signifies whether an update by primary key statement should be generated. Regardless of this setting, the statement will not be generated if the table does not have a primary key.

The default is true.

enableDeleteByPrimaryKey This attribute is ignored is the target runtime is "MyBatis3DynamicSql" or "MyBatis3Kotlin"
Signifies whether a delete by primary key statement should be generated. Regardless of this setting, the statement will not be generated if the table does not have a primary key.

The default is true.

enableDeleteByExample This attribute is ignored is the target runtime is "MyBatis3DynamicSql" or "MyBatis3Kotlin"
Signifies whether a delete by example statement should be generated. This statement enables many different dynamic deletes to be generated at run time.

The default is true.

enableCountByExample This attribute is ignored is the target runtime is "MyBatis3DynamicSql" or "MyBatis3Kotlin"
Signifies whether a count by example statement should be generated. This statement will return the number of rows in a table that match an example.

The default is true.

enableUpdateByExample This attribute is ignored is the target runtime is "MyBatis3DynamicSql" or "MyBatis3Kotlin"
Signifies whether an update by example statement should be generated. This statement will update rows in a table that match an example. If true, an update by example "selective" statement will also be generated. The "selective" statement will only update columns where the corresponding value in the record parameter is non-null.

The default is true.

modelType This attribute is ignored is the target runtime is "MyBatis3Kotlin"
This attribute is used to override the default model type if you desire to do so for this table. If not specified, MBG will generate domain objects based on the context default model type. The model type defines how MBG will generate domain classes. With some model types MBG will generate a single domain class for each table, with others MBG may generate different classes depending on the structure of the table.

If the target runtime is "MyBatis3", then the property supports these values:

conditional This model is similar to the hierarchical model except that a separate class will not be generated if that separate class would only contain one field. So if a table has only one primary key field, that field will be merged into the base record class.
flat This model generates only one domain class for any table. The class will hold all fields in the table.
hierarchical This model will generate a primary key class if the table has a primary key, another class that holds any BLOB columns in the table, and another class that holds the remaining fields. There is an appropriate inheritance relationship between the classes.
record This model will generate a Java 16 record class containing all fields (similar to the flat model)

If the target runtime is "MyBatis3DynamicSQL" or "MyBatis3Simple", then the property supports these values:

flat This model generates only one domain class for any table. The class will hold all fields in the table.
record This model will generate a Java 16 record class containing all fields (similar to the flat model)
escapeWildcards Signifies whether SQL wildcards ('_' and '%') in the schema and tableName should be escaped when searching for columns. This is required by some drivers if the schema or tableName includes an SQL wildcard (for example, if a table name is MY_TABLE, some drivers require that the underscore character be escaped).

The default is false.

delimitIdentifiers Signifies whether MBG should use the exact case specified when searching for tables and then delimit the identifiers in the generated SQL. See the discussion above for more details.

The delimiter characters are specified on the <context> element.

The default is false unless the catalog, schema, or tableName attributes contain a space, then true.

delimitAllColumns Signifies whether MBG should add delimiters to all column names in the generated SQL. This is an alternative to coding a <columnOverride> for every column specifying that the column should be delimited. This is useful for databases like PostgreSQL that are case-sensitive with identifiers.

The delimiter characters are specified on the <context> element.

The default is false.

Child Elements

Supported Properties

This table lists the properties of the default SQL Map generators that can be specified with the <property> child element:

Property Name Property Values
constructorBased This property is ignored is the target runtime is "MyBatis3Kotlin"
This property is used to select whether MyBatis Generator will generate a constructor for the class that accepts a value for each field in the class. Also, the SQL result map will be built to use the constructor rather than the "setter" for each field.

This property is ignored (and forced "true") if the "immutable" property is set "true".

The default value is false.

dynamicSqlSupportClassName This property is ignored unless the target runtime is "MyBatis3DynamicSQL" or "MyBatis3Kotlin"
The name of the generated MyBatis Dynamic SQL support class. If not specified, the name will be whatever the domain object name is, plus the word "DynamicSqlSupport".

You can specify a package fragment in the support class name. For example, if you specify foo.BarSqlSupport then the SQL provider will be BarSqlSupport and package foo will be appended to the package specified in the generator configuration.

Since version 1.4.1

dynamicSqlTableObjectName The name to use for the inner class generated in support classes for MyBatis Dynamic SQL. If not specified, the name will be the calculated domain object name (typically the table name). The value if this property will be used as is for the inner class name (case-sensitive). An outer class property name will also be calculated from this name (typically with the initial letter lower-cased).
ignoreQualifiersAtRuntime If true, then MBG will not add the schema or catalog to the table name in the generated SQL. This is useful if you have tables with the same name in several schemas - you can use MBG to generate objects based on the table in one schema, but not include the schema for runtime.

The default value is false.

immutable This property is ignored is the target runtime is "MyBatis3Kotlin"
This property is used to select whether MBG will generate immutable model classes - this means that the classes will not have "setter" methods and the constructor will accept values for each field in the class. For Kotlin, the data class will be generated with "val" properties instead of "var" properties.

If true, this forces the model classes to be built with paramterized constructors regardless of the value of the "constructorBased" property.

The default value is false.

modelOnly This property is used to select whether MBG will only generate model classes for a table.

If true, then a Java client will not be generated. If an <sqlMapGenerator> is configured and this property is set true then MBG will only generate result map elements in the SQL Mapper XML file for this table.

If true, then this value overrides any of the "enable*" attributes on the <table> element - no CRUD methods will be generated.

The default value is false.

rootClass This attribute is ignored if the target runtime is "MyBatis3Kotlin"
This property can be used to specify a root class for all generated Java model objects. MBG will specify this value as the super class of the primary key object, if the table has a primary key, or the record object otherwise. The value specified in this property will override the rootClass property set on the Java Model Generator configuration if any is set.

Important: If MBG is able to load the root class, it will not override a property in the root class that exactly matches a property that would normally be generated. An exact match of a property is defined as follows

  • Property name matches exactly
  • Property is of the same type
  • Property has a "getter" method
  • Property has a "setter" method

If specified, the value of this property should be a fully qualified class name (like com.mycompany.MyRootClass).

rootInterface This property is ignored if the target runtime is "MyBatis3Kotlin"
This property can be used to specify a super interface for all generated mapper interfaces. The value specified in this property will override the rootInterface property set on the Java Client Generator configuration if any is set.

Important: MBG does not verify that the interface exists, or is a valid Java interface.

If specified, the value of this property should be a fully qualified interface name (like com.mycompany.MyRootInterface).

injectModelIntoRootInterface This property is ignored if the target runtime is "MyBatis3Kotlin"
If "true", then the generated model type will be added as a type parameter to a specified "rootInterface". This property can be used to generate mappers based on a generic super interface. The model will be added as a type parameter if, and only if, the related "rootInterface" is generic and has exactly one type parameter. The value specified here will override the injectModelIntoRootInterface property set on a Java Client Generator configuration if any is set.

If "true", then the related rootInterface should include the generic specification (like com.mycompany.MyRootInterface<T extends Entity>). If there is no type parameter in the related rootInterface, then this property has no effect.

useSnakeCaseIdentifiers This property is ignored if the target runtime is "MyBatis3" or "MyBatis3Simple"
If true, then generated MyBatis Dynamic SQL support classes that model database tables and columns will use snake case names (e.g., ORDER_MASTER) rather than camel case names (e.g., orderMaster). This helps avoid awkward parameter naming for some methods where we appended an underscore to generated parameters in some cases. The value specified here will override the useSnakeCaseIdentifiers property set on a Java Client Generator configuration if any is set.
runtimeCatalog If you specify a value for this property, than MBG will use that value as the catalog in the generated SQL rather than the catalog as configured above. This is useful if you want to generate code against one catalog, but want to use a different catalog at runtime.
runtimeSchema If you specify a value for this property, than MBG will use that value as the schema in the generated SQL rather than the schema as configured above. This is useful if you want to generate code against one schema, but want to use a different schema at runtime.
runtimeTableName If you specify a value for this property, than MBG will use that value as the table name in the generated SQL rather than the tableName as configured above. This is especially useful on Oracle if you want to generate objects to use a public synonym. In that case, you will need to generate the objects against the actual table that the synonym points to, then specify the synonym name in this property. You should also specify the ignoreQualifiersAtRuntime property in most cases with public synonyms.
selectAllOrderByClause This property can be used to specify an order by clause that will be added to the selectAll method. This is only applicable if you are using the MyBatis3Simple target runtime. MBG will prepend order by to anything you specify in this property, so the property should contain a column list only (e.g ID1, ID2 or ID1 desc, ID2 asc)
trimStrings This attribute is ignored is the target runtime is "MyBatis3Kotlin"

This property is used to select whether MyBatis Generator adds code to trim the white space from character fields returned from the database. This can be useful if your database stores data in CHAR fields rather than VARCHAR fields. When true, MyBatis Generator will insert code to trim character fields. Can be overridden with the trimStrings property in a <columnOverride> configuration. This property value overrides the property if specified at the <modelGenerator> level and can be overridden for fields/columns using the property in a <columnOverride> element.

The default value is inherited from the <modelGenerator>, otherwise false.

useActualColumnNames If true, then MBG will use column names as returned from the database metadata as the properties of the generated domain objects. If false (default), MBG will attempt to camel case the returned names. In either event, the name can be specified explicitly by the <columnOverride> element in which case this property will be ignored for the specified column.

For example, suppose a table contains a column START_DATE. If the value of this property is "true", then MBG will generate the property name as START_DATE - meaning that the getters and setters for the value will be getSTART_DATE() and setSTART_DATE(). If the value of this property is false, then MBG will generate the property name as startDate - meaning that the getters and setters for the value will be getStartDate() and setStartDate().

The default value is false.

useCompoundPropertyNames If true, then MBG will generate property names by contatenating the column name with the column reparks. This can be useful in databases created by 4th generation languages where the column names are generated (e.g. FLD2237), but the remarks contain useful information (e.g. "customer id"). In this case, MBG will generate a property name of FLD2237_CustomerId.

The default value is false.

generateKotlinV1Model If true, then the Kotlin runtime will generate model and mapper classes similar to the classes generated in version 1.x of MBG. If false, then the generated models will be immutable and the model classes will respect the nullability of corresponding database columns. In addition, several mapper methods from V1 will not be generated as they don't function as expected when the models have a correct understanding of column nullability.

This property will be removed in a future version of MBG, and V1 models will no longer be supported.

The default value is false.

Example

This element specifies that we always want to generate code for a table called MYTABLE in schema MYSCHEMA. We also want to ignore a column called "fred" in the table, and we want to override the column "BEG_DATE" so that the generated property name will be "startDate".

<table tableName="MYTABLE" schema="MYSCHEMA">
  <ignoreColumn column="fred"/>
  <columnOverride column="BEG_DATE" property="startDate"/>
</table>