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

Mybatis官方生成器资料入门教程

概述

本文介绍了MyBatis官方生成器(MyBatis Generator)的功能、配置及使用方法,帮助开发者快速生成MyBatis所需的映射文件、实体类和DAO接口,从而减少手动编码的工作量。MyBatis Generator支持多种数据库,通过简单的配置文件即可实现自动生成代码,提高开发效率。此外,文章还详细介绍了MyBatis的核心概念,以便让读者更好地理解MyBatis的工作原理。

MyBatis概述

MyBatis简介

MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。它通过 XML 或注解的方式将 SQL 语句与 Java 代码进行分离,使得系统更易维护。MyBatis 可用于任何种类的关系数据库,并且与数据库驱动程序无关。MyBatis 的设计目标是简化数据库操作,提高开发效率,减少代码量。

MyBatis的核心概念

MyBatis 的核心概念包括:

  1. 配置文件:位于 mybatis-config.xml 文件中,定义了数据库连接信息、映射文件位置等全局配置。
  2. 映射文件(Mapper XML):定义了 SQL 语句及如何将 SQL 语句返回的结果映射到 Java 对象中的属性。
  3. SqlSessionFactory:它是 MyBatis 工作的中心,负责创建 SqlSession 实例。
  4. SqlSession:用于执行 SQL 语句的会话对象,它提供了一系列方法用于执行数据库操作。
  5. Mapper 接口:定义了数据库操作的 Java 接口,与 XML 映射文件中的 SQL 语句一一对应。

下面是一个简单的示例,展示如何配置 mybatis-config.xml 文件:

<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>
什么是MyBatis官方生成器

生成器的作用

MyBatis 官方生成器(MyBatis Generator)是一个代码生成工具,可自动生成 MyBatis 的映射文件(Mapper XML)、Java 实体类、DAO 接口等。它通过解析数据库的元数据自动生成对应的代码,从而大大减少开发人员手动编写这些代码的工作量。生成器支持多种数据库,如 MySQL、Oracle、SQL Server 等。

生成器的工作原理

MyBatis Generator 通过 JDBC 连接到数据库,获取数据库中的表信息(如表名、字段名、字段类型、主键等),然后根据这些信息生成对应的 SQL 映射文件(Mapper XML)、Java 实体类和 DAO 接口。生成器支持自定义配置文件(generatorConfig.xml),用户可以指定生成的代码的格式和位置。

以下是一个简单的 generatorConfig.xml 配置示例:

<generatorConfiguration>
    <context id="testTables" targetRuntime="MyBatis3">
        <jdbcConnection driverType="MYSQL">
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
            <property name="username" value="root"/>
            <property name="password" value="password"/>
        </jdbcConnection>
        <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="user" domainObjectName="User"/>
    </context>
</generatorConfiguration>

从上面的配置文件中可以看出,生成器明确指出了数据库连接信息、生成的 Java 和 XML 代码的位置以及生成的表名和对应的 Java 类名。

如何安装和配置MyBatis官方生成器

安装步骤详解

  1. 下载和安装 Maven:MyBatis Generator 需要通过 Maven 来安装。首先确保已经安装了 Maven。
  2. 添加 MyBatis Generator 依赖:在 Maven 项目的 pom.xml 文件中添加 MyBatis Generator 的依赖。
<dependencies>
    <dependency>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-core</artifactId>
        <version>1.4.0</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.25</version>
    </dependency>
</dependencies>
  1. 配置 generatorConfig.xml 文件:配置数据库连接信息和生成代码的位置,例如:
<generatorConfiguration>
    <context id="testTables" targetRuntime="MyBatis3">
        <jdbcConnection driverType="MYSQL">
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
            <property name="username" value="root"/>
            <property name="password" value="password"/>
        </jdbcConnection>
        <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="user" domainObjectName="User"/>
    </context>
</generatorConfiguration>

配置文件解析

generatorConfig.xml 文件中定义了生成器的配置信息,主要包括以下几个部分:

  1. JDBC 连接信息:通过 <jdbcConnection> 标签提供数据库的连接信息。
  2. Java Model 生成配置:通过 <javaModelGenerator> 标签定义生成 Java 实体类的位置。
  3. SQL Map 生成配置:通过 <sqlMapGenerator> 标签定义生成 SQL 映射文件的位置。
  4. Java Client 生成配置:通过 <javaClientGenerator> 标签定义生成 DAO 接口的位置。
  5. 表配置:通过 <table> 标签定义需要生成代码的表信息。

例如,生成 User 表的代码:

<table tableName="user" domainObjectName="User">
    <generatedKey column="id" sqlType="INTEGER" identity="true" />
</table>

<table> 标签中,tableName 指定了数据库表名,domainObjectName 指定了生成的 Java 类名。<generatedKey> 标签用于指定主键生成规则。

使用MyBatis官方生成器生成代码

生成器参数配置

MyBatis Generator 可以通过命令行或者 Maven 插件来运行。以下是如何通过 Maven 插件运行生成器的步骤:

  1. pom.xml 中添加 Maven 插件配置
<build>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.4.0</version>
            <configuration>
                <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>8.0.25</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>
  1. 运行生成器:在 Maven 项目的根目录下运行以下命令:
mvn mybatis-generator:generate

生成代码示例

假设有一个 user 表,包含以下字段:

CREATE TABLE `user` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `username` varchar(50) NOT NULL,
    `password` varchar(50) NOT NULL,
    PRIMARY KEY (`id`)
);

生成器会根据以上表信息自动生成以下文件:

Java 实体类 User.java

package com.example.model;

public class User {
    private int id;
    private String username;
    private String password;

    public User() {}

    public User(int id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    public int getId() {
        return id;
    }

    public void setId(int 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;
    }
}

SQL 映射文件 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" />
    </resultMap>

    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="int">
        SELECT `id`, `username`, `password` FROM `user`
        WHERE `id` = #{id,jdbcType=INTEGER}
    </select>

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

    <update id="updateByPrimaryKeySelective" parameterType="com.example.model.User">
        UPDATE `user` SET
        <set>
            <if test="username != null">
                `username` = #{username,jdbcType=VARCHAR},
            </if>
            <if test="password != null">
                `password` = #{password,jdbcType=VARCHAR},
            </if>
        </set>
        WHERE `id` = #{id,jdbcType=INTEGER}
    </update>
</mapper>

DAO 接口 UserMapper.java

package com.example.mapper;

import com.example.model.User;

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);
}
MyBatis官方生成器的高级功能

常见问题解答

  1. 生成的代码是否可以修改?

    • 可以修改生成的代码,但建议修改 <table> 标签中的 enableInsert, enableDelete, enableUpdate, enableSelectByPrimaryKey, enableSelectByExample, enableCountByExample, enableUpdateByExample 参数来控制生成的代码。
  2. 如何自定义生成的代码格式?
    • 通过修改 generatorConfig.xml 文件中的配置项来控制生成代码的格式,例如修改 Java 实体类的布局或 SQL 映射文件中的 SQL 语句格式。

功能扩展和自定义配置

  1. 自定义实体类生成器

    • 可以通过自定义 JavaModelGenerator 类来控制 Java 实体类的生成逻辑,例如修改实体类的命名规则或属性的命名规则。
  2. 自定义 SQL 语句生成器

    • 可以通过自定义 SqlMapGenerator 类来控制 SQL 映射文件的生成逻辑,例如修改 SQL 语句的格式或添加自定义的 SQL 语句模板。
  3. 自定义 DAO 接口生成器
    • 可以通过自定义 JavaClientGenerator 类来控制 DAO 接口的生成逻辑,例如修改接口方法的命名规则或添加自定义的方法。

以下是一个自定义实体类生成器的示例:

package com.example.generator;

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.TopLevelClass;

public class CustomJavaModelGenerator extends PluginAdapter {

    @Override
    public boolean validate(IntrospectedTable introspectedTable) {
        return true;
    }

    @Override
    public void clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        // 自定义接口生成逻辑
    }

    @Override
    public void modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        // 自定义实体类生成逻辑
        topLevelClass.addImportedType("java.time.LocalDate");
        for (IntrospectedColumn introspectedColumn : introspectedTable.getAllColumns()) {
            Field field = topLevelClass.getField(introspectedColumn.getActualColumnName());
            if ("date".equals(introspectedColumn.getJdbcType().toString().toLowerCase())) {
                field.setType("LocalDate");
            }
        }
    }
}
实际案例应用

项目实践

假设有一个电商项目,需要从数据库中读取商品信息。可以使用 MyBatis Generator 生成商品表 product 的相关代码,包括 Java 实体类、SQL 映射文件和 DAO 接口。

商品表结构

CREATE TABLE `product` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(100) NOT NULL,
    `description` text,
    `price` decimal(10, 2) NOT NULL,
    `quantity` int(11) NOT NULL,
    PRIMARY KEY (`id`)
);

生成器配置文件 generatorConfig.xml

<generatorConfiguration>
    <context id="testTables" targetRuntime="MyBatis3">
        <jdbcConnection driverType="MYSQL">
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
            <property name="username" value="root"/>
            <property name="password" value="password"/>
        </jdbcConnection>
        <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="product" domainObjectName="Product"/>
    </context>
</generatorConfiguration>

生成的 Java 实体类 Product.java

package com.example.model;

import java.math.BigDecimal;

public class Product {
    private int id;
    private String name;
    private String description;
    private BigDecimal price;
    private int quantity;

    public Product() {}

    public Product(int id, String name, String description, BigDecimal price, int quantity) {
        this.id = id;
        this.name = name;
        this.description = description;
        this.price = price;
        this.quantity = quantity;
    }

    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;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }
}

生成的 SQL 映射文件 ProductMapper.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.ProductMapper">
    <resultMap id="BaseResultMap" type="com.example.model.Product">
        <id column="id" jdbcType="INTEGER" property="id" />
        <result column="name" jdbcType="VARCHAR" property="name" />
        <result column="description" jdbcType="LONGVARCHAR" property="description" />
        <result column="price" jdbcType="DECIMAL" property="price" />
        <result column="quantity" jdbcType="INTEGER" property="quantity" />
    </resultMap>

    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="int">
        SELECT `id`, `name`, `description`, `price`, `quantity` FROM `product`
        WHERE `id` = #{id,jdbcType=INTEGER}
    </select>

    <insert id="insert" parameterType="com.example.model.Product">
        INSERT INTO `product` (`name`, `description`, `price`, `quantity`) VALUES (#{name,jdbcType=VARCHAR}, #{description,jdbcType=LONGVARCHAR}, #{price,jdbcType=DECIMAL}, #{quantity,jdbcType=INTEGER})
    </insert>

    <update id="updateByPrimaryKeySelective" parameterType="com.example.model.Product">
        UPDATE `product` SET
        <set>
            <if test="name != null">
                `name` = #{name,jdbcType=VARCHAR},
            </if>
            <if test="description != null">
                `description` = #{description,jdbcType=LONGVARCHAR},
            </if>
            <if test="price != null">
                `price` = #{price,jdbcType=DECIMAL},
            </if>
            <if test="quantity != null">
                `quantity` = #{quantity,jdbcType=INTEGER},
            </if>
        </set>
        WHERE `id` = #{id,jdbcType=INTEGER}
    </update>
</mapper>

生成的 DAO 接口 ProductMapper.java

package com.example.mapper;

import com.example.model.Product;

public interface ProductMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(Product record);

    int insertSelective(Product record);

    Product selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(Product record);

    int updateByPrimaryKey(Product record);
}

生成器在项目中的优势

  1. 减少开发时间:通过自动生成代码,可以大大减少开发人员编写 SQL 语句和 Java 代码的时间。
  2. 提高代码质量:生成的代码经过了严格的测试和优化,通常比手动编写的代码更健壮。
  3. 维护简单:将数据库结构和 Java 代码分离,便于维护和扩展。
  4. 一致性保证:生成的代码遵循一致的编码规范,减少了人为错误。
点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消