前言
工欲善其事必先利其器,介绍几个常用插件,提高开发效率。
- MyBatis-Generator(MBG)
- MyBatis-PageHelper
- Free-MyBatis-Plugin
1. MyBatis-Generator
MyBatis Generator官网
http://mybatis.org/generator/index.html
建议:应用为主,直接看第4部分-实战
1. 简介
Mybatis-Generator是Mybatis提供的一个便捷型插件,自动可以为项目生产对应的实体类,Mapper,dao层。
2. XML配置解析
在MBG中,最主要也最重要的就是XML配置文件,因此先解析下XML配置文件。
1. 配置文件头
1 | <?xml version="1.0" encoding="UTF-8"?> |
使用最新版的MBG需要使用上面的xml头,配置文件必须包含上面的DOCTYPE
。
2. 根节点
generatorConfiguration
节点没有任何属性,直接写节点名称即可。
1 | <generatorConfiguration> |
3. 子元素
从这里就是配置的主要内容,这些配置都是generatorConfiguration
元素的子元素。
包含以下子元素(有严格的顺序):
<properties>
(0个或1个)<classPathEntry>
(0个或多个)<context>
(1个或多个)
1 <properties>
元素:用于指定外部的属性元素,非必须。
用于指定一个需要在配置中解析使用的外部属性文件,引入属性文件后,可以在配置中使用 ${property}
这种形式的引用,通过这种方式引用属性文件中的属性值。 对于后面需要配置的jdbc信息会很有用。
2 <classPathEntry>
元素:指定驱动的路径,非必须。
1 | # 常见用法 |
两种情况才会生效:
- 当加载 JDBC 驱动内省数据库时
- 当加载根类中的 JavaModelGenerator 检查重写的方法时
3 <context>
元素:必须有,至少1个。
<context>
元素用于指定生成一组对象的环境。例如指定要连接的数据库,要生成对象的类型和要处理的数据库中的表。运行MBG的时候还可以指定要运行的<context>
。
该元素只有一个必选属性id
,用来唯一确定一个<context>
元素,该id
属性可以在运行MBG的使用。
此外还有几个可选属性:
defaultModelType
:这个属性很重要,这个属性定义了MBG如何生成实体类。
这个属性有以下可选值:conditional: 这是默认值,如果一个表的主键只有一个字段,那么不会为该字段生成单独的实体类,会将该字段合并到基本实体类中。
flat: 该模型为每一张表只生成一个实体类。这个实体类包含表中的所有字段。推荐使用。
hierarchical:如果表有主键,那么该模型会产生一个单独的主键实体类,如果表还有BLOB字段, 则会为表生成一个包含所有BLOB字段的单独的实体类,然后为所有其他的字段生成一个单独的实体类。 MBG会在所有生成的实体类之间维护一个继承关系。
targetRuntime
:此属性用于指定生成的代码的运行时环境。该属性支持以下可选值:MyBatis3
: 这是默认值MyBatis3Simple
Ibatis2Java2
一般用法:
1 | <context id="mysql" targetRuntime="MyBatis3" defaultModelType="flat"> |
如果希望不生成和Example
查询有关的内容,那么可以按照如下进行配置:
1 | <context id="mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat"> |
使用MyBatis3Simple
可以避免在后面的<table>
中逐个进行配置。
<context>
的子元素,这些子元素(有严格的配置顺序)
<property>
(0个或多个)<plugin>
(0个或多个)<commentGenerator>
(0个或多个)<jdbcConnection>
(1个)<javaTypeResolver>
(0个或1个)<javaModelGenerator>
(1个)<sqlMapGenerator>
(0个或1个)<javaClientGenerator>
(0个或1个)<table>
(1个或多个)
1 <property>
支持的属性
autoDelimitKeywords
:当表名或者字段名为SQL关键字的时候,可以设置该属性为true,MBG会自动给表名或字段名添加分隔符。beginningDelimiter
endingDelimiter
由于beginningDelimiter
和endingDelimiter
的默认值为双引号("
),在Mysql中不能这么写,所以还要将这两个默认值改为反单引号(`),配置如下:
1 | <property name="beginningDelimiter" value="`"/> |
javaFileEncoding
:设置要使用的Java文件的编码,默认使用当前平台的编码,只有当生产的编码需要特殊指定时才需要使用,一般用不到。javaFormatter
xmlFormatter
如果想使用模板来定制生成的java文件和xml文件的样式,你可以通过指定这两个属性的值来实现。
2 <plugin>
定义插件,用于扩展或修改通过MyBatis Generator (MBG)代码生成器生成的代码。
1 | <!--生成的POJO实现java.io.Serializable接口--> |
3 <commentGenerator>
:可定制化开发自己的表、字段注释信息
该元素有一个可选属性 type ,可以指定用户的实现类,该类需要实现org.mybatis.generator.api.CommentGenerator接口。而且必有一个默认的构造方法。这个属性接收默认的特殊值DEFAULT,会使用默认的实现类org.mybatis.generator.internal.DefaultCommentGenerator。(定制化开发很有用)
一般默认的写法:
1 | <commentGenerator> |
简单举例实现生成包含表字段注释信息的注释
因为系统提供了一个默认的实现类,所以对我们来说,自己实现一个会很容易,最简单的方法就是复制默认实现类代码到一个新的文件中,修改类名如MyCommentGenerator
,在你自己的实现类中,你可以选择是否继续支持上面的两个属性,你还可以增加对其他属性的支持。
1 |
|
这个方法是给字段添加注释信息的,其中IntrospectedColumn
包含了字段的完整信息,通过getRemarks
方法可以获取字段的注释信息。上面这个方法修改起来还是很容易的。除了字段的注释外还有Getter
和Setter
,以及类的注释。此外还有生成XML的注释,可自行根据默认实现进行修改。
完成我们自己的实现类后,还需指定实现类:
1 | <commentGenerator type="com.mybatis.generator.MyCommentGenerator"/> |
4 <table>
元素
该元素用来配置要通过内省的表。只有配置的才会生成实体类和其他文件。
tableName: 指定要生成的表名,可以使用SQL通配符匹配多个表
1 | <table tableName="%" /> |
该元素包含多个可选属性:
- schema:数据库的schema,可以使用SQL通配符匹配。如果设置了该值,生成SQL的表名会变成如schema.tableName的形式。
catalog:数据库的catalog,如果设置了该值,生成SQL的表名会变成如catalog.tableName的形式。
alias:如果指定,这个值会用在生成的select查询SQL的表的别名和列名上。 列名会被别名为 alias_actualColumnName(别名_实际列名) 这种模式。
domainObjectName:生成对象的基本名称。如果没有指定,MBG会自动根据表名来生成名称。
enableXXX:XXX代表多种SQL方法,该属性用来指定是否生成对应的XXX语句。
selectByPrimaryKeyQueryId:DBA跟踪工具会用到
selectByExampleQueryId:DBA跟踪工具会用到
modelType: 和
的defaultModelType含义一样,这里可以针对表进行配置,这里的配置会覆盖 的defaultModelType配置。 escapeWildcards:这个属性表示当查询列,是否对schema和表名中的SQL通配符 (‘_’ and ‘%’) 进行转义。 对于某些驱动当schema或表名中包含SQL通配符时(例如,一个表名是MY_TABLE,有一些驱动需要将下划线进行转义)是必须的。默认值是false。
delimitIdentifiers:是否给标识符增加分隔符。默认false。当catalog,schema或tableName中包含空白时,默认为true。
delimitAllColumns:是否对所有列添加分隔符。默认false。
该元素包含多个可用的<property>
子元素,可选属性为:
constructorBased:和
中的属性含义一样。 ignoreQualifiersAtRuntime:生成的SQL中的表名将不会包含schema和catalog前缀。
immutable:和
中的属性含义一样。
modelOnly:此属性用于配置是否为表只生成实体类。如果设置为true就不会有Mapper接口。如果配置了,并且modelOnly为true,那么XML映射文件中只有实体对象的映射元素( )。如果为true还会覆盖属性中的enableXXX方法,将不会生成任何CRUD方法。 rootClass:和
中的属性含义一样。 rootInterface:和
中的属性含义一样。
runtimeCatalog:运行时的catalog,当生成表和运行环境的表的catalog不一样的时候可以使用该属性进行配置。runtimeSchema:运行时的schema,当生成表和运行环境的表的schema不一样的时候可以使用该属性进行配置。
runtimeTableName:运行时的tableName,当生成表和运行环境的表的tableName不一样的时候可以使用该属性进行配置。
selectAllOrderByClause:该属性值会追加到selectAll方法后的SQL中,会直接跟order by拼接后添加到SQL末尾。
useActualColumnNames:如果设置为true,那么MBG会使用从数据库元数据获取的列名作为生成的实体对象的属性。 如果为false(默认值),MGB将会尝试将返回的名称转换为驼峰形式。 在这两种情况下,可以通过 元素显示指定,在这种情况下将会忽略这个(useActualColumnNames)属性。
useColumnIndexes:如果是true,MBG生成resultMaps的时候会使用列的索引,而不是结果中列名的顺序。
useCompoundPropertyNames:如果是true,那么MBG生成属性名的时候会将列名和列备注接起来. 这对于那些通过第四代语言自动生成列(例如:FLD22237),但是备注包含有用信息(例如:”customer id”)的数据库来说很有用. 在这种情况下,MBG会生成属性名FLD2237_CustomerId。
除了<property>
子元素外,<table>
还包含以下子元素:
1 <generatedKey>
元素
这个元素最多可以配置一个。
这个元素用来指定自动生成主键的属性(identity字段或者sequences序列)。如果指定这个元素,MBG在生成insert的SQL映射文件中插入一个<selectKey>
元素。 这个元素非常重要,这个元素包含下面两个必选属性:
column:生成列的列名。
sqlStatement:将返回新值的 SQL 语句。如果这是一个identity列,您可以使用其中一个预定义的的特殊值。预定义值如下:
- Cloudscape
- DB2
- DB2_MF
- Derby
- HSQLDB
- Informix
- MySql
- SqlServer
- SYBASE
- JDBC:这会配置MBG使用MyBatis3支持的JDBC标准的生成key来生成代码。 这是一个独立于数据库获取标识列中的值的方法。 重要: 只有当目标运行为MyBatis3时才会产生正确的代码。 如果与iBATIS2一起使用目标运行时会产生运行时错误的代码。
这个元素还包含两个可选属性:
identity:当设置为true时,该列会被标记为identity列, 并且
元素会被插入在insert后面。 当设置为false时, 会插入到insert之前(通常是序列)。重要: 即使您type属性指定为post,您仍然需要为identity列将该参数设置为true。 这将标志MBG从插入列表中删除该列。默认值是false。 type:type=post and identity=true的时候生成的
中的order=AFTER,当type=pre的时候,identity只能为false,生成的 中的order=BEFORE。可以这么理解,自动增长的列只有插入到数据库后才能得到ID,所以是AFTER,使用序列时,只有先获取序列之后,才能插入数据库,所以是BEFORE。
2 <columnRenamingRule>
元素
该元素最多可以配置一个,使用该元素可以在生成列之前,对列进行重命名。这对那些存在同一前缀的字段想在生成属性名时去除前缀的表非常有用。
<columnOverride>
元素
该元素可选,可以配置多个。该元素从将某些属性默认计算的值更改为指定的值。
该元素有一个必选属性:
column
:要重写的列名。
<ignoreColumn>
元素
该元素可选,可以配置多个。该元素可以用来屏蔽不需要生成的列。
该元素有一个必选属性:
column
:要忽略的列名。
3. 用法
建议:
1 | table标签下的设置属性useActualColumnNames用于指定生成实体类时是否使用实际的列名作为实体类的属性名,取值true或false。 |
1. Pom文件添加 jar 和 plugin
jar
1 | <dependencies> |
plugin
1 | <build> |
2. 在上述 configurationFile指定位置创建xml配置文件。
xml内容:
3.application.yml配置
1. Maven插件方式运行
双击 mybatis-generator:generate
2. MyBatis-PageHelper
方式1:使用原生的PageHelper
- 在pom.xml中引入依赖
1 | <dependency> |
- 在项目里面添加配置
1 | @Configuration |
方式2:使用PageHelper的starter
- 在pom.xml中引入依赖
1 | <dependency> |
- 在application.properties或者application.yml格式配置pagehelper的属性
1 | #pagehelper分页插件配置 |
1 | # 分页配置 |
使用
最后就是使用pagehelper进行分页了,其中最重要的一句就是
1 | # pageNum:当前页数 pageSize:当前页需要显示的数量 |
例如:
1 | public PageInfo<Blog> ajaxBlog(Integer pageNum,Integer pageSize){ |
3. Free-MyBatis-Plugin
https://gitee.com/wuzhizhan/free-mybatis-plugin
1. 简介
A idea plugin for mybatis . free-mybatis-plugin 是一款增强idea对mybatis支持的插件,主要功能如下:
- 生成mapper xml文件
- 快速从代码跳转到mapper及从mapper返回代码
- mybatis自动补全及语法错误提示
2. 使用方法
free-mybatis-plugin是一个提高mybatis编码的插件。实现了dao代码跳转到mapper,mapper跳转回dao,mapper文件、statement查询自动生成功能。
灵活使用alt+enter和ctrl+B实现提示和跳转
自动生成Mybatis代码
打开idea的Database,连接上数据库后,选中对应的表右键,如图所示:
点击mybatis-generator
,会弹出要生成代码的配置窗口,如图所示:
已经在图片中写好了注解,基本上按照图片中的操作即可生成可用的代码
在左侧栏中会记录已经生成过的配置,双击即可加载