Mybatis Generator 是一个用于根据数据库表自动生成类、映射文件和 SQL 语句的工具,支持多种数据库和生成器类型,显著提高开发效率。本文将介绍 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 Generator 之前,确保已安装 Java 开发环境(JDK)和 Maven 构建工具。Mybatis Generator 通常作为 Maven 项目的一部分使用。
安装 Java 开发工具包(JDK)的步骤如下:
C:\Program Files\Java\jdk-16
。JAVA_HOME
指向 JDK 安装路径,并将 %JAVA_HOME%\bin
添加到系统变量 Path
中。java -version
,确认安装成功。C:\Dev\apache-maven-3.8.1
。MAVEN_HOME
指向 Maven 安装路径,并将 %MAVEN_HOME%\bin
添加到系统变量 Path
中。mvn -v
,确认安装成功。将 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>
在项目的 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>
id="testTables"
是上下文的唯一标识符,targetRuntime="MyBatis3"
指定了使用 MyBatis 3 版本。suppressDate="true"
表示不生成日期注释。targetPackage="com.example.model"
指定生成的实体类存放的包名,targetProject="src/main/java"
指定生成的 Java 文件存放的项目路径。targetPackage="com.example.mapper"
指定生成的 Mapper XML 文件存放的包名。type="ANNOTATEDMAPPER"
指定使用注解形式生成 Mapper 接口,targetPackage="com.example.mapper"
指定生成的 Mapper 接口存放的包名。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"/>
在项目的根目录下打开命令行,执行以下命令运行 Mybatis Generator:
mvn mybatis-generator:generate
如果你使用 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 代码来运行 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 文件通常存放在 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 接口通常存放在 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(); }
在项目的 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 数据库连接和 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; } }
在业务逻辑中,通过 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 语句等。
在 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 + '\'' + '}'; } }常见问题与解决方案
generatorConfig.xml
文件中配置了所有需要生成的字段。generatorConfig.xml
文件中的 commentGenerator
配置是否正确。generatorConfig.xml
文件中的 table
标签配置,确保启用了需要生成的方法。generatorConfig.xml
文件中的模板配置文件,自定义生成代码的模板。generatorConfig.xml
文件中配置编码规范,确保生成的代码符合项目编码规范。