为什么要使用MyBatis代码生成器?
MyBatis代码生成器(MyBatis Generator)的作用就是方便我们偷懒,这样说比较贴切一些。
因为我们在使用MyBatis框架的时候,需要三个组件:
- 实体类
- Mapper接口
- Mapper.xml
在没有使用MyBatis代码生成器的时候,我们需要手动创建它们,一张表对应一个实体类、一个Mapper接口、一个Mapper.xml。
表的数量比较少的情况自己创建还可以,如果表有几十张或者上百张,我们要一个一个创建的话,很难受的。MyBatis也考虑到这点,
所以提供了代码生成器,我们只需要编写少量的配置,就能为每张表创建上面三个组件了,而且在创建的Mapper接口和Mapper.xml中,已经帮我们自动生成单表的增删改查代码了,也就是说使用MyBatis代码生成器,对于单表的增删改查我们不需要再写代码了。
我们通过下面两步来使用代码生成器:
- 编写代码生成器配置文件
- 运行代码生成器
1.编写代码生成器配置文件
我们先对代码生成器配置文件做一个详细讲解,然后再给出整个配置代码。
- 首先要引入配置文件的模板,之后就是在这个XML模板配置
<?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>
</generatorConfiguration>
- generatorConfiguration标签下只包含以下三个标签,下面一 一介绍这三个标签的作用。
properties标签
- properties标签用于指定一个需要在配置中解析使用的外部属性文件,引入属性文件后,可以在配置中使用${property}这种形式的引用,通过这种方式引用属性文件中的属性值。
- properties标签包含resource和url两个属性,只能使用其中一个属性来指定,同时出现则会报错。
resource:指定classpath下的属性文件。
url:指定文件系统上的特定位置。
classPathEntry标签
这个标签可以配置多个,也可以不配置,只有一个location属性。这个标签最常见的用法就是通过location属性指定数据库驱动的路径。
<classPathEntry location="E:\mysql-connector-java-5.1.29.jar"/>
context标签
这个标签至少配置一个,可以配置多个。context标签用于指定生成一组对象的环境。例如:
- 指定要连接的数据库
- 指定要处理的数据库表
- 生成实体类
- 生成Mapper接口
- 生成Mapper.xml
context标签属性如下:
- 必选属性id,id属性主要是区分多个context标签,必须唯一,id属性在运行代码生成器时使用。
- targetRuntime属性用于指定生成的代码的运行时环境,支持以下可选值:
MyBatis3:默认值
MyBatis3Simple:这种情况下不会输出与Example相关的方法。
接下来我们看看context包含哪些子标签,我们只介绍其中常用的子标签。
commentGenerator标签
该标签用来配置如何生成注释信息,最多可以配置1个。
1. suppressAllComments:阻止生成注释。
2. suppressDate:阻止生成的注释包含时间戳。
3. addRemarkComments:注释是否添加数据库表的备注信息。
jdbcConnection标签
该标签用于指定MBG要连接的数据库信息,该标签必选,并且只能有一个。
1. driverClass:访问数据库的JDBC驱动程序的完全限定类名。
2. connectionURL:访问数据库的JDBC连接URL。
3. userId:访问数据库的用户ID。
4. password:访问数据库的密码。
javaTypeResolver
该标签的配置用来指定JDBC类型和Java类型如何转换,最多可以配置一个。
javaModelGenerator标签
该标签用来控制生成的实体类。该标签必须配置一个,并且最多配置一个。
1. targetPackage:生成实体类存放的包名。
2. targetProject:指定目标项目路径,可以使用相对路径或绝对路径。
sqlMapGenerator标签
该标签用于配置SQL映射生成器(Mapper.xml文件)的属性,该标签可选,最多配置一个。
1. targetPackage:生成SQL映射文件存放的包名。
2. targetProject:指定目标项目路径,可以使用相对路径或绝对路径。
javaClientGenerator标签
该标签用于生成Mapper接口,该标签可选,最多配置一个。
1. targetPackage:生成Mapper接口存放的包名。
2. targetProject:指定目标项目路径,可以使用相对路径或绝对路径。
table标签
该标签用于配置需要通过内省数据库的表,只有在table中配置过的表,才能经过上述其他配置生成最终的代码,该标签最少配置一个。
table标签有一个必选属性tableName,该属性指定要生成的表名,可以使用SQL通配符匹配多个表。例如要生成全部的表,可以如下配置
<table tableName="%"></table>
下面给出完整的配置文件代码
<?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>
<!--<classPathEntry location="E:\mysql-connector-java-5.1.29.jar"/>-->
<context id="mybatis" targetRuntime="mybatis3simple" defaultModelType="flat">
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="addRemarkComments" value="true"/>
</commentGenerator>
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis"
userId="root"
password="root">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<javaModelGenerator targetPackage="test.model"
targetProject="src\main\java">
<property name="enableSubPackages" value="false"/>
<property name="trimStrings" value="false"/>
</javaModelGenerator>
<sqlMapGenerator targetPackage="text.xml"
targetProject="src\main\resources">
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER"
targetPackage="test.mapper"
targetProject="src\main\java">
</javaClientGenerator>
<table tableName="%">
<generatedKey column="id" sqlStatement="MySql"/>
</table>
</context>
</generatorConfiguration>
配置介绍完了,接下来我们就开始运行代码生成器,这里使用Java编写代码运行它。
2.使用Java代码运行代码生成器
我们需要在pom.xml中引入以下依赖
- 代码生成器核心依赖
- MyBatis框架依赖
- MySQL数据库驱动依赖
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
</dependencies>
然后编写Java代码运行代码生成器配置文件
/**
* 读取MBG生成代码
*/
public class MyBatisGenerator {
public static void main(String[] args) throws Exception {
//MBG 执行过程中的警告信息
List<String> warnings = new ArrayList<String>();
//当生成的代码重复时,覆盖原代码
boolean overwrite = true;
//读取我们的 MBG 配置文件
InputStream is = MyBatisGenerator.class.getResourceAsStream("/generator/mbg-config.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(is);
is.close();
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
//创建 MBG
org.mybatis.generator.api.MyBatisGenerator myBatisGenerator = new org.mybatis.generator.api.MyBatisGenerator(config, callback, warnings);
//执行生成代码
myBatisGenerator.generate(null);
//输出警告信息
for(String warning : warnings){
System.out.println(warning);
}
}
}
运行之后的结果如下图,对于我们指定的表,MBG全部为我们生成对应的实体类,Mapper接口,以及Mapper.xml,超级方便。