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

Mybatis官方生成器项目实战入门教程

标签:
SSM
概述

Mybatis官方生成器是一种强大的逆向工程工具,它能够根据数据库生成Mybatis的映射文件和实体类,显著提高开发效率。通过简单的配置,Mybatis Generator可以自动生成统一格式的代码,减少手工编写代码的工作量。本文将详细介绍Mybatis Generator的配置和使用方法,帮助开发者快速上手。

Mybatis官方生成器简介
Mybatis简介

Mybatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。Mybatis避免了几乎所有JDBC代码和手动设置参数以及获取结果集的需求。它可以通过简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(普通老式Java对象)映射成数据库中的记录。Mybatis的架构使其既支持存储过程又支持存储过程的输出参数,能够将存储过程输出参数映射到一个Java对象的属性。

Mybatis官方生成器概述

Mybatis Generator是一款Mybatis官方的逆向工程工具,它能够根据数据库生成对应的Mybatis映射文件(XML或注解形式)以及实体类。使用Mybatis Generator可以大大减少手工编写代码的工作量,特别是在处理复杂的数据库表结构时,可以显著提高开发效率。通过配置简单的XML文件,Mybatis Generator可以自动生成Java类,同时映射XML文件,使得开发人员可以更加专注于业务逻辑的实现,而不需要花太多时间处理数据库相关的代码。

生成器的优势和应用场景

优势

  1. 减少手工编写代码:Mybatis Generator可以自动生成映射文件和实体类,减少了开发人员手动编写这些代码的时间。
  2. 提高开发效率:自动生成的代码基础,开发人员可以更快速地完成数据库相关代码的开发。
  3. 维护简单:当数据库表结构发生变化时,只需要重新运行Mybatis Generator,即可生成最新的映射文件和实体类,减少了手工修改代码的工作量。
  4. 统一结构:Mybatis Generator生成的映射文件和实体类结构统一,有助于团队开发。

应用场景

  1. 新项目开发:对于新开发的项目,使用Mybatis Generator生成基础代码,可以加快开发进度。
  2. 已有项目重构:对于已经存在的项目,如果需要重构数据库相关的代码,使用Mybatis Generator可以快速生成统一格式的代码,提高代码质量。
  3. 团队协作:在团队开发中,使用Mybatis Generator可以保证每个人生成的代码格式一致,方便团队协作。
环境搭建
开发环境准备

开发环境包括:Java开发环境、数据库环境以及Mybatis Generator的运行环境。这里假设开发者已经安装了Java环境和数据库(如MySQL),下面介绍如何搭建Mybatis Generator的开发环境。

  1. Java环境:确保已经安装了JDK环境,可以通过命令java -version检查是否安装成功。
  2. 数据库:确保已经安装了数据库,这里以MySQL为例。安装完成后,通过命令行工具连接数据库。
  3. IDE:推荐使用IntelliJ IDEA或Eclipse作为开发工具,这里以IntelliJ IDEA为例。
Maven依赖配置

在开发中,使用Maven管理依赖是常见的做法。Mybatis Generator的运行需要添加相关的依赖。在项目中配置Maven,可以在pom.xml文件中添加以下依赖:

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

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.23</version>
</dependency>

其中,mybatis-generator-core是Mybatis Generator的核心库,mysql-connector-java是MySQL的连接库。

项目目录结构介绍

项目的基本目录结构如下:

src
└── main
    ├── java
    │   └── com.example
    │       └── generator
    │           └── Generator.java
    └── resources
        └── generatorConfig.xml

其中,Generator.java是一个简单的Java程序,用于运行Mybatis Generator。generatorConfig.xml是Mybatis Generator的配置文件。

配置文件详解

generatorConfig.xml是Mybatis Generator的核心配置文件,它定义了生成器的配置信息。以下是配置文件的基本结构及具体配置项的解释:

<generatorConfiguration>
    <context id="DB2Tables" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <commentGenerator>
            <!-- 是否去除自动生成的注释 true:是 false:否 -->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>

        <!-- 数据库相关配置 -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
            connectionURL="jdbc:mysql://localhost:3306/testdb"
            userId="root"
            password="password">
        </jdbcConnection>

        <!-- 实体类生成配置 -->
        <javaModelGenerator targetPackage="com.example.model"
            targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <!-- 映射文件生成配置 -->
        <sqlMapGenerator targetPackage="com.example.mapper"
            targetProject="src/main/resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>

        <!-- Mapper接口生成配置 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper"
            targetProject="src/main/java">
        </javaClientGenerator>

        <!-- 表生成配置 -->
        <table tableName="user" domainObjectName="User" enableCountByExample="false"
            enableUpdateByExample="false" enableDeleteByExample="false"
            enableSelectByExample="false" selectByExampleQueryId="false">
        </table>
    </context>
</generatorConfiguration>

评论生成器配置

<commentGenerator>标签用于配置生成的代码是否包含注释。通过<property name="suppressAllComments" value="true" />可以禁用自动生成的注释。

数据库连接配置

<jdbcConnection>标签定义了数据库连接信息,包括驱动类名、连接URL、用户名和密码。

实体类生成配置

<javaModelGenerator>标签定义了生成Java模型类的包名和目标项目路径。enableSubPackages属性用于启用子包生成,trimStrings属性用于控制字符串的处理方式。

映射文件生成配置

<sqlMapGenerator>标签定义了生成Mapper XML文件的包名和目标项目路径。

Mapper接口生成配置

<javaClientGenerator>标签定义了生成Mapper接口的包名、类型和目标项目路径。type="XMLMAPPER"指定生成XML形式的Mapper接口。

表生成配置

<table>标签定义了生成的表名称和对应的域对象名称。enableCountByExample等属性用于控制生成的Mapper接口的功能。

生成器使用实战
生成器的启动和运行

生成器的启动和运行可以通过运行一个简单的Java程序来实现。在项目的src/main/java目录下创建一个Java类Generator.java,并编写代码启动Mybatis Generator。运行生成器后,可以在指定的目录下查看生成的代码。

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.File;
import java.util.ArrayList;
import java.util.List;

public class Generator {

    public static void main(String[] args) throws Exception {
        List<String> warnings = new ArrayList<>();
        boolean overwrite = true;
        File configFile = new File("src/main/resources/generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    }

}

运行Generator.java后,会在targetProject指定的目录下生成相应的Java类、Mapper XML文件和Mapper接口。例如,如果配置文件中指定了targetProject="src/main/java"targetProject="src/main/resources",那么生成的代码将会出现在src/main/javasrc/main/resources目录下。

生成的代码包括:

  1. 模型类:在com.example.model包下生成User.java类。
  2. Mapper接口:在com.example.mapper包下生成UserMapper.java接口。
  3. Mapper XML文件:在com.example.mapper包下生成UserMapper.xml文件。

生成的代码示例如下:

// User.java
package com.example.model;

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

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

// UserMapper.java
package com.example.mapper;

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

// 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" />
    </resultMap>

    <sql id="Base_Column_List">
        id, username, password
    </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">
            *
        </if>
        from user
        where id = #{id, jdbcType=INTEGER}
    </select>

    <insert id="insert" parameterType="com.example.model.User">
        insert into user (
        id,
        username,
        password
        ) values (
        #{id, jdbcType=INTEGER},
        #{username, jdbcType=VARCHAR},
        #{password, jdbcType=VARCHAR}
        )
    </insert>

    <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
        delete from user
        where id = #{id, jdbcType=INTEGER}
    </delete>

    <update id="updateByPrimaryKeySelective" parameterType="com.example.model.User">
        update user
        <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>
动态更新生成的代码

当数据库表结构发生变化时,可以通过重新运行Mybatis Generator来生成新的代码。例如,如果添加了一个新的字段emailuser表中,可以通过修改配置文件,再运行Generator.java来生成新的代码。

常见问题及解决方法
常见错误及解决方案
  1. ClassNotFoundException:通常是因为缺少相应的JDBC驱动类。确保在pom.xml中添加了正确的JDBC驱动依赖。
  2. Connection refused:检查数据库连接URL是否正确,确保数据库服务已经启动并且可访问。
  3. Schema not found:检查数据库的schema(即数据库名)是否正确。
  4. Incorrect column type:检查generatorConfig.xml中的列名是否与数据库中的列名一致。
  5. Mapper XML文件缓存问题:有时候需要删除target目录下的缓存,重新生成代码。
生成器定制化配置

Mybatis Generator提供了丰富的配置选项,可以通过修改generatorConfig.xml来定制化生成代码。例如,可以通过设置enableSubPackages属性来启用子包生成,或者通过设置trimStrings属性来控制字符串的处理方式。

<javaModelGenerator targetPackage="com.example.model"
    targetProject="src/main/java">
    <property name="enableSubPackages" value="true" />
    <property name="trimStrings" value="true" />
</javaModelGenerator>
生成器与IDE集成

为了方便开发人员使用Mybatis Generator,可以将Generator.java集成到IDE中。例如,在IntelliJ IDEA中,可以将Generator.java添加到项目的Run Configurations中,这样就可以通过点击IDE中的运行按钮来启动生成器。

实战案例分享
示例项目搭建

假设我们有一个简单的用户表user,用于存储用户的ID、用户名和密码。可以通过Mybatis Generator生成对应的Java类、Mapper接口和Mapper XML文件。

  1. 创建数据库表:首先在数据库中创建用户表user
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
  1. 配置生成器:在generatorConfig.xml中配置数据库连接和表生成信息。
<generatorConfiguration>
    <context id="DB2Tables" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>

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

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

        <sqlMapGenerator targetPackage="com.example.mapper"
            targetProject="src/main/resources">
            <property name="enableSubPackages" value=" PyTupleProxy.true" />
        </sqlMapGenerator>

        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper"
            targetProject="src/main/java">
        </javaClientGenerator>

        <table tableName="user" domainObjectName="User" enableCountByExample="false"
            enableUpdateByExample="false" enableDeleteByExample="false"
            enableSelectByExample="false" selectByExampleQueryId="false">
        </table>
    </context>
</generatorConfiguration>
  1. 运行生成器:运行Generator.java,生成对应的代码。
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.File;
import java.util.ArrayList;
import java.util.List;

public class Generator {

    public static void main(String[] args) throws Exception {
        List<String> warnings = new ArrayList<>();
        boolean overwrite = true;
        File configFile = new File("src/main/resources/generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    }

}
示例项目运行

运行生成的代码,可以编写简单的测试代码来验证生成的代码是否正确。例如,可以编写一个简单的Spring Boot应用来使用生成的Mapper接口。

  1. 配置Spring Boot项目
    • pom.xml中添加相关依赖。
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.1.3</version>
    </dependency>
</dependencies>
  • application.yml中配置数据库连接信息。
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
    username: root
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver
  1. 使用生成的Mapper接口
    • 创建一个简单的Mapper接口和控制器来操作生成的代码。
// UserMapper.java
package com.example.mapper;

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);
}
// UserController.java
package com.example.controller;

import com.example.mapper.UserMapper;
import com.example.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserMapper userMapper;

    @GetMapping("/all")
    public List<User> getAllUsers() {
        return userMapper.selectAll();
    }

    @GetMapping("/{id}")
    public User getUserById(@RequestParam Integer id) {
        return userMapper.selectByPrimaryKey(id);
    }
}
示例项目优化

可以通过以下方式进一步优化生成的代码:

  1. 添加注释:在生成的代码中添加有用的注释,帮助其他开发者理解代码。
  2. 自定义模板:使用Mybatis Generator提供的自定义模板功能,生成更加符合项目规范的代码。
  3. 自动化生成:将生成器集成到持续集成(CI)流程中,每次代码仓库有更新时自动生成代码,确保代码的一致性和正确性。
// 自定义模板示例
package com.example.template;

public class CustomUser {
    private Integer id;
    private String username;
    private String password;

    // 自定义构造器和方法
}
点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消