通用Mapper集成Springboot
SpringBoot集成
Spring Boot 在微服务领域中已经成为主流。
这里介绍通用 Mapper 如何同 Spring Boot 进行集成。
为了能适应各种情况的用法,这里也提供了多种集成方式,基本上分为两大类。
- 基于 starter 的自动配置
- 基于
@MapperScan
注解的手工配置
1.3.1 mapper-spring-boot-starter
在 starter 的逻辑中,如果你没有使用
@MapperScan
注解,你就需要在你的接口上增加@Mapper
注解,否则 MyBatis 无法判断扫描哪些接口。这里的第一种用法没有用
@MapperScan
注解,所以你需要在所有接口上增加@Mapper
注解。以后会考虑增加其他方式。
你只需要添加通用 Mapper 提供的 starter 就完成了最基本的集成,依赖如下:
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
从下面链接查看最新的版本号
http://mvnrepository.com/artifact/tk.mybatis/mapper-spring-boot-starter
如果你需要对通用 Mapper 进行配置,你可以在 Spring Boot 的配置文件中配置 mapper.
前缀的配置。
在yml中配置
mapper:
mappers:
- tk.mybatis.mapper.common.Mapper
- tk.mybatis.mapper.common.Mapper2
notEmpty: true
现在就可以开始使用了
-
创建好Springboot项目
-
配置application.yml
server:
port: 8989
spring:
datasource:
username: root
password: ${你的密码}
url: jdbc:mysql://localhost:3306/${你的数据库}
driver-class-name: com.mysql.cj.jdbc.Driver
mapper:
mappers:
- tk.mybatis.mapper.common.Mapper
notEmpty: true
- 创建数据库
CREATE TABLE `country` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`countryname` varchar(255) DEFAULT NULL COMMENT '名称',
`countrycode` varchar(255) DEFAULT NULL COMMENT '代码',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=10011 DEFAULT CHARSET=utf8 COMMENT='国家信息';
如下图
- 创建实体类Country.java
最简单的情况下,只需要一个 @Id
标记字段为主键即可。数据库中的字段名和实体类的字段名是完全相同的,这中情况下实体和表可以直接映射。
- 定义一个接口CountryMapper 继承Mapper
package com.zhangxuhui.vuetest.demo.Mapper;
import com.zhangxuhui.vuetest.demo.entity.Country;
import tk.mybatis.mapper.common.Mapper;
/**
* @author: AmberZxh
* @DateTime: 2021/1/31 8:23 下午
* @description:
*/
@Repository
public interface CountryMapper extends Mapper<Country> {
}
import tk.mybatis.mapper.common.Mapper;
不要import错了
如果想要增加自己写的方法,可以直接在 CountryMapper
中增加。
1. 使用纯接口注解方式时
import org.apache.ibatis.annotations.Select;
import tk.mybatis.mapper.common.Mapper;
public interface CountryMapper extends Mapper<Country> {
@Select("select * from country where countryname = #{countryname}")
Country selectByCountryName(String countryname);
}
2. 使用XML的方式,我不怎么会,会的自己研究,略,(我也不是不会,就是不想搞,嘻嘻)
- test一下里面的方法
TkMapperTest.java
package com.zhangxuhui.vuetest.demo;
import com.zhangxuhui.vuetest.demo.mapper.CountryMapper;
import com.zhangxuhui.vuetest.demo.entity.Country;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
/**
* @author: AmberZxh
* @DateTime: 2021/1/31 8:27 下午
* @description:
*/
@SpringBootTest
public class TkMapperTest {
@Autowired
CountryMapper countryMapper;
@Test
public void oneTest(){
List<Country> countries = countryMapper.selectAll();
countries.forEach(System.out::println);
}
}
运行结果
成功输出
这里我遇到了一个问题,是因为扫描不到bean,在启动项里这么加就可以了
@tk.mybatis.spring.annotation.MapperScan(basePackages = "com.zhangxuhui.vuetest.demo.mapper")
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@tk.mybatis.spring.annotation.MapperScan(basePackages = ${你的mapperl路径})
数据库映射
通用 Mapper 中,默认情况下是将实体类字段按照驼峰转下划线形式的表名列名进行转换。
例如
实体类的
userName
可以映射到表的user_name
上。如果想要修改默认的转换方式,可以在后续的配置中,修改
style
全局配置
@NameStyle
注解(Mapper)
注解支持以下几个选项:
normal, //原值
camelhump, //驼峰转下划线
uppercase, //转换为大写
lowercase, //转换为小写
camelhumpAndUppercase, //驼峰转下划线大写形式
camelhumpAndLowercase, //驼峰转下划线小写形式
使用时,直接在类上配置即可,例如:
@NameStyle(Style.camelhumpAndUppercase)
public class Country
@ColumnType
注解(Mapper)
这个注解提供的 column
属性和 @Column
中的 name
作用相同。但是 @Column
的优先级更高。
除了 name
属性外,这个注解主要提供了 jdbcType
属性和 typeHandler
属性。
jdbcType
用于设置特殊数据库类型时指定数据库中的 jdbcType
。
typeHandler
用于设置特殊类型处理器,常见的是枚举。
用法示例如下:
@ColumnType(
column = "countryname",
jdbcType = JdbcType.VARCHAR,
typeHandler = StringTypeHandler.class)
private String countryname;
@Id
注解(JPA)
上面几个注解都涉及到映射。 @Id
注解和映射无关,它是一个特殊的标记,用于标识数据库中的主键字段。
正常情况下,一个实体类中至少需要一个标记 @Id
注解的字段,存在联合主键时可以标记多个。
如果表中没有主键,类中就可以不标记。
当类中没有存在标记 @Id
注解的字段时,你可以理解为类中的所有字段是联合主键。使用所有的 ByPrimaryKey
相关的方法时,有 where
条件的地方,会将所有列作为条件。
配置示例:
@Id
private Integer id;
或者联合主键:
@Id
private Integer userId;
@Id
private Integer roleId;
@KeySql
注解
主键策略注解,用于配置如何生成主键。
这是通用 Mapper 的自定义注解,改注解的目的就是替换 @GeneratedValue
注解。
@Version
注解(Mapper)
@Version
是实现乐观锁的一个注解,大多数人都不需要。
主键策略
首先主键策略和数据库关系很大,有些数据库支持主键自增,而有些数据库只能通过序列来获得。
新增的@KeySql
注解用于替换 @GeneratedValue
注解,因此 @KeySql
能以更简单方式实现原来的功能,下面的示例都先使用 @KeySql
进行配置,然后在使用 @GeneratedValue
,大家可以自己选择。
JDBC 支持通过 getGeneratedKeys
方法取回主键的情况
这种情况首先需要数据库支持自增,其次数据库提供的 JDBC 支持 getGeneratedKeys
方法。
常见的如 MySql,SqlServer 支持这种模式。
这种情况下,配置主键策略最简单。
用法如下:
@Id
@KeySql(useGeneratedKeys = true)
private Long id;
或:
@Id
@GeneratedValue(generator = "JDBC")
private Long id;
为了让大家容易理解这里配置和 MyBatis 写法的关系,大家可以看看对应生成的 XML 代码:
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into country (id, countryname, countrycode)
values (#{id},#{countryname},#{countrycode})
</insert>
SqlServer 中使用时,需要设置 id 的
insertable=false
通用Mapper整和MBG(mybatisgenertor)
引入pom依赖
看注释
<!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.6</version>
</dependency>
<!-- 通用 Mapper -->
<!-- https://mvnrepository.com/artifact/tk.mybatis/mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.0.0</version>
</dependency>
<!-- 如果你只需要用到通用 Mapper 中的插件,可以只引入 mapper-generator -->
<!-- 注意,这个包不需要和上面的 mapper 同时引入,mapper 中包含 generator -->
<!-- https://mvnrepository.com/artifact/tk.mybatis/mapper-generator -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-generator</artifactId>
<version>1.0.0</version>
</dependency>
pom依赖好了之后,通过使用 Maven 执行MBG
在pom里引用如下的插件
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<configurationFile>
${basedir}/src/main/resources/generator/generatorConfig.xml
</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.1.2</version>
</dependency>
</dependencies>
</plugin>
这里要求在resources下创建/generator/generatorConfig.xml
来看一下这个generatorConfig.xml是啥
官网给出的模版
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<properties resource="config.properties"/>
<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
<property name="caseSensitive" value="true"/>
</plugin>
<jdbcConnection driverClass="${jdbc.driverClass}"
connectionURL="${jdbc.url}"
userId="${jdbc.user}"
password="${jdbc.password}">
</jdbcConnection>
<javaModelGenerator targetPackage="com.isea533.mybatis.model"
targetProject="src/main/java"/>
<sqlMapGenerator targetPackage="mapper"
targetProject="src/main/resources"/>
<javaClientGenerator targetPackage="com.isea533.mybatis.mapper"
targetProject="src/main/java"
type="XMLMAPPER"/>
<table tableName="user_info">
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
</context>
</generatorConfiguration>
我自己的generatorConfig.xml
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!--引用配置文件-->
<properties resource="config.properties"/>
<!--推荐这么写 flat:该模型为每一张表只生成一个实体类。这个实体类包含表中的所有字段。这种模型最简单,推荐使用。-->
<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<!--mysql里不支持“ 所以将“都改成了’-->
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<!--插件信息,不用过分关注-->
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
<property name="caseSensitive" value="true"/>
</plugin>
<!--配置mysql数据库参数,配合配置文件-->
<jdbcConnection driverClass="${jdbc.driverClass}"
connectionURL="${jdbc.url}"
userId="${jdbc.user}"
password="${jdbc.password}">
</jdbcConnection>
<!--生成实体类的位置-->
<javaModelGenerator targetPackage="com.example.zxh.demo.entity"
targetProject="src/main/java"/>
<!--生成mybatis XML文件的位置-->
<sqlMapGenerator targetPackage="mapper"
targetProject="src/main/resources"/>
<!--生成DAO接口的文件和位置-->
<javaClientGenerator targetPackage="com.example.zxh.demo.mybatis.mapper"
targetProject="src/main/java"
type="XMLMAPPER"/>
<!--需要自动生成映射的表,可以用%生成所有,具体看最后的XML文档解释-->
<table tableName="country">
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
</context>
</generatorConfiguration>
config.properties
配置文件
jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/cskaoyan
jdbc.user=root
jdbc.password=zxh228..
运行
在 pom.xml 这一级目录的命令行窗口执行
mvn mybatigenerator:generate
即可(前提是配置了mvn)。
这样就完成了自动生成
分析XML文件
1. 配置头文件
使用最新版的MBG需要使用上面的xml头,配置文件必须包含上面的DOCTYPE
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
2. 根结点 generatorConfiguration
generatorConfiguration
节点没有任何属性,直接写节点即可,如下:
<generatorConfiguration>
<!-- 具体配置内容 -->
</generatorConfiguration>
3. generatorConfiguration子元素
properties元素
这个元素用来指定外部的属性元素,不是必须元素
元素用于指定一个需要在配置中解析使用的外部属性文件,引入属性文件后,可以在配置中使用 ${property}
这种形式的引用,通过这种方式引用属性文件中的属性值。 对于后面需要配置的jdbc信息和targetProject
属性会很有用。
这个属性可以通过resource
或者url
来指定属性文件的位置,这两个属性只能使用其中一个来指定,同时出现会报错。
resource
:指定classpath下的属性文件,使用类似com/myproject/generatorConfig.properties
这样的属性值。url
:可以指定文件系统上的特定位置,例如file:///C:/myfolder/generatorConfig.properties
classPathEntry元素
这个元素可以0或多个,不受限制。
最常见的用法是通过这个属性指定驱动的路径,例如:
<classPathEntry location="E:\mysql\mysql-connector-java-5.1.29.jar"/>
***注意,classPathEntry只*在下面这两种情况下才有效:
- 当加载 JDBC 驱动内省数据库时
- 当加载根类中的 JavaModelGenerator 检查重写的方法时
**因此,**如果你需要加载其他用途的jar包,classPathEntry起不到作用,不能这么写,解决的办法就是将你用的jar包添加到类路径中,在Eclipse等IDE中运行的时候,添加jar包比较容易。当从命令行执行的时候,需要用java -cp xx.jar,xx2.jar xxxMainClass这种方式在-cp后面指定来使用(注意-jar会导致-cp无效)。
context元素
在MBG的配置中,至少需要有一个<context>
元素。
<context>
元素用于指定生成一组对象的环境。例如指定要连接的数据库,要生成对象的类型和要处理的数据库中的表。运行MBG的时候还可以指定要运行的<context>
。
该元素只有一个必选属性id
,用来唯一确定一个<context>
元素,该id
属性可以在运行MBG的使用。
此外还有几个可选属性:
defaultModelType
:这个属性很重要,这个属性定义了MBG如何生成实体类。
这个属性有以下可选值:conditional
:这是默认值,这个模型和下面的hierarchical
类似,除了如果那个单独的类将只包含一个字段,将不会生成一个单独的类。 因此,如果一个表的主键只有一个字段,那么不会为该字段生成单独的实体类,会将该字段合并到基本实体类中。flat
:该模型为每一张表只生成一个实体类。这个实体类包含表中的所有字段。这种模型最简单,推荐使用。hierarchical
:如果表有主键,那么该模型会产生一个单独的主键实体类,如果表还有BLOB字段, 则会为表生成一个包含所有BLOB字段的单独的实体类,然后为所有其他的字段生成一个单独的实体类。 MBG会在所有生成的实体类之间维护一个继承关系。targetRuntime
:此属性用于指定生成的代码的运行时环境。该属性支持以下可选值:MyBatis3
:这是默认值MyBatis3Simple
Ibatis2Java2
Ibatis2Java5
一般情况下使用默认值即可
introspectedColumnImpl
:该参数可以指定扩展org.mybatis.generator.api.IntrospectedColumn
该类的实现类
一般情况下,我们使用如下的配置即可:
<context id="Mysql" defaultModelType="flat">
如果你希望不生成和Example
查询有关的内容,那么可以按照如下进行配置:
<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
使用MyBatis3Simple
可以避免在后面的<table>
中逐个进行配置(后面会提到)。
MBG配置中的其他几个元素,基本上都是<context>
的子元素,这些子元素(有严格的配置顺序)包括:
- property (0个或多个)
- plugin (0个或多个)
- commentGenerator (0个或1个)
- jdbcConnection (1个)
- javaTypeResolver (0个或1个)
- javaModelGenerator (2个)
- sqlMapGenerator (0个或1个)
- javaClientGenerator (0个或1个)
- Table (1个或多个)
其中<property>
属性比较特殊,后面讲解的时候都会和父元素一起进行讲解。在讲解<property>
属性前,我们先看看什么是分隔符?。
这里通过一个例子说明。假设在Mysql数据库中有一个表名为user info
,你没有看错,中间是一个空格,这种情况下如果写出select * from user info
这样的语句,肯定是要报错的,在Mysql中的时候我们一般会写成如下的样子:
select * from `user info`
这里的使用的反单引号(`)就是分隔符,分隔符可以用于表名或者列名。
下面继续看<property>
支持的属性:
- autoDelimitKeywords
- beginningDelimiter
- endingDelimiter
- javaFileEncoding
- javaFormatter
- xmlFormatter
由于这些属性比较重要,这里一一讲解。
首先是autoDelimitKeywords
,当表名或者字段名为SQL关键字的时候,可以设置该属性为true,MBG会自动给表名或字段名添加分隔符。
然后这里继续上面的例子来讲beginningDelimiter
和endingDelimiter
属性。
由于beginningDelimiter
和endingDelimiter
的默认值为双引号("
),在Mysql中不能这么写,所以还要将这两个默认值改为反单引号(`),配置如下:
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
属性javaFileEncoding
设置要使用的Java文件的编码,默认使用当前平台的编码,只有当生产的编码需要特殊指定时才需要使用,一般用不到。
最后两个javaFormatter
和xmlFormatter
属性可能会很有用,如果你想使用模板来定制生成的java文件和xml文件的样式,你可以通过指定这两个属性的值来实现。
接下来分节对其他的子元素逐个进行介绍。
plugin元素
该元素可以配置0个或者多个,不受限制。
<plugin>
元素用来定义一个插件。插件用于扩展或修改通过MyBatis Generator (MBG)代码生成器生成的代码。
插件将按在配置中配置的顺序执行。
commentGenerator元素
该元素最多可以配置1个。
这个元素非常有用,相信很多人都有过这样的需求,就是希望MBG生成的代码中可以包含注释信息,具体就是生成表或字段的备注信息。
使用这个元素就能很简单的实现我们想要的功能。这里先介绍该元素,介绍完后会举例如何扩展实现该功能。
该元素有一个可选属性type
,可以指定用户的实现类,该类需要实现org.mybatis.generator.api.CommentGenerator
接口。而且必有一个默认的构造方法。这个属性接收默认的特殊值DEFAULT
,会使用默认的实现类org.mybatis.generator.internal.DefaultCommentGenerator
。
默认的实现类中提供了两个可选属性,需要通过<property>
属性进行配置。
suppressAllComments
:阻止生成注释,默认为false
suppressDate
:阻止生成的注释包含时间戳,默认为false
一般情况下由于MBG生成的注释信息没有任何价值,而且有时间戳的情况下每次生成的注释都不一样,使用版本控制的时候每次都会提交,因而一般情况下我们都会屏蔽注释信息,可以如下配置:
<commentGenerator>
<property name="suppressAllComments" value="true"/>
<property name="suppressDate" value="true"/>
</commentGenerator>
jdbcConnection元素
<jdbcConnection>
用于指定数据库连接信息,该元素必选,并且只能有一个。
配置该元素只需要注意如果JDBC驱动不在classpath下,就需要通过<classPathEntry>
元素引入jar包,这里推荐将jar包放到classpath下。
该元素有两个必选属性:
driverClass
:访问数据库的JDBC驱动程序的完全限定类名connectionURL
:访问数据库的JDBC连接URL
该元素还有两个可选属性:
userId
:访问数据库的用户IDpassword
:访问数据库的密码
此外该元素还可以接受多个<property>
子元素,这里配置的<property>
属性都会添加到JDBC驱动的属性中。
这个元素配置起来最容易,这里举个简单例子:
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/test"
userId="root"
password="">
</jdbcConnection>
javaTypeResolver元素
该元素最多可以配置一个。
这个元素的配置用来指定JDBC类型和Java类型如何转换。
该元素提供了一个可选的属性type
,和<commentGenerator>
比较类型,提供了默认的实现DEFAULT
,一般情况下使用默认即可,需要特殊处理的情况可以通过其他元素配置来解决,不建议修改该属性。
该属性还有一个可以配置的<property>
元素。
可以配置的属性为forceBigDecimals
,该属性可以控制是否强制DECIMAL
和NUMERIC
类型的字段转换为Java类型的java.math.BigDecimal
,默认值为false
,一般不需要配置。
默认情况下的转换规则为:
- 如果
精度>0
或者长度>18
,就会使用java.math.BigDecimal
- 如果
精度=0
并且10<=长度<=18
,就会使用java.lang.Long
- 如果
精度=0
并且5<=长度<=9
,就会使用java.lang.Integer
- 如果
精度=0
并且长度<5
,就会使用java.lang.Short
如果设置为true
,那么一定会使用java.math.BigDecimal
,配置示例如下:
<javaTypeResolver >
<property name="forceBigDecimals" value="true" />
</javaTypeResolver>
javaModelGenerator元素
该元素必须配置一个,并且最多一个。
该元素用来控制生成的实体类,根据<context>
中配置的defaultModelType
,一个表可能会对应生成多个不同的实体类。一个表对应多个类实际上并不方便,所以前面也推荐使用flat
,这种情况下一个表对应一个实体类。(flat
:该模型为每一张表只生成一个实体类。这个实体类包含表中的所有字段。这种模型最简单,推荐使用。)
该元素只有两个属性,都是必选的。
targetPackage
:生成实体类存放的包名,一般就是放在该包下。实际还会受到其他配置的影响(<table>
中会提到)。targetProject
:指定目标项目路径,可以是绝对路径或相对路径(如 targetProject=“src/main/java”)。
该元素支持以下几个<property>
子元素属性:
constructorBased
:该属性只对MyBatis3
有效,如果true
就会使用构造方法入参,如果false
就会使用setter
方式。默认为false
。enableSubPackages
:如果true
,MBG会根据catalog
和schema
来生成子包。如果false
就会直接用targetPackage
属性。默认为false
。immutable
:该属性用来配置实体类属性是否可变,如果设置为true
,那么constructorBased
不管设置成什么,都会使用构造方法入参,并且不会生成setter
方法。如果为false
,实体类属性就可以改变。默认为false
。rootClass
:设置所有实体类的基类。如果设置,需要使用类的全限定名称。并且如果MBG能够加载rootClass
,那么MBG不会覆盖和父类中完全匹配的属性。匹配规则:- 属性名完全相同
- 属性类型相同
- 属性有
getter
方法 - 属性有
setter
方法
trimStrings
:是否对数据库查询结果进行trim
操作,如果设置为true
就会生成类似这样public void setUsername(String username) {this.username = username == null ? null : username.trim();}
的setter
方法。默认值为false
。
配置示例如下:
<javaModelGenerator targetPackage="test.model" targetProject="src\main\java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
sqlMapGenerator元素
该元素可选,最多配置一个。但是有如下两种必选的特殊情况:
- 如果
targetRuntime
目标是iBATIS2,该元素必须配置一个。 - 如果
targetRuntime
目标是MyBatis3,只有当<javaClientGenerator>
需要XML时,该元素必须配置一个。 如果没有配置<javaClientGenerator>
,则使用以下的规则:- 如果指定了一个
<sqlMapGenerator>
,那么MBG将只生成XML的SQL映射文件和实体类。 - 如果没有指定
<sqlMapGenerator>
,那么MBG将只生成实体类
- 如果指定了一个
该元素只有两个属性(和前面提过的<javaModelGenerator>
的属性含义一样),都是必选的。
targetPackage
:生成实体类存放的包名,一般就是放在该包下。实际还会受到其他配置的影响(<table>
中会提到)。targetProject
:指定目标项目路径,可以是绝对路径或相对路径(如 targetProject=“src/main/resources”)。
该元素支持<property>
子元素,只有一个可以配置的属性:
enableSubPackages
:如果true
,MBG会根据catalog
和schema
来生成子包。如果false
就会直接用targetPackage
属性。默认为false
。
配置示例:
<sqlMapGenerator targetPackage="test.xml" targetProject="src\main\resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
javaClientGenerator元素
该元素可选,最多配置一个。
如果不配置该元素,就不会生成Mapper接口。
该元素有3个必选属性:
type
:该属性用于选择一个预定义的客户端代码(可以理解为Mapper接口)生成器,用户可以自定义实现,需要继承org.mybatis.generator.codegen.AbstractJavaClientGenerator
类,必选有一个默认的构造方法。 该属性提供了以下预定的代码生成器,首先根据<context>
的targetRuntime
分成三类:- MyBatis3
- ANNOTATEDMAPPER:基于注解的Mapper接口,不会有对应的XML映射文件
- MIXEDMAPPER:XML和注解的混合形式,(上面这种情况中的)
SqlProvider
注解方法会被XML替代。 - XMLMAPPER:所有的方法都在XML中,接口调用依赖XML文件。
- MyBatis3Simple:
- ANNOTATEDMAPPER:基于注解的Mapper接口,不会有对应的XML映射文件
- XMLMAPPER:所有的方法都在XML中,接口调用依赖XML文件。
- MyBatis3
targetPackage
:生成实体类存放的包名,一般就是放在该包下。实际还会受到其他配置的影响(<table>
中会提到)。targetProject
:指定目标项目路径,可以是绝对路径或相对路径(如 targetProject=“src/main/java”)。
该元素还有一个可选属性
implementationPackage
:如果指定了该属性,实现类就会生成在这个包中。
该元素支持<property>
子元素设置的属性
enableSubPackages
exampleMethodVisibility
methodNameCalculator
rootInterface
useLegacyBuilder
这几个属性不太常用,具体作用请看完整的文档,这里对rootInterface
做个简单介绍。
rootInterface
用于指定一个所有生成的接口都继承的父接口。 这个值可以通过<table>
配置的rootInterface
属性覆盖。
这个属性对于通用Mapper来说,可以让生成的所有接口都继承该接口。
配置示例:
<javaClientGenerator type="XMLMAPPER" targetPackage="test.dao"
targetProject="src\main\java"/>
table元素
该元素至少要配置一个,可以配置多个。
该元素用来配置要通过内省的表。只有配置的才会生成实体类和其他文件。
该元素有一个必选属性:
tableName
:指定要生成的表名,可以使用SQL通配符匹配多个表
例如要生成全部的表,可以按如下配置:
<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
:和<context>
的defaultModelType
含义一样,这里可以针对表进行配置,这里的配置会覆盖<context>
的defaultModelType
配置。escapeWildcards
:这个属性表示当查询列,是否对schema和表名中的SQL通配符 (’_’ and ‘%’) 进行转义。 对于某些驱动当schema或表名中包含SQL通配符时(例如,一个表名是MY_TABLE,有一些驱动需要将下划线进行转义)是必须的。默认值是false
。delimitIdentifiers
:是否给标识符增加分隔符。默认false
。当catalog
,schema
或tableName
中包含空白时,默认为true
。delimitAllColumns
:是否对所有列添加分隔符。默认false
。
该元素包含多个可用的<property>
子元素,可选属性为:
constructorBased
:和<javaModelGenerator>
中的属性含义一样。ignoreQualifiersAtRuntime
:生成的SQL中的表名将不会包含schema
和catalog
前缀。immutable
:和<javaModelGenerator>
中的属性含义一样。modelOnly
:此属性用于配置是否为表只生成实体类。如果设置为true
就不会有Mapper接口。如果配置了<sqlMapGenerator>
,并且modelOnly
为true
,那么XML映射文件中只有实体对象的映射元素(<resultMap>
)。如果为true
还会覆盖属性中的enableXXX
方法,将不会生成任何CRUD方法。rootClass
:和<javaModelGenerator>
中的属性含义一样。rootInterface
:和<javaClientGenerator>
中的属性含义一样。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>
还包含以下子元素:
- generatedKey
- columnRenamingRule
- columnOverride
- ignoreColumn
通用Mapper作者的建议
- 关于实体类的
modelType
,建议使用defaultModelType="flat"
,只有一个对象的情况下管理毕竟方便,使用也简单。 - 关于注释
<commentGenerator>
,不管你是否要重写自己的注释生成器,有一点不能忘记,那就是注释中一定要保留@mbggenerated
,MBG通过该字符串来判断代码是否为代码生成器生成的代码,有该标记的的代码在重新生成的时候会被删除,不会重复。不会在XML中出现重复元素。 - 使用MBG生成的代码时,建议尽可能不要去修改自动生成的代码,而且要生成带有
@mbggenerated
,这样才不会在每次重新生成代码的时候需要手动修改好多内容。 - 仍然是注释相关,在
<commentGenerator>
中,建议一定要保留suppressAllComments
属性(使用默认值false
),一定要取消(设为true
)时间戳suppressDate
,避免重复提交SVN。 <jdbcConnection>
建议将JDBC驱动放到项目的classpath下,而不是使用<classPathEntry>
来引入jar包,主要考虑到所有开发人员的统一性。- 当数据库字段使用
CHAR
时,建议在<javaModelGenerator>
中设置<property name="trimStrings" value="true" />
,可以自动去掉不必要的空格。 - 在
<javaClientGenerator>
中,建议设置type="XMLMAPPER"
,不建议使用注解或混合模式,比较代码和SQL完全分离易于维护。 - 建议尽可能在
<table>
中配置<generatedKey>
,避免手工操作,以便于MBG重复执行代码生成。
综合以上信息,这里给出一个Mysql
的简单配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="MysqlContext" targetRuntime="MyBatis3" defaultModelType="flat">
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<commentGenerator>
<property name="suppressDate" value="true"/>
</commentGenerator>
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/test"
userId="root"
password="">
</jdbcConnection>
<javaModelGenerator targetPackage="test.model" targetProject="src\main\java">
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="test.xml" targetProject="src\main\resources"/>
<javaClientGenerator type="XMLMAPPER" targetPackage="test.dao" targetProject="src\main\java"/>
<table tableName="%">
<generatedKey column="id" sqlStatement="Mysql"/>
</table>
</context>
</generatorConfiguration>