mybatis代码生成器官网地址:MyBatis Generator Core – Introduction to MyBatis Generator
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息。
上面这一段话来自Mybatis官网
的介绍, 初用Mybatis时感觉这个框架相比于JDBC优雅多了, 用起来也如官网说的非常简单。但是用了一段时间之后, 弊端就慢慢凸显出来了
使用Mybatis时不得不为每个表创建一个Entity.java
、Mapper.xml(Mapper可以融合入Dao中)
、Dao.java
,Service.java
层次很清晰, 但是太多重复性的工作了, 费时间且易于出错,并且当数据库发生一点改动的时候... 苦不堪言,为此提供了代码自动生成器MyBatis Generator
对于MyBatis Generator运行方式,官网给出了如下几种
MyBatis Generator (MBG) can be run in the following ways:
- From the command prompt with an XML configuration
- As an Ant task with an XML configuration
- As a Maven Plugin
- From another Java program with an XML configuration
- From another Java program with a Java based configuration
- As an Eclipse Feature
mybatis-generator-core-x.x.x.jar
和其XML
配置文件,通过命令行运行。Ant
的Task
结合其XML
配置文件运行。Maven
插件运行。Java
代码和其XML
配置文件运行。Java
代码和编程式配置运行。Eclipse Feature
运行。这里介绍两种:
第一种:通过编码+配置文件运行方式
第二种:通过Maven
插件+配置文件方式(推荐)
这里简单说下创建和使用过程,通过编码方式去运行插件先需要引入mybatis-generator-core
依赖,编写本文的时候最新的版本为:1.4.0
org.mybatis.generator
mybatis-generator-core
1.4.0
假设编写好的XML
配置文件是ClassPath
下的generator-configuration.xml
,那么使用代码生成器的编码方式大致如下
List warnings = new ArrayList<>();
// 如果已经存在生成过的文件是否进行覆盖
boolean overwrite = true;
File configFile = new File("ClassPath路径/generator-configuration.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator generator = new MyBatisGenerator(config, callback, warnings);
generator.generate(null);
项目中引入Maven
的插件mybatis-generator-maven-plugin
,不需要引入mybatis-generator-core
依赖,
配置文件
插件配置完毕之后,使用下面的命令即可运行:
mvn mybatis-generator:generate
或者在开发工具,这里用得idea。直接maven projects按钮,弹窗里选择
mybatis-generator-maven-plugin
的更详细配置和可选参数可以参考:
MyBatis Generator Core – Running MyBatis Generator With Maven
XML
配置文件才是Mybatis-Generator
的核心,它用于控制代码生成的所有行为。所有非标签独有的公共配置的Key
可以在mybatis-generator-core
的PropertyRegistry
类中找到。下面是一个相对完整的
配置文件中,最外层的标签为
,它的子标签包括:
标签,用于指定全局配置文件,下面可以通过占位符的形式读取
指定文件中的值。
标签,
只有一个location
属性,用于指定数据源驱动包(jar
或者zip
)的绝对路径,具体选择什么驱动包取决于连接什么类型的数据源。
标签,用于运行时的解析模式和具体的代码生成行为,所以这个标签里面的配置是最重要的。下面分别列举和分析一下
标签和它的主要子标签的一些属性配置和功能。
标签在mybatis-generator-core
中对应的实现类为org.mybatis.generator.config.Context
,它除了大量的子标签配置之外,比较主要的属性是:
id
:Context
示例的唯一ID
,用于输出错误信息时候作为唯一标记。targetRuntime
:用于执行代码生成模式。defaultModelType
:控制Domain
类的生成行为。执行引擎为MyBatis3DynamicSql
或者MyBatis3Kotlin
时忽略此配置,可选值:
conditional
:默认值,类似hierarchical
,但是只有一个主键的时候会合并所有属性生成在同一个类。flat
:所有内容全部生成在一个对象中。hierarchical
:键生成一个XXKey对象,Blob等单独生成一个对象,其他简单属性在一个对象中。targetRuntime
属性的可选值比较多,这里做个简单的小结:
属性 | 功能描述 |
---|---|
MyBatis3DynamicSql |
默认值,兼容JDK8+ 和MyBatis 3.4.2+ ,不会生成XML 映射文件,忽略 的配置项,也就是Mapper 全部注解化,依赖于MyBatis Dynamic SQL 类库 |
MyBatis3Kotlin |
行为类似于MyBatis3DynamicSql ,不过兼容Kotlin 的代码生成 |
MyBatis3 |
提供基本的基于动态SQL 的CRUD 方法和XXXByExample 方法,会生成XML 映射文件 |
MyBatis3Simple |
提供基本的基于动态SQL 的CRUD 方法,会生成XML 映射文件 |
MyBatis3DynamicSqlV1 |
已经过时,不推荐使用 |
标签支持0或N个
标签,
的可选属性有:
property属性 | 功能描述 | 默认值 | 备注 |
---|---|---|---|
autoDelimitKeywords |
是否使用分隔符号括住数据库关键字 | false |
例如MySQL 中会使用反引号括住关键字 |
beginningDelimiter |
分隔符号的开始符号 | " |
|
endingDelimiter |
分隔符号的结束号 | " |
|
javaFileEncoding |
文件的编码 | 系统默认值 |
来源于java.nio.charset.Charset |
javaFormatter |
类名和文件格式化器 | DefaultJavaFormatter |
见JavaFormatter 和DefaultJavaFormatter |
targetJava8 |
是否JDK8和启动其特性 | true |
|
kotlinFileEncoding |
Kotlin 文件编码 |
系统默认值 |
来源于java.nio.charset.Charset |
kotlinFormatter |
Kotlin 类名和文件格式化器 |
DefaultKotlinFormatter |
见KotlinFormatter 和DefaultKotlinFormatter |
xmlFormatter |
XML 文件格式化器 |
DefaultXmlFormatter |
见XmlFormatter 和DefaultXmlFormatter |
标签用于指定数据源的连接信息,它在mybatis-generator-core
中对应的实现类为org.mybatis.generator.config.JDBCConnectionConfiguration
,主要属性包括:
属性 | 功能描述 | 是否必须 |
---|---|---|
driverClass |
数据源驱动的全类名 | Y |
connectionURL |
JDBC 的连接URL |
Y |
userId |
连接到数据源的用户名 | N |
password |
连接到数据源的密码 | N |
标签是可选的,用于控制生成的实体的注释内容。它在mybatis-generator-core
中对应的实现类为org.mybatis.generator.internal.DefaultCommentGenerator
,可以通过可选的type
属性指定一个自定义的CommentGenerator
实现。
标签支持0或N个
标签,
的可选属性有:
property属性 | 功能描述 | 默认值 |
---|---|---|
suppressAllComments |
是否生成注释 | false |
suppressDate |
是否在注释中添加生成的时间戳 | false |
dateFormat |
配合suppressDate 使用,指定输出时间戳的格式 |
java.util.Date#toString() |
addRemarkComments |
是否输出表和列的Comment 信息 |
false |
建议保持默认值,也就是什么注释都不输出,生成代码干净的实体。
标签是
的子标签,用于解析和计算数据库列类型和Java
类型的映射关系,该标签只包含一个type
属性,用于指定org.mybatis.generator.api.JavaTypeResolver
接口的实现类。
标签支持0或N个
标签,
的可选属性有:
property属性 | 功能描述 | 默认值 |
---|---|---|
forceBigDecimals |
是否强制把所有的数字类型强制使用java.math.BigDecimal 类型表示 |
false |
useJSR310Types |
是否支持JSR310 ,主要是JSR310 的新日期类型 |
false |
如果useJSR310Types
属性设置为true
,那么生成代码的时候类型映射关系如下(主要针对日期时间类型):
数据库(JDBC)类型 | Java类型 |
---|---|
DATE |
java.time.LocalDate |
TIME |
java.time.LocalTime |
TIMESTAMP |
java.time.LocalDateTime |
TIME_WITH_TIMEZONE |
java.time.OffsetTime |
TIMESTAMP_WITH_TIMEZONE |
java.time.OffsetDateTime |
引入mybatis-generator-core
后,可以查看JavaTypeResolver
的默认实现为JavaTypeResolverDefaultImpl
,从它的源码可以得知一些映射关系:
BIGINT --> Long
BIT --> Boolean
INTEGER --> Integer
SMALLINT --> Short
TINYINT --> Byte
......
有些时候,我们希望INTEGER
、SMALLINT
和TINYINT
都映射为Integer
,那么我们需要覆盖JavaTypeResolverDefaultImpl
的构造方法:
public class DefaultJavaTypeResolver extends JavaTypeResolverDefaultImpl {
public DefaultJavaTypeResolver() {
super();
typeMap.put(Types.SMALLINT, new JdbcTypeInformation("SMALLINT",
new FullyQualifiedJavaType(Integer.class.getName())));
typeMap.put(Types.TINYINT, new JdbcTypeInformation("TINYINT",
new FullyQualifiedJavaType(Integer.class.getName())));
}
}
注意一点的是这种自定义实现JavaTypeResolver
接口的方式使用编程式运行MBG
会相对方便,如果需要使用Maven
插件运行,那么需要把上面的DefaultJavaTypeResolver
类打包到插件中。
标签是
的子标签,主要用于控制实体(Model
)类的代码生成行为。它支持的属性如下:
属性 | 功能描述 | 是否必须 | 备注 |
---|---|---|---|
targetPackage |
生成的实体类的包名 | Y |
例如club.throwable.model |
targetProject |
生成的实体类文件相对于项目(根目录)的位置 | Y |
例如src/main/java |
标签支持0或N个
标签,
的可选属性有:
property属性 | 功能描述 | 默认值 | 备注 |
---|---|---|---|
constructorBased |
是否生成一个带有所有字段属性的构造函数 | false |
MyBatis3Kotlin 模式下忽略此属性配置 |
enableSubPackages |
是否允许通过Schema 生成子包 |
false |
如果为true ,例如包名为club.throwable ,如果Schema 为xyz ,那么实体类文件最终会生成在club.throwable.xyz 目录 |
exampleTargetPackage |
生成的伴随实体类的Example 类的包名 |
- | - |
exampleTargetProject |
生成的伴随实体类的Example 类文件相对于项目(根目录)的位置 |
- | - |
immutable |
是否不可变 | false |
如果为true ,则不会生成Setter 方法,所有字段都使用final 修饰,提供一个带有所有字段属性的构造函数 |
rootClass |
为生成的实体类添加父类 | - | 通过value 指定父类的全类名即可 |
trimStrings |
Setter 方法是否对字符串类型进行一次trim 操作 |
false |
- |
标签是
的子标签,主要用于控制Mapper
接口的代码生成行为。它支持的属性如下:
属性 | 功能描述 | 是否必须 | 备注 |
---|---|---|---|
type |
Mapper 接口生成策略 |
Y |
标签的targetRuntime 属性为MyBatis3DynamicSql 或者MyBatis3Kotlin 时此属性配置忽略 |
targetPackage |
生成的Mapper 接口的包名 |
Y |
例如club.throwable.mapper |
targetProject |
生成的Mapper 接口文件相对于项目(根目录)的位置 |
Y |
例如src/main/java |
type
属性的可选值如下:
ANNOTATEDMAPPER
:Mapper
接口生成的时候依赖于注解和SqlProviders
(也就是纯注解实现),不会生成XML
映射文件。XMLMAPPER
:Mapper
接口生成接口方法,对应的实现代码生成在XML
映射文件中(也就是纯映射文件实现)。MIXEDMAPPER
:Mapper
接口生成的时候复杂的方法实现生成在XML
映射文件中,而简单的实现通过注解和SqlProviders
实现(也就是注解和映射文件混合实现)。注意两点:
标签的targetRuntime
属性指定为MyBatis3Simple
的时候,type
只能选用ANNOTATEDMAPPER
或者XMLMAPPER
。
标签的targetRuntime
属性指定为MyBatis3
的时候,type
可以选用ANNOTATEDMAPPER
、XMLMAPPER
或者MIXEDMAPPER
。
标签支持0或N个
标签,
的可选属性有:
property属性 | 功能描述 | 默认值 | 备注 |
---|---|---|---|
enableSubPackages |
是否允许通过Schema 生成子包 |
false |
如果为true ,例如包名为club.throwable ,如果Schema 为xyz ,那么Mapper 接口文件最终会生成在club.throwable.xyz 目录 |
useLegacyBuilder |
是否通过SQL Builder 生成动态SQL |
false |
|
rootInterface |
为生成的Mapper 接口添加父接口 |
- | 通过value 指定父接口的全类名即可 |
标签是
的子标签,主要用于控制XML
映射文件的代码生成行为。它支持的属性如下:
属性 | 功能描述 | 是否必须 | 备注 |
---|---|---|---|
targetPackage |
生成的XML 映射文件的包名 |
Y |
例如mappings |
targetProject |
生成的XML 映射文件相对于项目(根目录)的位置 |
Y |
例如src/main/resources |
标签支持0或N个
标签,
的可选属性有:
property属性 | 功能描述 | 默认值 | 备注 |
---|---|---|---|
enableSubPackages |
是否允许通过Schema 生成子包 |
false |
- |
标签是
的子标签,用于引入一些插件对代码生成的一些特性进行扩展,该标签只包含一个type
属性,用于指定org.mybatis.generator.api.Plugin
接口的实现类。内置的插件实现见Supplied Plugins。例如:引入org.mybatis.generator.plugins.SerializablePlugin
插件会让生成的实体类自动实现java.io.Serializable
接口并且添加serialVersionUID
属性。
如果把所有得非长整型的数字,统一使用 此时最好使用编程式运行代码生成器,修改 运行方法代码如下: 数据库的 本文相对详尽地介绍了 参考地址:Mybatis代码生成器Mybatis-Generator使用详解 - throwable - 博客园标签是
的子标签,主要用于配置要生成代码的数据库表格,定制一些代码生成行为等等。它支持的属性众多,列举如下:
属性
功能描述
是否必须
备注
tableName
数据库表名称
Y
例如
t_order
schema
数据库
Schema
N
-
catalog
数据库
Catalog
N
-
alias
表名称标签
N
如果指定了此值,则查询列的时候结果格式为
alias_column
domainObjectName
表对应的实体类名称,可以通过
.
指定包路径N
如果指定了
bar.User
,则包名为bar
,实体类名称为User
mapperName
表对应的
Mapper
接口类名称,可以通过.
指定包路径N
如果指定了
bar.UserMapper
,则包名为bar
,Mapper
接口类名称为UserMapper
sqlProviderName
动态
SQL
提供类SqlProvider
的类名称N
-
enableInsert
是否允许生成
insert
方法N
默认值为
true
,执行引擎为MyBatis3DynamicSql
或者MyBatis3Kotlin
时忽略此配置
enableSelectByPrimaryKey
是否允许生成
selectByPrimaryKey
方法N
默认值为
true
,执行引擎为MyBatis3DynamicSql
或者MyBatis3Kotlin
时忽略此配置
enableSelectByExample
是否允许生成
selectByExample
方法N
默认值为
true
,执行引擎为MyBatis3DynamicSql
或者MyBatis3Kotlin
时忽略此配置
enableUpdateByPrimaryKey
是否允许生成
updateByPrimaryKey
方法N
默认值为
true
,执行引擎为MyBatis3DynamicSql
或者MyBatis3Kotlin
时忽略此配置
enableDeleteByPrimaryKey
是否允许生成
deleteByPrimaryKey
方法N
默认值为
true
,执行引擎为MyBatis3DynamicSql
或者MyBatis3Kotlin
时忽略此配置
enableDeleteByExample
是否允许生成
deleteByExample
方法N
默认值为
true
,执行引擎为MyBatis3DynamicSql
或者MyBatis3Kotlin
时忽略此配置
enableCountByExample
是否允许生成
countByExample
方法N
默认值为
true
,执行引擎为MyBatis3DynamicSql
或者MyBatis3Kotlin
时忽略此配置
enableUpdateByExample
是否允许生成
updateByExample
方法N
默认值为
true
,执行引擎为MyBatis3DynamicSql
或者MyBatis3Kotlin
时忽略此配置
selectByPrimaryKeyQueryId
value
指定对应的主键列提供列表查询功能N
执行引擎为
MyBatis3DynamicSql
或者MyBatis3Kotlin
时忽略此配置
selectByExampleQueryId
value
指定对应的查询ID
提供列表查询功能N
执行引擎为
MyBatis3DynamicSql
或者MyBatis3Kotlin
时忽略此配置
modelType
覆盖
的defaultModelType
属性N
见
的defaultModelType
属性
escapeWildcards
是否对通配符进行转义
N
-
delimitIdentifiers
标记匹配表名称的时候是否需要使用分隔符去标记生成的SQL
N
-
delimitAllColumns
是否所有的列都添加分隔符
N
默认值为
false
,如果设置为true
,所有列名会添加起始和结束分隔符四: 编程式自定义类型映射
Integer
接收,因此需要自定义类型映射。编写映射器如下:public class DefaultJavaTypeResolver extends JavaTypeResolverDefaultImpl {
public DefaultJavaTypeResolver() {
super();
typeMap.put(Types.SMALLINT, new JdbcTypeInformation("SMALLINT",
new FullyQualifiedJavaType(Integer.class.getName())));
typeMap.put(Types.TINYINT, new JdbcTypeInformation("TINYINT",
new FullyQualifiedJavaType(Integer.class.getName())));
}
}
XML
配置文件:public class Main {
public static void main(String[] args) throws Exception {
List
order_status
是TINYINT
类型,生成出来的文件中的orderStatus
字段全部替换使用Integer
类型定义。小结
Mybatis Generator
的使用方式,具体分析了XML
配置文件中主要标签以及标签属性的功能。因为Mybatis
在Java
的ORM
框架体系中还会有一段很长的时间处于主流地位,了解Mybatis Generator
可以简化CRUD
方法模板代码、实体以及Mapper
接口代码生成,从而解放大量生产力。Mybatis Generator
有不少第三方的扩展,例如tk.mapper
或者mybatis-plus
自身的扩展,可能附加的功能不一样,但是基本的使用是一致的。你可能感兴趣的:(#,ssm,jpa,jdbctemplate,java,intellij-idea,maven)