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

Mybatis官方生成器资料详解:新手入门教程

标签:
Java SSM 数据库
概述

Mybatis Generator(MBG)是Mybatis官方提供的代码生成工具,它可以根据数据库表信息自动生成Mybatis相关的实体类、Mapper接口及对应的XML配置文件。本文将详细介绍MBG的使用方法,并提供相关的配置和使用示例,帮助你更好地理解和应用Mybatis官方生成器资料。

什么是Mybatis生成器

Mybatis Generator(以下简称MBG)是Mybatis官方提供的一款代码生成工具,可以根据数据库表信息自动生成Mybatis相关的实体类(JavaBean)、Mapper接口及对应的XML配置文件。通过MBG,开发人员可以快速生成初始代码,从而减少手工编码的工作量,提高开发效率。

示例配置文件

<?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-configuration_1_0.dtd">

<generatorConfiguration>
    <context id="DB2Tables" targetRuntime="MyBatis3Simple">
        <commentGenerator>
            <!-- 是否去除自动生成的注释 true:是 false: 否 -->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!-- 数据库链接URL -->
        <jdbcConnection driverType="H2">
            <property name="driver" value="org.h2.Driver" />
            <property name="url" value="jdbc:h2:~/test" />
            <property name="username" value="sa" />
            <property name="password" value="sa" />
        </jdbcConnection>
        <!-- 生成模型(对应的实体类) -->
        <javaModelGenerator targetPackage="com.example.model" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- 生成映射文件 -->
        <sqlMapGenerator targetPackage="mappers" targetProject=".\src\main\resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
        <!-- 生成DAO接口 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
    </context>
</generatorConfiguration>
Mybatis生成器的作用与优势

Mybatis Generator的主要作用是减少重复的代码编写工作,特别是在处理数据库相关操作时。例如,当数据库表结构发生变更时,手动更新实体类和Mapper接口将变得繁琐且容易出错。使用MBG可以自动生成这些代码,从而确保代码的准确性和一致性。此外,MBG支持多种数据库,如MySQL、Oracle等,可以灵活适应不同的开发环境。

优势

  1. 提高开发效率:自动生成的代码减少了开发人员的手动编码工作量。
  2. 减少错误:自动生成的代码减少了由于人工编码造成的错误。
  3. 易维护性:当数据库表结构发生变化时,可以快速更新生成的代码,维护更简便。
安装配置Mybatis生成器
快速安装步骤

下载Mybatis Generator

从官方网站下载Mybatis Generator的JAR包,当前版本为1.4.0。下载地址:https://github.com/mybatis/generator/releases/latest

引入依赖

在你的项目中引入Mybatis Generator的依赖。如果使用的是Maven项目,可以将以下依赖添加到pom.xml文件中:

<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.4.0</version>
</dependency>

创建配置文件

创建Mybatis Generator的配置文件,如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-configuration_1_0.dtd">

<generatorConfiguration>
    <context id="DB2Tables" targetRuntime="MyBatis3Simple">
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <jdbcConnection driverType="H2">
            <property name="driver" value="org.h2.Driver" />
            <property name="url" value="jdbc:h2:~/test" />
            <property name="username" value="sa" />
            <property name="password" value="sa" />
        </jdbcConnection>
        <javaModelGenerator targetPackage="com.example.model" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <sqlMapGenerator targetPackage="mappers" targetProject=".\src\main\resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
    </context>
</generatorConfiguration>

执行代码生成

使用命令行工具运行Mybatis Generator。确保你的项目编译成功后,执行以下命令:

java -jar mybatis-generator-core-1.4.0.jar -configfile generatorConfig.xml -overwrite
配置XML文件详解

XML文件结构

generatorConfig.xml 文件是 Mybatis Generator 的配置文件,定义了生成代码的规则和目标。以下是各标签的详细说明:

  • <generatorConfiguration>:根标签,声明DTD和版本信息。
  • <context>:定义一个生成环境。可以有多个 <context> 标签,每个 <context> 标签表示一个生成环境。
  • <commentGenerator>:配置注释生成器,可以设置是否生成注释。
  • <jdbcConnection>:配置数据库连接信息。
  • <javaModelGenerator>:生成Java实体类的配置。
  • <sqlMapGenerator>:生成SQL映射文件的配置。
  • <javaClientGenerator>:生成DAO接口的配置。

示例配置文件

<generatorConfiguration>
    <context id="DB2Tables" targetRuntime="MyBatis3Simple">
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <jdbcConnection driverType="H2">
            <property name="driver" value="org.h2.Driver" />
            <property name="url" value="jdbc:h2:~/test" />
            <property name="username" value="sa" />
            <property name="password" value="sa" />
        </jdbcConnection>
        <javaModelGenerator targetPackage="com.example.model" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <sqlMapGenerator targetPackage="mappers" targetProject=".\src\main\resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
        <table tableName="users" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />
    </context>
</generatorConfiguration>
  • <context> 标签中的 targetRuntime 属性定义了生成代码的目标运行时环境,如 MyBatis3Simple。
  • <jdbcConnection> 标签中的 driverType 属性指定了数据库驱动类型,property 标签用于配置驱动类名、数据库URL、用户名和密码。
  • <javaModelGenerator> 标签中的 targetPackage 属性指定了生成Java实体类的包名,targetProject 属性指定了生成代码的目标项目路径。
  • <sqlMapGenerator><javaClientGenerator> 标签中的 targetPackagetargetProject 属性与 <javaModelGenerator> 类似,分别用于SQL映射文件和DAO接口的生成。
  • <table> 标签用于指定需要生成代码的数据库表,tableName 属性指定了表名,domainObjectName 属性指定了实体类的名称。
使用Mybatis生成器生成代码
创建数据库表

创建一个简单的数据库表 users,用于演示MBG的使用。以下是创建 users 表的SQL语句:

CREATE TABLE users (
  id INT PRIMARY KEY,
  name VARCHAR(255),
  email VARCHAR(255),
  age INT
);

插入数据

插入一些示例数据:

INSERT INTO users (id, name, email, age) VALUES (1, 'John Doe', 'john@example.com', 30);
INSERT INTO users (id, name, email, age) VALUES (2, 'Jane Smith', 'jane@example.com', 25);
INSERT INTO users (id, name, email, age) VALUES (3, 'Alice Johnson', 'alice@example.com', 28);
生成实体类、Mapper接口和XML文件

使用前面配置好的 generatorConfig.xml 文件生成代码。执行以下命令:

java -jar mybatis-generator-core-1.4.0.jar -configfile generatorConfig.xml -overwrite

MBG将根据 generatorConfig.xml 文件中的配置生成以下文件:

  • com.example.model 包下的 User.java 实体类。
  • mappers 包下的 UserMapper.xml 映射文件。
  • com.example.mapper 包下的 UserMapper.java 接口。

以下是生成的代码示例:

User.java

package com.example.model;

public class User {
    private Integer id;
    private String name;
    private String email;
    private Integer age;

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

UserMapper.java

package com.example.mapper;

import com.example.model.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.session.RowBounds;

import java.util.List;

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

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

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

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table users
     *
     * @mbg.generated
     */
    List<User> selectByExampleWithRowbounds(@Param("example") User record, @Param("rowBounds") RowBounds rowBounds);

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

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

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table users
     *
     * @mbg.generated
     */
    int updateByPrimaryKey(@Param("record") User record);
}

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">
    <cache />
    <resultMap id="BaseResultMap" type="com.example.model.User">
        <id column="id" property="id" />
        <result column="name" property="name" />
        <result column="email" property="email" />
        <result column="age" property="age" />
    </resultMap>
    <sql id="Base_Column_List">id, name, email, age</sql>
    <select id="selectByExample" resultMap="BaseResultMap" parameterType="com.example.model.User">
        select
        <if test="_parameter != null">
            <if test="distinct">
                distinct
            </if>
            <if test="oredCriteria != null">
                <if test="oredCriteria.size > 0">
                    <set>
                        ${oredCriteria[0].sql}
                    </set>
                </if>
            </if>
            <if test="orderByClause != null">
                order by ${orderByClause}
            </if>
        </if>
    </select>
    ... <!-- 更多的SQL映射语句 -->
</mapper>
Mybatis生成器常用配置选项
模板配置

MBG允许用户自定义模板生成代码。模板文件通常位于 generatorConfig.xml 文件中的 <template> 标签内。例如,可以自定义生成的实体类模板:

自定义实体类模板

<template type="mapper" file="userMapper.java">
    <property name="fileEncoding" value="UTF-8" />
    <property name="targetPackage" value="com.example.mapper" />
    <property name="targetProject" value=".\src\main\java" />
    <property name="enableSubPackages" value="true" />
    <property name="trimStrings" value="true" />
</template>

模板示例

package ${package};

import ${entityModelPackage}.${entityName};
import ${entityModelPackage}.Example.${entityName}Example;

public interface ${entityName}Mapper {
    int deleteByPrimaryKey(Integer id);

    int insert(${entityName} record);

    int insertSelective(${entityName} record);

    List<${entityName}> selectByExample(${entityName}Example example);

    ${entityName} selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(${entityName} record);

    int updateByPrimaryKey(${entityName} record);
}
生成规则配置

MBG支持多种生成规则配置,可以通过配置文件中的 property 标签来控制生成的行为。

示例配置

<generatorConfiguration>
    <context id="DB2Tables" targetRuntime="MyBatis3Simple">
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <jdbcConnection driverType="H2">
            <property name="driver" value="org.h2.Driver" />
            <property name="url" value="jdbc:h2:~/test" />
            <property name="username" value="sa" />
            <property name="password" value="sa" />
        </jdbcConnection>
        <javaModelGenerator targetPackage="com.example.model" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <sqlMapGenerator targetPackage="mappers" targetProject=".\src\main\resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
        <table tableName="users" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />
    </context>
</generatorConfiguration>
  • enableCountByExample:是否生成 countByExample 方法。
  • enableUpdateByExample:是否生成 updateByExample 方法。
  • enableDeleteByExample:是否生成 deleteByExample 方法。
  • enableSelectByExample:是否生成 selectByExample 方法。
  • selectByExampleQueryId:是否生成 selectByExampleQueryId 方法。
Mybatis生成器常见问题及解决方案
生成代码与实际情况不匹配

如果生成的代码与实际情况不匹配,可以考虑以下方法:

  1. 检查数据库表结构:确认数据库表结构是否与配置文件中的定义一致。
  2. 更新配置文件:根据实际情况更新 generatorConfig.xml 文件中的配置。
  3. 重新运行生成器:执行 java -jar mybatis-generator-core-1.4.0.jar -configfile generatorConfig.xml -overwrite 命令重新生成代码。

示例错误及解决方案

假设生成的代码中有一个编译错误,提示某个方法不存在:

public interface UserMapper {
    int deleteByPrimaryKey(Integer id);  // 错误:方法不存在
}

解决方案:

  1. 检查 generatorConfig.xml 文件中的 <table> 标签,确认 tableNamedomainObjectName 属性配置正确。
  2. 确认数据库表结构与配置文件中的定义一致。
  3. 重新生成代码:执行 java -jar mybatis-generator-core-1.4.0.jar -configfile generatorConfig.xml -overwrite
生成代码中出现错误

如果生成的代码中出现错误,检查以下可能的原因:

  1. 数据库连接配置:确保数据库连接配置正确,如驱动类名、URL、用户名和密码。
  2. 模板文件路径:确保自定义模板文件路径正确。
  3. 模板文件内容:检查模板文件内容是否符合规范。

示例错误及解决方案

假设生成的代码中有一个编译错误,提示某个方法不存在:

public interface UserMapper {
    int deleteByPrimaryKey(Integer id);  // 错误:方法不存在
}

解决方案:

  1. 检查 generatorConfig.xml 文件中的 <table> 标签,确认 tableNamedomainObjectName 属性配置正确。
  2. 确认数据库表结构与配置文件中的定义一致。
  3. 重新生成代码:执行 java -jar mybatis-generator-core-1.4.0.jar -configfile generatorConfig.xml -overwrite
其他常见问题
  1. 生成代码后需要手动修改:对于一些特殊情况,MBG生成的代码可能需要手动调整,如字段命名、注释等。
  2. 生成代码的性能问题:MBG生成的代码性能可能不如手工编写的代码,特别是复杂查询时。

解决方案

  1. 手动修改生成的代码:对于需要特殊处理的字段或方法,手动修改生成的代码。
  2. 优化查询性能:对于复杂的查询,考虑使用原生SQL语句或Mybatis的动态SQL功能来提高性能。
Mybatis生成器进阶使用
动态修改数据库表结构

在实际开发中,数据库表结构可能会不断变化。MBG支持动态修改生成的代码,以适应新的数据库结构。

示例

假设 users 表新增了一个字段 address

ALTER TABLE users ADD COLUMN address VARCHAR(255);

可以重新运行MBG生成器,MBG将根据新的数据库结构生成新的代码:

java -jar mybatis-generator-core-1.4.0.jar -configfile generatorConfig.xml -overwrite

生成的 User.java 实体类将包含新的 address 字段:

public class User {
    private Integer id;
    private String name;
    private String email;
    private Integer age;
    private String address;

    // Getter and Setter methods
}

注意事项

  • 数据迁移:在修改数据库表结构之前,确保数据迁移过程不会丢失重要数据。
  • 生成代码重命名:如果新的字段名称与旧的字段名称冲突,可能需要手动修改生成的代码以避免冲突。
自定义模板生成特定代码

MBG允许用户通过自定义模板来自定义生成的代码。这可以用于生成特定的业务逻辑代码,如特定的查询方法、事务管理等。

示例

假设需要生成一个自定义的查询方法 getUserById,可以修改 UserMapper.java 模板文件:

package ${package};

import ${entityModelPackage}.${entityName};
import ${entityModelPackage}.Example.${entityName}Example;

public interface ${entityName}Mapper {
    int deleteByPrimaryKey(Integer id);

    int insert(${entityName} record);

    int insertSelective(${entityName} record);

    List<${entityName}> selectByExample(${entityName}Example example);

    ${entityName} selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(${entityName} record);

    int updateByPrimaryKey(${entityName} record);

    // 自定义查询方法
    ${entityName} getUserById(Integer id);
}

生成的代码将包含自定义的 getUserById 方法:

public interface UserMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(User record);

    int insertSelective(User record);

    List<User> selectByExample(UserExample example);

    User selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(User record);

    int updateByPrimaryKey(User record);

    // 自定义查询方法
    User getUserById(Integer id);
}

注意事项

  • 模板文件路径:确保模板文件路径正确,并在 generatorConfig.xml 文件中正确配置。
  • 模板文件内容:确保模板文件内容符合语法规范,避免生成代码时出现错误。

通过自定义模板,用户可以根据实际需求生成特定的代码,从而更好地适应项目需求。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消