继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Mybatis官方生成器入门教程

米琪卡哇伊
关注TA
已关注
手记 228
粉丝 4
获赞 30
概述

MyBatis Generator(简称MBG)是一个强大的代码生成工具,能够自动生成MyBatis所需的Mapper接口、XML映射文件和Java实体类,大幅减少开发人员的手动编写工作量。本文将详细介绍Mybatis官方生成器入门知识,包括安装配置、基本用法以及一些高级用法和实战案例。通过本文,你将快速掌握这一实用工具,提升开发效率。

MyBatis生成器简介

1.1 MyBatis生成器的作用

MyBatis Generator(简称MBG)是一个自动化的代码生成工具,能够根据数据库表自动生成MyBatis所需的Mapper接口、XML映射文件和Java实体类。MBG显著减少了开发人员手动编写这些基础代码的工作量,提高了开发效率。

1.2 MyBatis生成器的优势

使用MBG的优势包括:

  • 提升开发效率:自动化生成基础代码,节省手动编写时间。
  • 减少错误:减少手动编写带来的潜在错误。
  • 代码规范:生成的代码符合MyBatis最佳实践,增强了代码的一致性。
  • 易于维护:一旦数据库表结构发生变更,只需重新生成代码即可,无需手动修改大量代码。
MyBatis生成器安装与配置

2.1 搭建开发环境

首先,需要搭建Java开发环境。这里以JDK 1.8作为示例。安装JDK后,配置环境变量JAVA_HOME,设置PATH包含%JAVA_HOME%\bin

然后,搭建IDE(如IntelliJ IDEA或Eclipse)。

接下来,安装Maven,用于构建项目。下载Maven并配置MAVEN_HOME环境变量,确保PATH包含%MAVEN_HOME%\bin

最后,创建一个Maven项目,并在pom.xml中添加必要的依赖。

示例的pom.xml配置如下:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>mybatis-generator</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <!-- MyBatis依赖 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>
        <!-- MyBatis Generator 依赖 -->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.7</version>
        </dependency>
    </dependencies>
</project>

2.2 下载并配置MyBatis Generator

下载MyBatis Generator的jar包,可以去Maven仓库下载。下载完成后,将jar包添加到项目中,并配置mybatis-generator.xml文件。

配置文件示例(mybatis-generator.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-config.dtd">
<generatorConfiguration>
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
            <!-- 设置生成日期 -->
            <property name="dateFormat" value="yyyy-MM-dd"/>
        </commentGenerator>
        <jdbcConnection driverType="MYSQL">
            <!-- 数据库连接信息 -->
            <property name="connection.driverClass" value="com.mysql.cj.jdbc.Driver"/>
            <property name="connection.url" value="jdbc:mysql://localhost:3306/mydb"/>
            <property name="connection.username" value="root"/>
            <property name="connection.password" value="password"/>
        </jdbcConnection>
        <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"/>
    </context>
</generatorConfiguration>
MyBatis生成器的基本用法

3.1 生成器配置文件详解

配置文件mybatis-generator.xml包含了生成器的所有配置信息。其中,<context>标签用来定义生成器上下文,可以配置多个上下文,每个上下文可以生成不同的目标代码。

  • <commentGenerator>:配置生成的注释信息。例如,设置是否生成所有注释和日期格式。
  • <jdbcConnection>:配置数据库连接信息,包括驱动类、URL、用户名和密码。
  • <javaModelGenerator>:配置生成实体类的信息,如包名、生成文件存放位置等。
  • <sqlMapGenerator>:配置生成XML映射文件的信息,如包名、生成文件存放位置等。
  • <javaClientGenerator>:配置生成Mapper接口的信息,如包名、生成文件存放位置等。
  • <table>:配置需要生成代码的表信息,如表名。

示例:

<generatorConfiguration>
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
            <property name="dateFormat" value="yyyy-MM-dd"/>
        </commentGenerator>
        <jdbcConnection driverType="MYSQL">
            <property name="connection.driverClass" value="com.mysql.cj.jdbc.Driver"/>
            <property name="connection.url" value="jdbc:mysql://localhost:3306/mydb"/>
            <property name="connection.username" value="root"/>
            <property name="connection.password" value="password"/>
        </jdbcConnection>
        <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" domainObjectName="User">
            <ignoreGeneratedAlwaysColumns>true</ignoreGeneratedAlwaysColumns>
        </table>
    </context>
</generatorConfiguration>

3.2 生成Mapper接口与XML文件

配置好生成器配置文件后,可以通过命令行执行生成器,或者在IDE中配置任务来生成Mapper接口和XML文件。

示例代码:

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class MyBatisGeneratorDemo {

    public static void main(String[] args) throws Exception {
        List<String> warnings = new ArrayList<>();
        boolean overwrite = true;
        InputStream stream = MyBatisGeneratorDemo.class.getResourceAsStream("/mybatis-generator.xml");
        ConfigurationParser parser = new ConfigurationParser(warnings);
        Configuration config = parser.parseConfiguration(stream);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    }
}

3.3 生成实体类

通过配置mybatis-generator.xml文件中的<javaModelGenerator>标签,可以指定实体类的生成位置和包名。

示例代码:

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

生成的实体类示例:

package com.example.model;

import java.sql.Date;

public class User {
    private Integer id;
    private String username;
    private String password;
    private Date createDate;

    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 Date getCreateDate() {
        return createDate;
    }

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }
}
MyBatis生成器的高级用法

4.1 自定义生成规则

可以在mybatis-generator.xml文件中自定义生成规则,例如重命名字段、修改生成的类名等。

示例:

<table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
    <columnOverride column="id" property="userId"/>
    <columnOverride column="username" property="userUsername"/>
</table>

4.2 配置多数据源

在配置文件中可以添加多个<context>节点,每个节点可以配置不同的数据源。这在需要连接多个数据库时非常有用。

示例:

<generatorConfiguration>
    <context id="DB1Tables" targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <jdbcConnection driverType="MYSQL">
            <property name="connection.driverClass" value="com.mysql.cj.jdbc.Driver"/>
            <property name="connection.url" value="jdbc:mysql://localhost:3306/db1"/>
            <property name="connection.username" value="root"/>
            <property name="connection.password" value="password"/>
        </jdbcConnection>
        <javaModelGenerator targetPackage="com.example.modelDb1" targetProject="./src/main/java"/>
        <sqlMapGenerator targetPackage="com.example.mapperDb1" targetProject="./src/main/resources"/>
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapperDb1" targetProject="./src/main/java"/>
        <table tableName="user"/>
    </context>
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <jdbcConnection driverType="MYSQL">
            <property name="connection.driverClass" value="com.mysql.cj.jdbc.Driver"/>
            <property name="connection.url" value="jdbc:mysql://localhost:3306/db2"/>
            <property name="connection.username" value="root"/>
            <property name="connection.password" value="password"/>
        </jdbcConnection>
        <javaModelGenerator targetPackage="com.example.modelDb2" targetProject="./src/main/java"/>
        <sqlMapGenerator targetPackage="com.example.mapperDb2" targetProject="./src/main/resources"/>
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapperDb2" targetProject="./src/main/java"/>
        <table tableName="user"/>
    </context>
</generatorConfiguration>
MyBatis生成器实战案例

5.1 实战案例一:简单CRUD操作

本节通过一个简单的用户表,演示如何使用MBG生成CRUD操作的代码。

首先,创建一个用户表users

CREATE TABLE `users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(45) NOT NULL,
  `password` VARCHAR(45) NOT NULL,
  `create_date` DATE NOT NULL,
  PRIMARY KEY (`id`)
);

然后,配置mybatis-generator.xml文件:

<generatorConfiguration>
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <jdbcConnection driverType="MYSQL">
            <property name="connection.driverClass" value="com.mysql.cj.jdbc.Driver"/>
            <property name="connection.url" value="jdbc:mysql://localhost:3306/mydb"/>
            <property name="connection.username" value="root"/>
            <property name="connection.password" value="password"/>
        </jdbcConnection>
        <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="users" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
    </context>
</generatorConfiguration>

执行生成器命令,生成的代码包括User实体类、UserMapper接口、UserMapper.xml文件。

示例的UserMapper接口:

package com.example.mapper;

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

public interface UserMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(User record);

    int insertSelective(User record);

    User selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(User record);

    int updateByPrimaryKey(User record);

    List<User> selectAll();
}

示例的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" jdbcType="INTEGER" property="id" />
        <result column="username" jdbcType="VARCHAR" property="username" />
        <result column="password" jdbcType="VARCHAR" property="password" />
        <result column="create_date" jdbcType="DATE" property="createDate" />
    </resultMap>
    <sql id="Base_Column_List">
        id, username, password, create_date
    </sql>
    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
        SELECT
        <if test="columnList != null and columnList.length > 0">
            ${columnList}
        </if>
        <if test="columnList == null or columnList.length == 0">
            id, username, password, create_date
        </if>
        FROM users
        WHERE id = #{id,jdbcType=INTEGER}
    </select>
    <insert id="insert" parameterType="com.example.model.User">
        INSERT INTO users (username, password, create_date)
        VALUES (#{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{createDate,jdbcType=DATE})
    </insert>
    <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
        DELETE FROM users WHERE id = #{id,jdbcType=INTEGER}
    </delete>
    <update id="updateByPrimaryKey" parameterType="com.example.model.User">
        UPDATE users SET username = #{username,jdbcType=VARCHAR}, password = #{password,jdbcType=VARCHAR}, create_date = #{createDate,jdbcType=DATE}
        WHERE id = #{id,jdbcType=INTEGER}
    </update>
    <select id="selectAll" resultMap="BaseResultMap">
        SELECT
        <if test="columnList != null and columnList.length > 0">
            ${columnList}
        </if>
        <if test="columnList == null or columnList.length == 0">
            id, username, password, create_date
        </if>
        FROM users
    </select>
</mapper>

5.2 实战案例二:复杂查询操作

本节通过复杂的查询操作,演示如何使用MBG生成复杂的Mapper代码。

首先,创建一个订单表orders

CREATE TABLE `orders` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `user_id` INT NOT NULL,
  `product_id` INT NOT NULL,
  `quantity` INT NOT NULL,
  `total_price` DECIMAL(10, 2) NOT NULL,
  `order_date` DATE NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (`user_id`) REFERENCES users(id) ON DELETE RESTRICT ON UPDATE RESTRICT,
  FOREIGN KEY (`product_id`) REFERENCES products(id) ON DELETE RESTRICT ON UPDATE RESTRICT
);

然后,创建一个产品表products

CREATE TABLE `products` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `product_name` VARCHAR(100) NOT NULL,
  `price` DECIMAL(10, 2) NOT NULL,
  PRIMARY KEY (`id`)
);

接着,配置mybatis-generator.xml文件:

<generatorConfiguration>
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <jdbcConnection driverType="MYSQL">
            <property name="connection.driverClass" value="com.mysql.cj.jdbc.Driver"/>
            <property name="connection.url" value="jdbc:mysql://localhost:3306/mydb"/>
            <property name="connection.username" value="root"/>
            <property name="connection.password" value="password"/>
        </jdbcConnection>
        <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="orders" domainObjectName="Order" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
            <generatedKey column="id" sqlStatement="MySql" identity="true"/>
        </table>
        <table tableName="products" domainObjectName="Product" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
            <generatedKey column="id" sqlStatement="MySql" identity="true"/>
        </table>
    </context>
</generatorConfiguration>

执行生成器命令,生成的代码包括OrderProduct实体类、OrderMapperProductMapper接口、OrderMapper.xmlProductMapper.xml文件。

示例的OrderMapper接口:

package com.example.mapper;

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

public interface OrderMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(Order record);

    int insertSelective(Order record);

    Order selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(Order record);

    int updateByPrimaryKey(Order record);

    List<Order> selectAll();
}

示例的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" jdbcType="INTEGER" property="id" />
        <result column="user_id" jdbcType="INTEGER" property="userId" />
        <result column="product_id" jdbcType="INTEGER" property="productId" />
        <result column="quantity" jdbcType="INTEGER" property="quantity" />
        <result column="total_price" jdbcType="DECIMAL" property="totalPrice" />
        <result column="order_date" jdbcType="DATE" property="orderDate" />
    </resultMap>
    <sql id="Base_Column_List">
        id, user_id, product_id, quantity, total_price, order_date
    </sql>
    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
        SELECT
        <if test="columnList != null and columnList.length > 0">
            ${columnList}
        </if>
        <if test="columnList == null or columnList.length == 0">
            id, user_id, product_id, quantity, total_price, order_date
        </if>
        FROM orders
        WHERE id = #{id,jdbcType=INTEGER}
    </select>
    <insert id="insert" parameterType="com.example.model.Order">
        INSERT INTO orders (user_id, product_id, quantity, total_price, order_date)
        VALUES (#{userId,jdbcType=INTEGER}, #{productId,jdbcType=INTEGER}, #{quantity,jdbcType=INTEGER}, #{totalPrice,jdbcType=DECIMAL}, #{orderDate,jdbcType=DATE})
    </insert>
    <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
        DELETE FROM orders WHERE id = #{id,jdbcType=INTEGER}
    </delete>
    <update id="updateByPrimaryKey" parameterType="com.example.model.Order">
        UPDATE orders SET user_id = #{userId,jdbcType=INTEGER}, product_id = #{productId,jdbcType=INTEGER}, quantity = #{quantity,jdbcType=INTEGER}, total_price = #{totalPrice,jdbcType=DECIMAL}, order_date = #{orderDate,jdbcType=DATE}
        WHERE id = #{id,jdbcType=INTEGER}
    </update>
    <select id="selectAll" resultMap="BaseResultMap">
        SELECT
        <if test="columnList != null and columnList.length > 0">
            ${columnList}
        </if>
        <if test="columnList == null or columnList.length == 0">
            id, user_id, product_id, quantity, total_price, order_date
        </if>
        FROM orders
    </select>
</mapper>
常见问题与解决方案

6.1 常见错误及解决方法

  • 找不到数据库驱动:确保已下载数据库驱动jar包,并将其添加到项目类路径中。
  • 数据库连接失败:检查数据库连接信息是否正确,确保数据库服务正常运行。
  • 生成的代码有错误:确保生成器配置文件正确无误,特别是数据库表名和字段名。
  • 生成文件未更新:尝试关闭IDE,手动删除生成的文件,重新生成。

6.2 使用过程中遇到的常见问题

  • 生成的代码不满足需求:可以自定义生成规则,如重命名字段、修改生成类名等。
  • 生成代码后无法运行:确保生成的代码与项目其他部分兼容,检查生成的Mapper接口和XML文件是否正确配置。
  • 生成器性能问题:优化生成过程,如减少生成的表数量,使用更高效的生成规则。

通过以上指南,你应该能够顺利使用MyBatis Generator生成代码,提高开发效率。更多高级用法和配置细节可以在官方文档中查找。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP