MyBatis Generator
MyBatis Generator官方文档学习笔记,英文好的话可直接看官网 https://mybatis.org/generator/index.html 。
介绍
MyBatis Generator (MBG) 是MyBatis的代码生成器,它将为所有版本的MyBatis生成代码。它会审查一个数据库表(或多个表),并生成可用于访问该表的工件,这减少了设置对象和配置文件以与数据库表交互的初始麻烦。MBG试图对大部分简单CRUD的数据库操作产生重大影响。您仍然需要手工编写用于连接查询或存储过程的SQL和对象代码。
MBG根据其配置方式生成不同风格和不同语言的代码。例如,MBG可以生成Java或Kotlin代码。MBG可以生成MyBatis3兼容的XML,尽管这现在被认为是MBG的传统用法,新样式的生成代码则不需要XML。
根据其配置方式,MyBatis代码生成器能够生成:
- 与表结构匹配的Java或Kotlin类
- 在某些情况下,MBG将生成与MyBatis3兼容的SQL映射XML文件。MBG为配置中每个表上的简单CRUD生成SQL
- 适当使用上述对象的Java或Kotlin客户端类、接口和Kotlin扩展方法。客户端类的生成是可选的。MBG将生成一个和MyBatis 3.x映射器基础结构一起工作的映射器接口
MyBatis生成器被设计为在迭代开发环境中运行良好,可以作为Ant任务或Maven插件包含在持续构建环境中。迭代运行MBG时需要注意的重要事项包括:
- 如果存在与新生成的XML文件同名的现有文件,MBG将自动合并XML文件。MBG不会覆盖您对其生成的XML文件所做的任何自定义更改。您可以反复运行它,而不必担心丢失对XML的自定义更改。MBG将替换先前运行中生成的任何XML元素。
- MBG不会合并Java文件,它可以覆盖现有文件或使用不同的唯一名称保存新生成的文件。如果您对生成的Java文件进行更改并以迭代方式运行MBG,则必须手动合并更改。当作为Eclipse插件运行时,MBG可以自动合并Java文件。
- 与2类似,MBG不会合并Kotlin文件。
依赖项
MBG除了JRE(Java运行环境)以外不需要其他依赖。需要Java 8或更高版本。此外,还需要一个实现数据库元数据接口的JDBC驱动程序,特别是getColumns和getPrimaryKeys方法。
生成的代码的依赖项
MBG将生成不同风格的代码。这由<context>元素的“targetRuntime”属性控制。所有运行环境都依赖MyBatis,MyBatis3DynamicSQL等运行环境还依赖 MyBatis Dynamic SQL 。
快速开始
MyBatis Generator 能生成不同风格的代码,包括MyBatis3DynamicSql、MyBatis3Kotlin、MyBatis3和MyBatis3Simple。
要快速启动并运行MBG,请遵循以下步骤:
-
适当地创建并填写配置文件
-
将文件保存在方便的位置(如\temp\generatorConfig.xml)
-
从命令行使用以下命令运行MBG:
java -jar mybatis-generator-core-x.x.x.jar -configfile \temp\generatorConfig.xml -overwrite
这将告诉MBG使用您的配置文件运行。它还将告诉MBG覆盖具有相同名称的任何现有Java或Kotlin文件。如果要保存任何现有文件,请省略-overwrite参数。如果存在冲突,MBG将使用唯一名称保存新生成的文件(例如MyClass.java.1)
-
运行MBG后,您需要创建或修改标准MyBatis配置,以便使用新生成的代码。
实际演示
测试使用的数据库为MySQL,生成测试数据的SQL如下:
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `tb_dept`;
CREATE TABLE `tb_dept` (
`id` int(11) NOT NULL COMMENT '部门ID',
`name` varchar(20) NOT NULL COMMENT '部门名称',
PRIMARY KEY (`id`)
) ENGINE = InnoDB CHARACTER SET = utf8 COMMENT = '部门表';
INSERT INTO `tb_dept` VALUES (1001, '部门一');
INSERT INTO `tb_dept` VALUES (1002, '部门二');
DROP TABLE IF EXISTS `tb_emp`;
CREATE TABLE `tb_emp` (
`id` int(11) NOT NULL COMMENT '员工ID',
`name` varchar(20) NOT NULL COMMENT '员工姓名',
`dept_id` int(11) NULL DEFAULT NULL COMMENT '所属部门ID',
PRIMARY KEY (`id`),
CONSTRAINT `fk_emp_dept_id` FOREIGN KEY (`dept_id`) REFERENCES `tb_dept` (`id`)
) ENGINE = InnoDB CHARACTER SET = utf8 COMMENT = '员工表';
INSERT INTO `tb_emp` VALUES (1, '张三', 1001);
INSERT INTO `tb_emp` VALUES (2, '李四', 1001);
INSERT INTO `tb_emp` VALUES (3, '王五', 1002);
INSERT INTO `tb_emp` VALUES (4, 'Tom', 1002);
SET FOREIGN_KEY_CHECKS = 1;
mybatis-generator-core-x.x.x.jar的版本为1.4.0,jar包可以从Maven中央仓库下载。mysql驱动使用mysql-connector-java-8.0.28.jar。
生成器配置文件generatorConfig.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>
<!-- 指定mysql驱动 -->
<classPathEntry location="mysql-connector-java-8.0.28.jar"/>
<!-- MyBatis3Simple风格: 生成基本的CRUD; MyBatis3风格: 生成带条件的CRUD -->
<context id="simple" targetRuntime="MyBatis3Simple">
<!-- 注释生成策略 -->
<commentGenerator>
<property name="suppressAllComments" value="true"/>
<property name="suppressDate" value="true"/>
<!--<property name="addRemarkComments" value="true"/>-->
</commentGenerator>
<!-- 数据库连接信息 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/test?serverTimezone=UTC"
userId="root"
password="1234"/>
<!-- 实体类生成策略 -->
<javaModelGenerator targetPackage="example.model" targetProject="."/>
<!-- sql映射文件生成策略 -->
<!--<sqlMapGenerator targetPackage="example.mapper" targetProject="."/>-->
<!-- Mapper接口生成策略 -->
<javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="example.mapper" targetProject="."/>
<!-- 指定表名和生成的实体类的类名的映射关系 -->
<table tableName="tb_dept" domainObjectName="Dept"/>
<table tableName="tb_emp" domainObjectName="Emp"/>
</context>
</generatorConfiguration>
配置时要注意以下几点:
- 命令行运行MBG需通过classPathEntry的location属性指定mysql驱动的位置
- 配置元素要遵循一定的顺序,否则会出现XML解析错误(XML Parser Errors occurred)
- targetProject和targetPackage分别用于指定目标路径和包路径,targetProject路径需已存在
- table的tableName设为*号,可对应所有表,此时不写domainObjectName
运行命令前的工作目录如下:
generatorConfig.xml
mybatis-generator-core-1.4.0.jar
mysql-connector-java-8.0.28.jar
在工作目录执行以下命令
java -jar mybatis-generator-core-1.4.0.jar -configfile generatorConfig.xml -overwrite
终端显示"MyBatis Generator finished successfully."表示代码生成成功。
运行命令后的工作目录如下:
│ generatorConfig.xml
│ mybatis-generator-core-1.4.0.jar
│ mysql-connector-java-8.0.28.jar
│
└───example
├───mapper
│ DeptMapper.java
│ EmpMapper.java
│
└───model
Dept.java
Emp.java
生成的Mapper接口方法示例(ANNOTATEDMAPPER为注解形式,XMLMAPPER为XML形式):
@Select({
"select",
"id, name, dept_id",
"from tb_emp"
})
@Results({
@Result(column="id", property="id", jdbcType=JdbcType.INTEGER, id=true),
@Result(column="name", property="name", jdbcType=JdbcType.VARCHAR),
@Result(column="dept_id", property="deptId", jdbcType=JdbcType.INTEGER)
})
List<Emp> selectAll();
MyBatis3Simple风格针对每个表会自动生成5个接口方法:
int deleteByPrimaryKey(Integer id);
int insert(T record);
T selectByPrimaryKey(Integer id);
List<T> selectAll();
int updateByPrimaryKey(T record);
MyBatis3风格生成的代码除了以上方法外,还支持单表的条件CRUD操作。此外,MyBatis Generator也可通过Maven插件来使用。