Mybatis Generator 是一个用于根据数据库表自动生成类、映射文件和 SQL 语句的工具,支持多种数据库和生成器类型,显著提高开发效率。本文将介绍 Mybatis 官方生成器的学习入门,包括安装配置、代码生成和使用方法。
Mybatis生成器简介Mybatis生成器概述
Mybatis Generator (MBG) 是一个开源的 Java 工具,用于根据数据库表生成类、映射文件以及 SQL 语句。它支持 MySQL、Oracle、SQL Server 等多种数据库,并能够生成 Java 类、Mapper XML 文件和 DAO 接口。MBG 可以显著提高开发者的效率,减少手动编写代码的复杂度。
MBG 包含几种生成器:Entity Generator、DAO Generator 和 Mapper XML Generator。这些生成器可以单独使用,也可以组合使用,生成不同类型的文件。
Mybatis生成器的优势
- 减少重复工作:通过 MBG 自动生成代码,避免开发者手动编写数据访问对象(DAO)和实体类。
- 减少维护成本:当数据库表结构发生变化时,MBG 可以自动更新生成的代码,减少手动维护代码的工作。
- 提高一致性:生成的代码遵循最佳实践,提高了代码的一致性。
- 支持多种数据库:MBG 支持多种数据库,如 MySQL、Oracle、SQL Server 等。
- 支持多种生成器类型:可以根据需要选择不同的生成器类型,例如实体类生成器、DAO 生成器和 Mapper XML 文件生成器。
准备工作环境
在开始使用 Mybatis Generator 之前,确保已安装 Java 开发环境(JDK)和 Maven 构建工具。Mybatis Generator 通常作为 Maven 项目的一部分使用。
环境要求
- Java 开发工具包 (JDK) 1.8 或更高版本
- Maven 3.5 或更高版本
安装 Java 环境
安装 Java 开发工具包(JDK)的步骤如下:
- 访问 Oracle 官方网站下载 JDK。
- 安装 JDK,安装过程中选择合适的安装路径,如
C:\Program Files\Java\jdk-16
。 - 配置环境变量
JAVA_HOME
指向 JDK 安装路径,并将%JAVA_HOME%\bin
添加到系统变量Path
中。 - 打开命令行输入
java -version
,确认安装成功。
安装 Maven
- 访问 Maven 官方网站下载 Maven。
- 解压下载的压缩包到合适的位置,如
C:\Dev\apache-maven-3.8.1
。 - 配置环境变量
MAVEN_HOME
指向 Maven 安装路径,并将%MAVEN_HOME%\bin
添加到系统变量Path
中。 - 打开命令行输入
mvn -v
,确认安装成功。
安装Mybatis生成器插件
将 Mybatis Generator 作为 Maven 依赖添加到项目中。在项目的 pom.xml
文件中添加以下依赖:
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
生成器支持多种数据库驱动,例如 MySQL、Oracle、SQL Server 等。你需要根据使用的数据库下载相应的 JDBC 驱动依赖。以 MySQL 为例,添加以下依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
配置Mybatis生成器
在项目的 src/main/resources
文件夹中创建一个名为 generatorConfig.xml
的配置文件。这个文件包含了生成器的配置信息,如数据库连接信息、生成代码文件的存放位置等。
下面是一个简单的配置文件示例:
<generatorConfiguration>
<context id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressDate" value="true"/>
</commentGenerator>
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mydatabase?useSSL=false&serverTimezone=UTC"
userId="root" password="password"/>
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"/>
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources"/>
<javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"/>
<table tableName="my_table" domainObjectName="MyTable" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
</context>
</generatorConfiguration>
配置文件解析
- context 标签:定义一个配置上下文,
id="testTables"
是上下文的唯一标识符,targetRuntime="MyBatis3"
指定了使用 MyBatis 3 版本。 - commentGenerator 标签:配置生成器的注释规则。
suppressDate="true"
表示不生成日期注释。 - jdbcConnection 标签:配置数据库连接信息,包括驱动类、连接 URL、用户名和密码。
- javaModelGenerator 标签:生成 Java 实体类,
targetPackage="com.example.model"
指定生成的实体类存放的包名,targetProject="src/main/java"
指定生成的 Java 文件存放的项目路径。 - sqlMapGenerator 标签:生成 XML 映射文件(Mapper XML 文件),
targetPackage="com.example.mapper"
指定生成的 Mapper XML 文件存放的包名。 - javaClientGenerator 标签:生成 Mapper 接口,
type="ANNOTATEDMAPPER"
指定使用注解形式生成 Mapper 接口,targetPackage="com.example.mapper"
指定生成的 Mapper 接口存放的包名。 - table 标签:定义需要生成代码的数据表。
tableName="my_table"
指定要生成代码的数据表名,domainObjectName="MyTable"
指定生成的 Java 类名。
编写配置文件
在上一节中已经提到 generatorConfig.xml
配置文件,接下来介绍如何编写这个配置文件。
生成代码的基本配置
首先,配置数据库连接信息,确保连接的数据库已准备好:
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mydatabase?useSSL=false&serverTimezone=UTC"
userId="root" password="password"/>
配置生成 Java 实体类、Mapper XML 文件和 Mapper 接口:
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"/>
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources"/>
<javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"/>
生成指定数据表的代码
接下来,定义需要生成代码的数据表:
<table tableName="my_table" domainObjectName="MyTable" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
生成多个数据表的代码
如果需要生成多个数据表的代码,可以在 table
标签中添加多个 table
标签,例如:
<table tableName="table1" domainObjectName="Table1" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
<table tableName="table2" domainObjectName="Table2" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
运行生成器生成代码
通过 Maven 命令运行生成器
在项目的根目录下打开命令行,执行以下命令运行 Mybatis Generator:
mvn mybatis-generator:generate
通过 Gradle 命令运行生成器
如果你使用 Gradle 进行构建,可以在 build.gradle
文件中添加以下任务:
task generateMybatis(type: MyBatisGenerator) {
mybatisGenerator {
configFiles('src/main/resources/generatorConfig.xml')
verbose(true)
overwrite(true)
}
}
generateMybatis.doFirst {
println 'Generating MyBatis code...'
}
然后执行以下命令运行生成器:
./gradlew generateMybatis
通过 Java 代码运行生成器
你也可以通过 Java 代码来运行 Mybatis Generator。下面是一个简单的示例:
package com.example;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MybatisGeneratorRunner {
public static void main(String[] args) {
try {
List<String> warnings = new ArrayList<>();
boolean overwrite = true;
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(MybatisGeneratorRunner.class.getResourceAsStream("/generatorConfig.xml"));
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
} catch (IOException e) {
e.printStackTrace();
} catch (XMLParserException e) {
e.printStackTrace();
}
}
}
将上述代码保存为 MybatisGeneratorRunner.java
,然后使用 Maven 或 Gradle 编译并运行这个类。
表名与别名配置
在 generatorConfig.xml
文件中,可以配置数据表的表名和别名,方便生成代码时使用。
表名配置
在 table
标签中,通过 tableName
属性指定数据库表名:
<table tableName="my_table" domainObjectName="MyTable">
别名配置
在 table
标签中,通过 domainObjectName
属性指定生成的 Java 类名:
<table tableName="my_table" domainObjectName="MyTable">
字段别名配置
在 table
标签内部,可以通过 <columnOverride>
标签配置字段别名:
<table tableName="my_table" domainObjectName="MyTable">
<columnOverride column="column_name" javaName="ColumnName"/>
</table>
模板配置
Mybatis Generator 支持自定义模板配置,允许开发者根据需要自定义生成的代码模板。
模板配置文件
Mybatis Generator 使用 FreeMarker 模板引擎,模板文件通常存放在 src/main/resources/templates
目录下。例如,可以创建一个 Entity.ftl
文件来指定实体类的模板:
package ${package};
public class ${entityName} {
private ${type} ${column};
public ${type} get${Column}() {
return ${column};
}
public void set${Column}(${type} ${column}) {
this.${column} = ${column};
}
}
在配置文件中引用模板
在 generatorConfig.xml
文件中引用自定义的模板文件:
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
<property name="modelType" value="flat"/>
<property name="enableCacheModel" value="true"/>
<property name="modelPackage" value="com.example.model"/>
<property name="templateLocation" value="templates"/>
</javaModelGenerator>
模板参数
在模板文件中可以使用 FreeMarker 的语法引用配置文件中的参数,例如 ${package}
、${entityName}
等。
数据库连接配置
数据库连接配置是 Mybatis Generator 的核心配置之一,它决定了生成器连接哪个数据库进行代码生成。
数据库连接信息
在 generatorConfig.xml
文件中,配置数据库连接信息:
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mydatabase?useSSL=false&serverTimezone=UTC"
userId="root" password="password"/>
支持的数据库类型
Mybatis Generator 支持多种数据库类型,例如 MySQL、Oracle、SQL Server 等。你需要根据使用的数据库类型选择合适的驱动类和连接 URL。
安全性配置
为了提高连接的安全性,通常建议使用数据库连接池来管理数据库连接。Mybatis Generator 支持通过 JDBC 连接池来配置数据库连接,例如使用 HikariCP 或 DBCP2:
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mydatabase?useSSL=false&serverTimezone=UTC"
userId="root" password="password">
<property name="connectionPoolType" value="HikariCP"/>
<property name="hibernateDialect" value="com.mysql.cj.jdbc.Driver"/>
<property name="connectionFactoryCache" value="true"/>
</jdbcConnection>
Mybatis生成器生成代码的使用
生成的代码结构介绍
生成的代码通常包含以下几部分:
实体类
生成的 Java 实体类通常存放在 src/main/java
目录下。例如:
package com.example.model;
public class MyTable {
private int id;
private String name;
// getters and setters
}
Mapper XML 文件
生成的 Mapper XML 文件通常存放在 src/main/resources
目录下。例如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.MyTableMapper">
<select id="selectById" parameterType="int" resultType="com.example.model.MyTable">
SELECT * FROM my_table WHERE id = #{id}
</select>
</mapper>
Mapper 接口
生成的 Mapper 接口通常存放在 src/main/java
目录下。例如:
package com.example.mapper;
import com.example.model.MyTable;
import java.util.List;
public interface MyTableMapper {
MyTable selectById(int id);
List<MyTable> selectAll();
}
如何运行生成的代码
配置 Mybatis 配置文件
在项目的 src/main/resources
目录下创建一个名为 mybatis-config.xml
的配置文件,配置 Mybatis 的全局配置信息:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias alias="MyTable" type="com.example.model.MyTable"/>
</typeAliases>
<mappers>
<mapper resource="com/example/mapper/MyTableMapper.xml"/>
</mappers>
</configuration>
创建 Mybatis 工厂
在项目中创建一个 Mybatis 工厂类,用于初始化 Mybatis 数据库连接和 Mapper 接口:
package com.example;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.Reader;
public class MybatisFactory {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config.xml";
Reader reader = Resources.getResourceAsReader(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
使用 Mapper 接口
在业务逻辑中,通过 Mybatis 工厂获取 SqlSession 对象,然后使用 Mapper 接口进行数据库操作:
package com.example;
import com.example.mapper.MyTableMapper;
import org.apache.ibatis.session.SqlSession;
public class MyTableService {
public MyTable selectById(int id) {
try (SqlSession session = MybatisFactory.getSqlSessionFactory().openSession()) {
MyTableMapper mapper = session.getMapper(MyTableMapper.class);
return mapper.selectById(id);
}
}
}
代码自定义修改指南
生成器生成的代码可能需要根据业务场景进行自定义修改,例如添加额外的方法、修改生成的 SQL 语句等。
自定义生成的 SQL 语句
在 MyTableMapper.xml
文件中,可以修改生成的 SQL 语句,添加自定义的查询逻辑:
<select id="customSelect" resultType="com.example.model.MyTable">
SELECT * FROM my_table WHERE name LIKE '%${value}%'
</select>
手动添加方法
在 MyTableMapper
接口中手动添加方法,例如添加一个自定义查询方法:
package com.example.mapper;
import com.example.model.MyTable;
import java.util.List;
public interface MyTableMapper {
MyTable selectById(int id);
List<MyTable> selectAll();
List<MyTable> customSelect(String value);
}
自定义实体类
在 MyTable
实体类中,可以添加额外的属性或方法,例如添加一个 toString
方法:
package com.example.model;
public class MyTable {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "MyTable{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
常见问题与解决方案
生成器配置常见错误
- 无法连接到数据库:检查数据库连接配置是否正确,包括驱动类、连接 URL、用户名和密码等信息。
- 生成的代码缺少某些字段:确保
generatorConfig.xml
文件中配置了所有需要生成的字段。 - 生成的代码没有注释:检查
generatorConfig.xml
文件中的commentGenerator
配置是否正确。
代码生成常见问题
- 生成的代码编译失败:确保生成的代码存放路径正确,并且与项目中的其他代码文件路径一致。
- 生成的代码缺少某些方法:检查
generatorConfig.xml
文件中的table
标签配置,确保启用了需要生成的方法。 - 生成的代码不符合编码规范:修改
generatorConfig.xml
文件中的模板配置文件,自定义生成代码的模板。
解决方案与最佳实践
- 使用模板配置文件:通过自定义模板配置文件,可以灵活控制生成代码的格式和内容。
- 手动调整生成的代码:对于生成的代码,可以根据需要进行手动调整,以满足项目特定需求。
- 定期更新生成器:定期检查 Mybatis Generator 的最新版本,使用最新版本可以解决已知问题并获得新的功能。
- 配置数据库连接池:使用数据库连接池可以提高数据库连接的安全性和性能。
- 遵循编码规范:在
generatorConfig.xml
文件中配置编码规范,确保生成的代码符合项目编码规范。 - 使用 Maven 插件:使用 Maven 插件可以方便地在构建过程中自动运行 Mybatis Generator,减少手动操作。
共同学习,写下你的评论
评论加载中...
作者其他优质文章