为了账号安全,请及时绑定邮箱和手机立即绑定

Mybatis官方生成器资料详解与实战教程

标签:
SSM
概述

本文介绍了 Mybatis Generator 的下载、安装与配置过程,以及如何生成 Mybatis 所需的 XML 映射文件和 Java 实体类。文章详细讲解了配置文件的编写和自定义生成规则的方法,并提供了多数据表关系处理的示例。

Mybatis官方生成器简介
Mybatis Generator 是什么

Mybatis Generator 是一个强大的代码生成工具,它可以根据数据库表自动生成 Mybatis 操作所需的 XML 映射文件和 Java 实体类。通过简化这些重复繁琐的手动编码任务,Mybatis Generator 可以帮助开发人员提高开发效率,并减少由于手动编码错误带来的问题。

如何获取 Mybatis 官方生成器

要使用 Mybatis Generator,您需要先下载它。Mybatis Generator 的官方发布站点是 https://github.com/mybatis/generator/releases。您可以从该站点下载适合您项目的最新版本,通常以 .zip.jar 文件形式提供。

安装与环境搭建

Mybatis Generator 的运行需要 Java 环境。首先确保系统中已安装了 Java。检查 Java 环境的方式如下:

java -version

如果未安装 Java,可以从官网下载安装 https://www.oracle.com/java/technologies/javase-downloads.html。安装完成后,确保 Java 已被添加到您的系统路径中。

接下来,下载 Mybatis Generator 的 jar 文件(通常位于其 GitHub 发布页面)并解压。您可以通过命令行运行 Mybatis Generator,方法如下:

java -jar mybatis-generator-core-1.3.7.jar

此命令将启动 Mybatis Generator,它会查找配置文件并执行配置中指定的任务。配置文件通常命名为 generatorConfig.xml

Mybatis Generator的基本配置
配置文件详解

Mybatis Generator 的配置文件 generatorConfig.xml 是其核心配置文件。该文件使用 XML 格式编写,包含所有运行时需要的配置信息。以下是配置文件的基本结构:

<generatorConfiguration>
    <context id="default" targetRuntime="MyBatis3" defaultModelType="flat">
        <!-- 数据库连接信息 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mydb"
                        userId="root"
                        password="password"/>
        <!-- 生成的实体类配置 -->
        <javaModelGenerator targetPackage="com.example.model"
                            targetProject="src/main/java"/>
        <!-- 生成的映射文件配置 -->
        <sqlMapGenerator targetPackage="com.example.mapper"
                         targetProject="src/main/resources"/>
        <!-- 生成的DAO类配置 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper"
                             targetProject="src/main/java"/>
    </context>
</generatorConfiguration>
常用标签介绍

在配置文件中,context 标签是最主要的配置标签,它定义了 Mybatis Generator 的运行环境和生成规则。

jdbcConnection

jdbcConnection 标签用于配置数据库连接信息,例如数据库类型、URL、用户名和密码等。

<jdbcConnection driverClass="com.mysql.jdbc.Driver"
                connectionURL="jdbc:mysql://localhost:3306/mydb"
                userId="root"
                password="password"/>

javaModelGenerator

javaModelGenerator 用于定义 Java 实体类的生成规则。

<javaModelGenerator targetPackage="com.example.model"
                    targetProject="src/main/java"/>

sqlMapGenerator

sqlMapGenerator 标签定义了 SQL 映射文件的生成规则。

<sqlMapGenerator targetPackage="com.example.mapper"
                 targetProject="src/main/resources"/>

javaClientGenerator

javaClientGenerator 标签定义了 Java Mapper 接口的生成规则。

<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper"
                     targetProject="src/main/java"/>
实例配置讲解

我们可以通过实例配置来理解如何配置生成器。以下是一个完整的配置文件的例子:

<generatorConfiguration>
    <context id="test" targetRuntime="MyBatis3" defaultModelType="flat">
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mydb"
                        userId="root"
                        password="password"/>
        <javaModelGenerator targetPackage="com.example.model"
                            targetProject="src/main/java"/>
        <sqlMapGenerator targetPackage="com.example.mapper"
                         targetProject="src/main/resources"/>
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper"
                             targetProject="src/main/java"/>
        <table tableName="user">
            <generatedKey column="id" sqlStatement="Mysql"/>
        </table>
    </context>
</generatorConfiguration>

此配置文件中,我们定义了一个 context,其中包含了数据库连接信息和各生成器的基本设置。table 标签用于指定要生成代码的数据库表。

创建与更新Mybatis的XML映射文件和实体类
配置生成规则

在配置文件中,我们可以通过配置 contexttable 标签来控制生成规则。例如:

<generatorConfiguration>
    <context id="test" targetRuntime="MyBatis3" defaultModelType="flat">
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mydb"
                        userId="root"
                        password="password"/>
        <javaModelGenerator targetPackage="com.example.model"
                            targetProject="src/main/java"/>
        <sqlMapGenerator targetPackage="com.example.mapper"
                         targetProject="src/main/resources"/>
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper"
                             targetProject="src/main/java"/>
        <table tableName="user">
            <generatedKey column="id" sqlStatement="Mysql"/>
        </table>
    </context>
</generatorConfiguration>

这里,我们指定了数据库连接信息和生成器的一些基本设置。table 标签中的 tableName 属性用于指定生成代码的表名,generatedKey 标签用于指定主键生成规则。

自定义生成规则

我们可以通过一些自定义配置来进一步控制生成器的行为。例如,如果我们希望生成的实体类命名规则有所不同,可以在 javaModelGenerator 中添加 property 标签,例如:

<javaModelGenerator targetPackage="com.example.model"
                    targetProject="src/main/java">
    <property name="enableSubPackages" value="true"/>
    <property name="trimStrings" value="true"/>
    <property name="immutable" value="false"/>
    <property name="useCatalog" value="false"/>
    <property name="useInnerSelect" value="true"/>
</javaModelGenerator>

这些配置可以控制实体类的生成细节,如是否启用子包、是否截断字符串等。

自动生成示例

假设我们有一个数据库表 user,我们希望生成其对应的实体类、映射文件和 Mapper 接口。我们按照以下步骤操作:

  1. generatorConfig.xml 文件中定义配置;
  2. 运行 Mybatis Generator。

配置文件示例

<generatorConfiguration>
    <context id="test" targetRuntime="MyBatis3" defaultModelType="flat">
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mydb"
                        userId="root"
                        password="password"/>
        <javaModelGenerator targetPackage="com.example.model"
                            targetProject="src/main/java"/>
        <sqlMapGenerator targetPackage="com.example.mapper"
                         targetProject="src/main/resources"/>
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper"
                             targetProject="src/main/java"/>
        <table tableName="user">
            <generatedKey column="id" sqlStatement="Mysql"/>
        </table>
    </context>
</generatorConfiguration>

生成代码示例

假设 user 表中包含 id, username, passwordemail 等字段,生成的代码可能如下:

实体类 User.java

package com.example.model;

public class User {
    private Integer id;
    private String username;
    private String password;
    private String email;

    // getters and setters
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

映射文件 UserMapper.xml

<?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.UserMapper">
    <resultMap id="BaseResultMap" type="com.example.model.User">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>
        <result column="email" property="email"/>
    </resultMap>

    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
        SELECT
            id,
            username,
            password,
            email
        FROM
            user
        WHERE
            id = #{id}
    </select>

    <insert id="insert" parameterType="com.example.model.User">
        INSERT INTO
            user (id, username, password, email)
        VALUES (
            #{id},
            #{username},
            #{password},
            #{email}
        )
    </insert>
</mapper>

Mapper 接口 UserMapper.java

package com.example.mapper;

import com.example.model.User;
import java.util.List;

public interface UserMapper {
    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user
     *
     * @mbg.generated
     */
    int deleteByPrimaryKey(Integer id);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user
     *
     * @mbg.generated
     */
    int insert(User record);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user
     *
     * @mbg.generated
     */
    int insertSelective(User record);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user
     *
     * @mbg.generated
     */
    User selectByPrimaryKey(Integer id);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user
     *
     * @mbg.generated
     */
    int updateByPrimaryKeySelective(User record);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user
     *
     * @mbg.generated
     */
    int updateByPrimaryKey(User record);
}
进阶使用技巧
如何处理多数据表关系

处理多数据表关系时,Mybatis Generator 提供了一些高级配置来简化操作。例如,我们可以通过配置 associationcollection 标签来生成关联的实体类和映射文件。

示例配置

假设我们有两个数据库表 userorder,其中 user 表中的 userId 字段与 order 表中的 userId 字段关联。我们可以在 generatorConfig.xml 中这样配置:

<generatorConfiguration>
    <context id="test" targetRuntime="MyBatis3" defaultModelType="flat">
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mydb"
                        userId="root"
                        password="password"/>
        <javaModelGenerator targetPackage="com.example.model"
                            targetProject="src/main/java"/>
        <sqlMapGenerator targetPackage="com.example.mapper"
                         targetProject="src/main/resources"/>
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper"
                             targetProject="src/main/java"/>
        <table tableName="user">
            <generatedKey column="id" sqlStatement="Mysql"/>
        </table>
        <table tableName="order">
            <generatedKey column="id" sqlStatement="Mysql"/>
            <association property="user" javaType="com.example.model.User" column="userId"/>
        </table>
    </context>
</generatorConfiguration>

示例代码

假设 order 表中的 userId 字段关联 user 表中的 id 字段,那么生成的代码可能如下:

Order.java

package com.example.model;

import com.example.model.User;

public class Order {
    private Integer id;
    private Integer userId;
    private String product;
    private String status;
    private User user;

    // getters and setters
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getProduct() {
        return product;
    }

    public void setProduct(String product) {
        this.product = product;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

OrderMapper.xml

<?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.OrderMapper">
    <resultMap id="BaseResultMap" type="com.example.model.Order">
        <id column="id" property="id"/>
        <result column="user_id" property="userId"/>
        <result column="product" property="product"/>
        <result column="status" property="status"/>
        <association property="user" javaType="com.example.model.User" column="user_id" select="selectByPrimaryKey"/>
    </resultMap>

    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
        SELECT
            id,
            user_id,
            product,
            status
        FROM
            order
        WHERE
            id = #{id}
    </select>
</mapper>

User.java

package com.example.model;

public class User {
    private Integer id;
    private String username;
    private String password;
    private String email;

    // getters and setters
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

UserMapper.xml

<?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.UserMapper">
    <resultMap id="BaseResultMap" type="com.example.model.User">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>
        <result column="email" property="email"/>
    </resultMap>

    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
        SELECT
            id,
            username,
            password,
            email
        FROM
            user
        WHERE
            id = #{id}
    </select>
</mapper>
生成器与IDE的集成

将 Mybatis Generator 与 IDE 集成可以提高开发效率。以下是如何将 Mybatis Generator 与 IntelliJ IDEA 或 Eclipse 集成的步骤:

IntelliJ IDEA 集成

  1. 安装 Mybatis Generator 插件
  2. 在项目中添加生成器配置文件 generatorConfig.xml
  3. 在 IntelliJ IDEA 中配置外部工具
    • 打开 File -> Settings -> Tools -> External Tools
    • 点击 + 按钮添加新的外部工具配置
    • 设置名称为 Mybatis Generator
    • 主要执行文件为 java -jar mybatis-generator-core-1.3.7.jar
    • 工作目录为项目的根目录
    • 参数为 -configfile generatorConfig.xml
  4. 在项目中右键,选择 External Tools -> Mybatis Generator 来启动生成器

Eclipse 集成

  1. 安装 Mybatis Generator 插件
  2. 在项目中添加生成器配置文件 generatorConfig.xml
  3. 在 Eclipse 中配置外部工具
    • 打开 Run -> External Tools -> External Tools Configurations
    • 点击 + 按钮添加新的外部工具配置
    • 设置名称为 Mybatis Generator
    • 主要执行文件为 java -jar mybatis-generator-core-1.3.7.jar
    • 工作目录为项目的根目录
    • 工具参数为 -configfile generatorConfig.xml
  4. 在项目中右键,选择 Run As -> Mybatis Generator 来启动生成器
调试与错误排查

调试 Mybatis Generator 时,可以通过日志输出来追踪问题。Mybatis Generator 支持通过日志配置文件 log4j.propertieslog4j.xml 来配置日志输出级别和格式。

配置示例

log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

将上述配置保存为 log4j.properties 文件并放置在与 generatorConfig.xml 同一目录下。启动 Mybatis Generator 后,日志信息将输出到控制台,帮助您排查问题。

常见问题解析
生成器不执行

如果 Mybatis Generator 不执行,通常是因为配置文件有误或数据库连接信息不正确。请确保配置文件中的 context 标签和 jdbcConnection 标签配置正确,数据库连接信息无误。

问题排查

  1. 检查数据库连接信息是否正确
  2. 确认生成器配置文件是否完整
  3. 执行 java -jar mybatis-generator-core-1.3.7.jar 时确保命令行参数正确
生成的代码不符合预期

如果生成的代码不符合预期,可能是由于配置文件中的 table 标签配置不正确或 property 标签设置不当。请仔细检查配置文件中的相关配置。

问题排查

  1. 检查 table 标签中的 tableName, generatedKey 等属性是否正确
  2. 检查 property 标签中的配置是否符合预期
性能优化建议

为了提高 Mybatis Generator 的性能,可以考虑以下建议:

  1. 减少生成表的数量:只生成实际需要使用的表,减少不必要的代码生成。
  2. 缓存配置文件:如果生成任务频繁,可以考虑将配置文件缓存在内存中,减少每次生成时的解析时间。
  3. 并行生成:如果环境支持,并行生成多个表可以提高生成效率。
实践案例分享
基于 Mybatis Generator 的项目实战

假设我们正在开发一个电商平台,需要从数据库中读取用户和订单信息。我们可以使用 Mybatis Generator 自动生成相关的代码,并集成到项目中。以下是具体步骤:

  1. 准备数据库表:创建 userorder 表,并插入一些示例数据。
  2. 配置 Mybatis Generator:编写 generatorConfig.xml 文件,定义要生成的表。
  3. 生成代码并集成:运行 Mybatis Generator 生成代码,并将生成的代码集成到项目中。
  4. 编写业务逻辑:使用生成的 Mapper 接口和实体类编写业务逻辑。

示例代码

假设 user 表和 order 表定义如下:

-- user 表
CREATE TABLE `user` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `username` VARCHAR(100) NOT NULL,
    `password` VARCHAR(100) NOT NULL,
    `email` VARCHAR(100)
);

-- order 表
CREATE TABLE `order` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `user_id` INT NOT NULL,
    `product` VARCHAR(100) NOT NULL,
    `status` VARCHAR(50) NOT NULL,
    FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
);

generatorConfig.xml 配置

<generatorConfiguration>
    <context id="test" targetRuntime="MyBatis3" defaultModelType="flat">
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mydb"
                        userId="root"
                        password="password"/>
        <javaModelGenerator targetPackage="com.example.model"
                            targetProject="src/main/java"/>
        <sqlMapGenerator targetPackage="com.example.mapper"
                         targetProject="src/main/resources"/>
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper"
                             targetProject="src/main/java"/>
        <table tableName="user">
            <generatedKey column="id" sqlStatement="Mysql"/>
        </table>
        <table tableName="order">
            <generatedKey column="id" sqlStatement="Mysql"/>
            <association property="user" javaType="com.example.model.User" column="user_id"/>
        </table>
    </context>
</generatorConfiguration>

生成后的代码

执行 Mybatis Generator 后,将生成 UserOrder 的实体类、映射文件和 Mapper 接口。此时,我们可以在项目中编写业务逻辑,例如查询用户订单:

UserService.java

package com.example.service;

import com.example.mapper.UserMapper;
import com.example.mapper.OrderMapper;
import com.example.model.User;
import com.example.model.Order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private OrderMapper orderMapper;

    public User getUser(int id) {
        return userMapper.selectByPrimaryKey(id);
    }

    public List<Order> getUserOrders(int id) {
        User user = userMapper.selectByPrimaryKey(id);
        if (user != null) {
            return orderMapper.selectByUserId(id);
        }
        return null;
    }
}

运行项目

在 Spring Boot 项目中,可以使用 Mybatis 和 Spring Data Mybatis 来管理数据库连接和事务管理。确保在 application.properties 文件中配置数据库连接信息,并在 pom.xml 中添加 Mybatis 和 Spring Data Mybatis 依赖。

# application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
<!-- pom.xml -->
<dependencies>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.1.3</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

通过以上步骤,我们可以使用 Mybatis Generator 自动生成代码,并将其集成到项目中,简化开发过程并提高开发效率。

使用经验总结

使用 Mybatis Generator 可以显著提高开发效率,减少手动编写代码的错误。以下是一些使用经验总结:

  1. 配置文件的重要:配置文件是生成器的核心,确保配置文件中的 table 标签和 property 标签配置正确。
  2. 版本兼容性:确保 Mybatis Generator 版本与 Mybatis 版本兼容。
  3. 性能优化:减少生成表的数量,合理使用缓存和并行生成。
  4. 代码维护:定期更新生成器配置文件,确保生成的代码与项目需求一致。
  5. IDE 集成:将生成器与 IDE 集成,提高开发效率。
用户社区推荐资源

通过上述资源,您可以进一步学习和了解 Mybatis Generator 的使用方法和最佳实践。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消