MyBatis Generator (MBG) 的参考手册,我帮你们看过咯
MyBatis GeneratorXML Configuration File Reference
对,就是看了下:MyBatis GeneratorXML Configuration File Reference
看这个的原因是最近相帮朋友搞个小的项目管理(非软件项目)小工具,本来计划两周完整,结果没做过后端的我已经搞了1个月了。为了练手,项目没有用低代码框架。于是用Springboot建了个SSM项目,前后端分离,RESTful风格的。
然后网上找了一些MyBatis Generator相关的代码,拷到工程里面,跑是跑通了,但是生成的接口不满意,有不知道怎么去修改,配置文件也不怎么理解。
这是说为什么最近干这个,也间接暴露了水平。其实都是废话。
当你看不太懂别人写的配置文件的时候,可以来看看。
我英文很烂,借助翻译工具看的,加上对mybatis不是很熟,这篇文档他应该很烂的,应该有不少高中低级错误,凑合看。
一直很拒绝写文档,怕有个啥错误,误导别人。写的时候,还要加上“在大部分情况下”这类的话,怕不严谨。这是一种强迫症,影响文档质量。现在不这么想了,写文档是一种沉淀方式。
<!DOCTYPE generatorConfiguration PUBLIC
"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- context (1..N) 指定生成一组对象的环境 -->
<!-- 可以针对数据库不同的 schema 或者使用不同的参数,配置多个 context -->
<!-- id: 此上下文的唯一标识符。该值将在某些错误消息中使用 -->
<!-- defaultModelType 设置生成的Model类型的默认值。一张表生成几个类。候选值: -->
<!-- flat: 一张表只生成一个 Model 类。该类将保存表中的所有字段 -->
<!-- hierarchical: 主键生成一个类(如果有)、BLOB 生成一个类(如果有),其余生成一个类。类之间存在适当的继承关系 -->
<!-- conditional: 默认值。如果在 hierarchical 下生成的类只有一个字段,则不会生成该类,而是把这个字段放到别的类里面 -->
<!-- targetRuntime 指定生成代码的运行时目标。候选值: -->
<!-- MyBatis3DynamicSql: 默认值。生成 Java 的 Model 和 Mapper 接口,而不是 mapper xml 文件 -->
<!-- 注意: 1 defaultModelType 配置不生效,被强制为 flat -->
<!-- 2 只生成带注解的 Mapper 接口,不生成 mapper XML,忽略所有跟xml相关的配置,如:<sqlMapGenerator> -->
<!-- 2 以“每个查询”的方式支持表别名,而不是其他运行时的“全有或全无”方式。因此,配置的表别名将被忽略 -->
<!-- MyBatis3Kotlin: 和 MyBatis3DynamicSql 一样,只是生成Kotlin语言的类和接口-->
<!-- MyBatis3: 将生成与 MyBatis 3.0 及更高版本以及 JSE 5.0 及更高版本兼容的对象(例如,Java Model和 Mapper 接口将使用泛型类型) -->
<!-- 这些生成的对象中的“by example”方法支持几乎无限的动态 where 子句 -->
<!-- 此外,使用这些生成器生成的 Java 对象支持许多 JSE 5.0 功能,包括参数化类型和注释 -->
<!-- MyBatis3Simple: 和MyBatis3类似,但是生成的 mapper 是非常基本的 CRUD 操作和很少的动态 SQL,没有“示例”方法 -->
<context id="dsql" targetRuntime="MyBatis3DynamicSql" defaultModelType="conditional">
<!--分隔 SQL 关键字(如果它们用作表中的列名) -->
<property name="autoDelimitKeywords" value="false"/>
<!-- 用作需要分隔符的 SQL 标识符的开始和结束标识符分隔符的值, 默认值双引号(") -->
<property name="beginningDelimiter" value="""/>
<property name="endingDelimiter" value="""/>
<!-- 如果没指定,使用平台默认编码 -->
<property name="javaFileEncoding" value=""/>
<!-- 为生成的 Java 文件提供的格式化程序的完整类名,-->
<!-- 必须是实现了org.mybatis.generator.api.JavaFormatter接口的类 -->
<!-- 不指定则使用默认值 org.mybatis.generator.api.dom.DefaultJavaFormatter -->
<property name="javaFormatter" value=""/>
<!-- 和 javaFileEncoding 类似 -->
<property name="kotlinFileEncoding" value=""/>
<!-- 和 javaFormatter 类似,接口:org.mybatis.generator.api.KotlinFormatter,默认值:org.mybatis.generator.api.dom.DefaultKotlinFormatte -->
<property name="kotlinFormatter" value=""/>
<!-- 和 javaFormatter 类似,接口:org.mybatis.generator.api.XmlFormatte,默认值:org.mybatis.generator.api.dom.DefaultXmlFormatter -->
<property name="xmlFormatter" value=""/>
<!-- plugin (0..N) 插件列表 -->
<!-- 后面专门讲解 -->
<!-- 参考: (实现插件)http://mybatis.org/generator/reference/pluggingIn.html -->
<!-- 参考: (提供的插件)http://mybatis.org/generator/reference/plugins.html -->
<plugin />
<!-- commentGenerator (0..1) 注释生成器 -->
<commentGenerator>
<!-- 阻止生成所有注释,默认值 false,为 true 时,不会向任何生成的元素添加注释 -->
<!-- 为 true 时,所有代码合并将被禁用 -->
<property name="suppressAllComments" value="false" />
<!-- 阻止在注释中生成时间戳, 默认值 false -->
<property name="suppressDate" value="false" />
<!-- 把数据库中表、列等的 remark(注释)添加到生成结果中 -->
<property name="addRemarkComments" value="false" />
<!-- 日期格式,当 suppressAllComments 或 suppressDate 为 true 的时候,不生成时间,所以该属性无效 -->
<property name="dateFormat" value="false" />
<!-- 使用旧版的注解 javax.annotation.Generated -->
<property name="useLegacyGeneratedAnnotation" value="false" />
</commentGenerator>
<!-- jdbcConnection 数据库连接 jdbcConnection/connectionFactory 必须且只能配置一个 -->
<!-- jdbcConnection (0..1) JDBC 连接 -->
<!-- driverClass 和 connectionURL 是必须的 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/dbname" userId="root" password="123456"/>
<!-- connectionFactory (0..1) 或者使用连接工厂 -->
<!-- type 是可选的,值必须是实现了 org.mybatis.generator.api.ConnectionFactory 接口的类,或者 DEFAULT (默认值) -->
<connectionFactory type="DEFAULT">
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="connectionURL" value="jdbc:mysql://localhost:3306/dbname"/>
<property name="userId" value="root"/>
<property name="password" value="123456"/>
</connectionFactory>
<!-- javaTypeResolver (0..1) Java 类型解析器 -->
<!-- type 是可选的,值必须是实现了 org.mybatis.generator.api.ConnectionFactory 接口的类,或者 DEFAULT (默认值) -->
<javaTypeResolver type="DEFAULT">
<!-- 强制使用 java.math.BigDecimal 处理 Decimal和 Numberic -->
<property name="forceBigDecimals" value="false"/>
<!-- 强制对 DATE、TIME 和 TIMESTAMP 字段使用 JSR-310 数据类型 -->
<property name="useJSR310Types" value="false"/>
</javaTypeResolver>
<!-- javaModelGenerator (1..1) Model 生成配置 -->
<!-- targetPackage: Model所在的包, 会根据需要,创建相关的目录(下同) -->
<!-- targetProject: 代码路径,叫project是兼容Eclipse, 路径必须是已存在的的(下同) -->
<javaModelGenerator targetPackage="cc.XXX.XXX.model" targetProject="src/main/java">
<!-- (0..N) 属性列表 -->
<!-- 使用构造函数,而不是 setter 实例化 Model -->
<!-- 如果 immutable 为 true,则强制为 constructor based,该属性不生效。MyBatis3Kotlin忽略这个属性 -->
<property name="constructorBased" value="false"/>
<!-- 选择 MyBatis Generator 是否根据内省表的 catalog 和 schma,为对象生成不同的Java包 -->
<property name="enableSubPackages" value="false"/>
<!-- 以下3个属性会被MyBatis3DynamicSql忽略 -->
<!-- 为生成的示例对象指定不同的包 -->
<property name="exampleTargetPackage" value=""/>
<!-- 为生成的示例对象指定不同的项目 -->
<property name="exampleTargetProject" value=""/>
<!-- 以下3个属性会被MyBatis3Kotlin忽略 -->
<!-- 生成构造函数,接受每个字段,生成实例时使用构造函数,而不是setter -->
<property name="immutable" value="false"/>
<!-- 为所有生成的 Java Model 对象指定根类 -->
<property name="rootClass" value=""/>
<!-- 选择 MyBatis Generator 是否添加代码来修剪从数据库返回的字符字段中的空格 -->
<!-- 去除空格会被 <table> or <columnOverride> 的同名属性覆盖 -->
<property name="trimStrings" value="false"/>
</javaModelGenerator>
<!-- sqlMapGenerator (0..1) 用于定义 SQL 映射生成器的属性 -->
<!-- 如果 targetRuntime 不生成 mapper XML 文件,不需要配置,否则必须配置 -->
<!-- targetPackage: mapper 文件所在的包 -->
<!-- targetProject: 代码路径,叫project是兼容Eclipse -->
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
<!-- 是否根据内省表的Catalog和Schma为对象, 启用不同的子包 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- javaClientGenerator (0..1) 配置生成和 mapper xml 文件对应的接口和类 -->
<!-- 如果不指定此元素,那么 MyBatis Generator (MBG) 将不会生成 Java 客户端接口和类。-->
<!-- targetPackage: Mapper 接口文件所在的包 -->
<!-- targetProject: 代码路径,叫project是兼容Eclipse -->
<!-- type: Mapper类型,MyBatis3DynamicSql, MyBatis3Kotlin 忽略该属性 -->
<!-- ANNOTATEDMAPPER: 生成的对象将是 MyBatis 3.x Mapper基础设施的 Java 接口。这些接口将基于注解和 MyBatis 3.x SqlProviders。不会生成 mapper XML 文件 -->
<!-- XMLMAPPERXML: 生成的对象将是 MyBatis 3.x Mapper基础设施的 Java 接口。这些接口将依赖于生成的 mapper XML 文件-->
<!-- MIXEDMAPPER: 仅用于 MyBatis3,简单的使用注解,相当于 ANNOTATEDMAPPER,复杂的(需要 MyBatis 3.x SqlProviders)的使用XML,相当于 MIXEDMAPPER -->
<javaClientGenerator targetPackage="com.XXX.XXX.mapper" targetProject="src/main/java" type="XMLMAPPERXML">
<!-- dynamicSqlSupport 包的位置,仅用于 MyBatis3DynamicSql 和 MyBatis3Kotlin -->
<property name="dynamicSqlSupportPackage" value=""/>
<!-- 选择 MyBatis Generator 是否根据内省表的Catalog和Schma为对象生成不同的子包。 -->
<property name="enableSubPackages" value="false"/>
<!-- 为生成的 Mapper 指定父接口,用户自己确保该接口存在,有效。MyBatis3Kotlin 忽略 -->
<property name="rootInterface" value="org.mybatis.dynamic.sql.util.mybatis3.CommonSelectMapper"/>
</javaClientGenerator>
<!-- table (1..N) 表和实体的生成规则映射 -->
<!-- 从数据库中选取一个表,根据数据库的内省(introspection)表,生成相应的接口、类、xml文件 -->
<!-- tableName: Required. 数据库表的名称(不包含 schema 或 catalog) -->
<!-- schema: 数据库的 schema, 如果数据库不使用 schema,或者有默认值,则不需要 -->
<!-- catalog: 和 schema 类似 -->
<!-- alias: 别名,生成的 xml 中 select 将使用这个别名,MyBatis3DynamicSql 和 MyBatis3Kotlin 不生成 xml,所以忽略 -->
<!-- domainObjectName: domain中的类名,如果不提供。使用tableName的驼峰形式,可以指定子包,如:foo.Bar -->
<!-- mapperName: Mapper 接口和 xml 文件的名字,如果未指定,则是 domainObjectName + "Mapper" -->
<!-- 以下属性将被 MyBatis3DynamicSql 和 MyBatis3Kotlin 忽略 -->
<!-- 如果没做特别说明,以下属性默认值为true -->
<!-- sqlProviderName: MyBatis3 生成的 SQL 提供程序类的名称。如果未指定,则是 domainObjectName + "SqlProvider" -->
<!-- enableInsert: 是否生成插入语句。默认值为ture -->
<!-- enableSelectByPrimaryKey: 表示是否应生成按主键选择语句,需要有主键才能生效 -->
<!-- enableUpdateByPrimaryKey: 是否应生成主键更新语句,需要有主键才能生效 -->
<!-- enableSelectByExample: 表示是否应生成 select by example 语句 -->
<!-- 类似的还有 enableDeleteByExample,enableCountByExample,enableUpdateByExample -->
<!-- selectByPrimaryKeyQueryId: 该值将以这种形式添加到 select by Primary key 语句的选择列表中:“'<value> ' as QUERYID” -->
<!-- 这对于在运行时识别 DBA 跟踪工具中的查询很有用。如果使用该值,则应该为 MBG 生成的每个不同查询指定一个唯一的 id。-->
<!-- selectByExampleQueryId: 和上面类似,添加到 select by example 中 -->
<!-- modelType: 参见 <context> 的 defaultModelType -->
<!-- 以下属性将对 MyBatis3DynamicSql 和 MyBatis3Kotlin 有效 -->
<!-- 以下属性默认值 false -->
<!-- escapeWildcards: 在搜索列时是否应转义架构和表名中的 SQL 通配符(“_”和“%”),有些驱动要求 -->
<!-- delimitIdentifiers: 分隔标识符 -->
<!-- delimitAllColumns: 分隔所有的列 -->
<table tableName="" domainObjectName="">
<!-- 覆盖 javaModelGenerator 的属性,MyBatis3Kotlin忽略这个属性 -->
<property name="constructorBased" value="false"/>
<!-- 动态SQL支持类的名称,未指定则是 domainObjectName + "DynamicSqlSupport",仅用于 MyBatis3DynamicSQL 或 MyBatis3Kotlin -->
<property name="dynamicSqlSupportClassName" value=""/>
<!-- 动态SQL支持类的内部类的名称,未指定则是 domainObjectName -->
<property name="dynamicSqlTableObjectName" value=""/>
<!-- 不在表名前面添加 catalog 和 schema -->
<property name="ignoreQualifiersAtRuntime" value="false"/>
<!-- 覆盖 javaModelGenerator 的属性,生成的model是不可变的,没有 setter,字段在构造函数里赋值 -->
<property name="immutable" value="false"/>
<!-- 不生成 Mapper 接口, 如果配置了 <sqlMapGenerator> ,xml 文件里面只生成 resultMap,不生成CRUD -->
<property name="modelOnly" value="false"/>
<!-- 覆盖 <javaModelGenerator> 的设置 -->
<property name="rootClass" value=""/>
<!-- 覆盖 <javaClientGenerator> 的设置 -->
<property name="rootInterface" value=""/>
<!-- 设置一个运行时的 catalog,不同于生成时的,下面两个类似 -->
<!-- 如果您想要针对一个 catalo 生成代码,但想要在运行时使用不同的 calalog,这非常有用 -->
<property name="runtimeCatalog" value=""/>
<property name="runtimeSchema" value=""/>
<property name="runtimeTableName" value=""/>
<!-- 添加 sql select 语句的 orderBy 字句-->
<property name="selectAllOrderByClause" value=""/>
<!-- 去除空格,没有默认值。如果设置了,就会覆盖 <javaModelGenerator> 和 <table> 的设置 -->
<property name="trimStrings", value="true"/>
<!-- 默认情况下,会对列名做驼峰式转化,设为true, 则不会转换 -->
<property name="useActualColumnNames" value="false"/>
<!-- 若true,resultMap中使用列索引代替列名 -->
<property name="useColumnIndexes" value="false"/>
<!-- 若true,使用列名和列Remark组成复合的名字 -->
<!-- 这主要用于第四代语言创建的数据库中:列名没有意义,Remark才有意义-->
<property name="useCompoundPropertyNames" value="false"/>
<!-- generatedKey (0..1) 指定数据库中自动生成的列,如 identity 或 sequences -->
<!-- column: 列名 -->
<!-- sqlStatement: sql 语句的类别,一般使用 JDBC 驱动和实际的数据库解耦,此时用JDBC -->
<!-- identity: 如果指定了, 那insert语句就不会设置该列的值, -->
<!-- type: 值为 pre/post 之一,如果指定了值,会被添加到 <selectKey> 元素中,且该元素一直在 insert 语句前面 -->
<generatedKey column="id" sqlStatement="JDBC" identity="false" type="post"/>
<!-- domainObjectRenamingRule (0..1) -->
<!-- 可以用来去掉表名中的一些不需要在Model类名字里面出现的字符,或者添加一些字符 -->
<!-- searchString: 将要被替换掉的字符串, 可使用RE -->
<!-- replaceString: 新的字符串, 不指定则为空串 -->
<domainObjectRenamingRule searchString="" replaceString=""/>
<!-- columnRenamingRule (0..1) -->
<!-- 和 domainObjectRenamingRule 类似,针对列的-->
<columnRenamingRule/>
<!-- (0..N) columnOverride 对指定的列做转换 -->
<!-- column: 列名 -->
<!-- property: 列名映射成java类的属性名。 属于 hardcode, 不理会 useActualColumnNames 的设定 -->
<!-- javaType: java 类里面的数据类型 -->
<!-- jdbcType: JDBC的数据类型 -->
<!-- typeHandler: 类型转换处理器,必须实现了 TypeHandler 接口,如果未指定,则使用默认的 -->
<!-- delimitedColumnName: 默认false,是否分隔列名,空格会自动分隔,不需要设置 -->
<!-- isGeneratedAlways: 指定该列是否是数据库中的 GENERATED ALWAYS 列 -->
<!-- 如果是,就不需要再更新和插入中涉及该列 -->
<!-- 注:GENERATED ALWAYS 由其他列计算而得到的列 -->
<columnOverride column="gender" javaType="com.XXX.yyy.....Gender" typeHandler="">
<!-- 如果为 true,此属性会将 Java 类型添加到生成的映射中 -->
<!-- 这通常是没有必要的。然而,某些函数将需要它,例如当您使用 MyBatis 的 EnumOrdinalTypeHandler 时 -->
<property name="forceJavaTypeIntoMapping", value="false"/>
<!-- 去除空格,没有默认值。如果设置了,就会覆盖 <javaModelGenerator> 和 <table>的设置 -->
<property name="trimStrings", value="true"/>
</columnOverride>
<!-- (0..N) ignoreColumn -->
<!-- column: 列名 -->
<!-- delimitedColumnName: 匹配列名时是否区分大小写 -->
<ignoreColumn colum="" delimitedColumnName="false" />
</table>
</context>
</generatorConfiguration>
Plugin
下面简单整理下下Plugin
为了适应各种数据裤,和新的各式各样的需求,Mybatis Generator 也在不断升级,越来越庞大,使用插件式自然而然的事情。官方提供了一些插件,我们也可以自己实现插件。
官方提供的 Plugin
官方提供的插件都在org.mybatis.generator.plugins下
这里给个简单的快速预览,具体的用法,参见:http://mybatis.org/generator/reference/plugins.html
插件名 | 说明 | MyBatis3 | MyBatis3 | MyBatis3 | MyBatis3 |
---|---|---|---|---|---|
DynamicSql | Kotlin | MyBatis3 | Simple | ||
CacheNamespacePlugin | 向生成的 mapper 接口添加 @CacheNamespace 注解 | ✖ | ✖ | ✔ | ✖ |
CachePlugin | 添加了一个生成 SQL 映射的元素 | ✖ | ✖ | ✔ | ✔ |
CaseInsensitiveLikePlugin | 向 Example 类(实际上是 Criteria 内部类)添加方法以支持不区分大小写的 LIKE 搜索 | ✖ | ✔ | ✔ | ✔ |
EqualsHashCodePlugin | 在Model中添加 equals 和 hashCode 方法 | ✔ | ✖ | ✔ | ✔ |
FluentBuilderMethodsPlugin | 在 Mode l中添加快捷builder方法 | ✔ | ✖ | ✔ | ✔ |
IgnoreViewsPlugin | 忽略视图,使用通配符配置表的情况下用 | ✔ | ✖ | ✔ | ✔ |
MapperAnnotationPlugin | 在Mapper接口上添加@Mapper注解 | ✖ | ✔ | ✔ | ✔ |
MapperConfigPlugin | 生成一个框架 MapperConfig.xml 文件,其中包含对 MBG 生成的 mapper XML 文件的引用 | ✖ | ✔ | ✔ | ✔ |
RenameExampleClassPlugin | 通过重命名 MBG 生成的示例类来演示初始化方法的用法。 | ✖ | ✔ | ✔ | ✔ |
RowBoundsPlugin | 添加一个新版的 selectByExample 方法,该方法接受 RowBounds 参数 | ✖ | ✔ | ✔ | ✔ |
SerializablePlugin | 在 Model 中添加 java.io.Serializable 标记接口 | ✔ | ✔ | ✔ | ✔ |
ToStringPluginorg | 在 Model 中添加 toString 方法 | ✔ | ✔ | ✔ | ✔ |
UnmergeableXmlMappersPlugin | 禁用 mapper XML 文件合并, 变为覆盖 | ✖ | ✖ | ✔ | ✔ |
VirtualPrimaryKeyPlugin | 为没有定义主键的表指定一个主键列 | ✔ | ✔ | ✔ | ✔ |
自定义 Plugin
参考:http://mybatis.org/generator/reference/pluggingIn.html