手记

Mybatis官方生成器学习入门教程

概述

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生成器

准备工作环境

在开始使用 Mybatis Generator 之前,确保已安装 Java 开发环境(JDK)和 Maven 构建工具。Mybatis Generator 通常作为 Maven 项目的一部分使用。

环境要求

  • Java 开发工具包 (JDK) 1.8 或更高版本
  • Maven 3.5 或更高版本

安装 Java 环境

安装 Java 开发工具包(JDK)的步骤如下:

  1. 访问 Oracle 官方网站下载 JDK。
  2. 安装 JDK,安装过程中选择合适的安装路径,如 C:\Program Files\Java\jdk-16
  3. 配置环境变量 JAVA_HOME 指向 JDK 安装路径,并将 %JAVA_HOME%\bin 添加到系统变量 Path 中。
  4. 打开命令行输入 java -version,确认安装成功。

安装 Maven

  1. 访问 Maven 官方网站下载 Maven。
  2. 解压下载的压缩包到合适的位置,如 C:\Dev\apache-maven-3.8.1
  3. 配置环境变量 MAVEN_HOME 指向 Maven 安装路径,并将 %MAVEN_HOME%\bin 添加到系统变量 Path 中。
  4. 打开命令行输入 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 类名。
使用Mybatis生成器生成代码

编写配置文件

在上一节中已经提到 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 编译并运行这个类。

Mybatis生成器的常用配置详解

表名与别名配置

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,减少手动操作。
0人推荐
随时随地看视频
慕课网APP