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

Mybatis代码生成器入门教程

概述

Mybatis代码生成器是一种自动化工具,用于自动生成Mybatis所需的Mapper接口、XML映射文件、实体类等代码,极大地提高了开发效率。本文将详细介绍Mybatis代码生成器的安装、配置和使用方法,帮助开发者快速上手。

Mybatis代码生成器简介与安装

Mybatis代码生成器是一种自动化工具,用于自动生成Mybatis的Mapper接口、XML映射文件、实体类等代码。它极大地提高了开发效率,特别是在处理与数据库交互的代码时。本教程将详细介绍如何安装和使用Mybatis代码生成器。

Mybatis代码生成器简介

Mybatis代码生成器主要是通过读取数据库的表结构信息,自动生成Mybatis所需要的Java代码文件。生成的代码包括:

  • Mapper接口
  • XML映射文件
  • 实体类
  • 枚举类型
  • 构造器工厂
  • 查询类

安装Mybatis代码生成器前,请确保已经安装了Java开发环境和Maven构建工具。Mybatis代码生成器支持多种数据库,例如MySQL、Oracle、SQL Server等。

Mybatis代码生成器安装

Mybatis代码生成器可以通过Maven依赖引入。在项目中添加以下依赖:

<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper</artifactId>
    <version>3.4.0</version>
</dependency>
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-generator</artifactId>
    <version>1.3.3</version>
</dependency>
``

#### 配置文件

在项目的`src/main/resources`目录下创建`generatorConfig.xml`文件,用于配置代码生成器的相关参数,如数据库连接信息、生成代码的输出路径等。

```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_1_0.dtd">

<generatorConfiguration>
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <!-- 数据库驱动属性 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mydatabase"
                        userId="root"
                        password="password"/>

        <!-- Generator属性 -->
        <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="t_user" domainObjectName="User"/>
        <table tableName="t_role" domainObjectName="Role"/>
    </context>
</generatorConfiguration>
``

#### 运行代码生成器

在项目的`pom.xml`中配置Maven插件,用于执行代码生成器。

```xml
<build>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.7</version>
            <configuration>
                <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
                <overwrite>true</overwrite>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>tk.mybatis</groupId>
                    <artifactId>mapper</artifactId>
                    <version>3.4.0</version>
                </dependency>
                <dependency>
                    <groupId>tk.mybatis</groupId>
                    <artifactId>mapper-generator</artifactId>
                    <version>1.3.3</version>
                </dependency>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>8.0.15</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>
``

运行`mvn mybatis-generator:generate`命令,即可生成所需的代码。

## 使用Mybatis代码生成器生成代码

使用Mybatis代码生成器生成代码的基本步骤如下:

1. **创建配置文件**。在`src/main/resources`目录下创建`generatorConfig.xml`文件,并配置数据库连接信息、输出路径和数据库表信息。
2. **配置Maven插件**。在`pom.xml`文件中添加Mybatis代码生成器的Maven插件配置。
3. **运行代码生成器**。执行`mvn mybatis-generator:generate`命令,生成所需的代码文件。

生成的代码文件包括:

- **接口文件**:如`UserMapper.java`,定义了数据库操作的接口。
- **XML文件**:如`UserMapper.xml`,包含SQL语句和映射配置。
- **实体类**:如`User.java`,表示数据库表中的记录。

### 示例代码

假设数据库中有一个`users`表,表结构如下:

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

生成的代码示例如下:

UserMapper.java

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="name" jdbcType="VARCHAR" property="name" />
        <result column="email" jdbcType="VARCHAR" property="email" />
        <result column="age" jdbcType="INTEGER" property="age" />
    </resultMap>

    <sql id="Base_Column_List">
        id, name, email, age
    </sql>

    <select id="selectAll" resultMap="BaseResultMap">
        SELECT
        <if test="columnList != null">
            ${columnList}
        </if>
        <if test="columnList == null">
            <include refid="Base_Column_List" />
        </if>
        FROM users
    </select>
</mapper>

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

## 配置Mybatis代码生成器

配置Mybatis代码生成器主要通过修改`generatorConfig.xml`文件中的相关配置项。常见的配置项包括:

### 数据库连接信息

配置数据库的连接驱动、URL、用户名和密码。

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

输出路径

配置生成代码的输出路径,包括Java模型类、SQL映射文件和Mapper接口。

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

数据库表映射

配置需要生成代码的数据库表名和对应的Java对象名称。

<table tableName="t_user" domainObjectName="User"/>
<table tableName="t_role" domainObjectName="Role"/>

其他配置选项

还可以配置注释、字段映射等高级选项。

代码生成器的常见问题及解决方法

问题1:生成的代码不更新

如果生成的代码没有更新,可能是由于以下原因:

  • 配置文件中overwrite属性设置为false:确保配置文件中<configuration>标签下的overwrite属性设置为true
  • 缓存问题:清理Maven的缓存,重新构建项目。执行mvn clean install命令。

问题2:生成的实体类缺少注解

有些情况下,生成的实体类可能缺少特定的注解,如@Table@Column等。可以手动添加这些注解,或修改生成器配置文件,添加注解生成。

问题3:生成的Mapper接口缺少方法

如果生成的Mapper接口中缺少某些方法,可以通过修改配置文件中的<table>标签,添加<generatedKey>等子标签,指定键生成方式。

问题4:生成的XML文件中的SQL语句不正确

如果生成的XML文件中的SQL语句不正确,可以检查数据库表的字段名是否正确,或手动修改生成的XML文件。

问题5:生成的代码路径错误

如果生成的代码路径错误,可以检查配置文件中<javaModelGenerator><sqlMapGenerator><javaClientGenerator>标签中的targetPackagetargetProject属性是否设置正确。

Mybatis代码生成器的使用技巧

自定义生成器

可以通过继承MybatisGenerator类,自定义生成器类,实现更复杂的功能。例如,处理数据库方言、自定义生成器逻辑等。

import tk.mybatis.mapper.generator.MapperGenerator;

public class CustomMybatisGenerator extends MapperGenerator {
    public CustomMybatisGenerator(Configuration configuration) {
        super(configuration);
    }

    // 自定义生成逻辑
    @Override
    public void generateModels() {
        super.generateModels();
        // 自定义处理逻辑
    }
}

静态代码生成

静态代码生成是指在项目构建时生成代码,而不用每次启动项目时生成。通过Maven插件,可以在项目构建时生成代码。

<build>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.7</version>
            <configuration>
                <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
                <overwrite>true</overwrite>
            </configuration>
            <executions>
                <execution>
                    <id>Generate Mybatis Mapper XML</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>tk.mybatis</groupId>
                    <artifactId>mapper</artifactId>
                    <version>3.4.0</version>
                </dependency>
                <dependency>
                    <groupId>tk.mybatis</groupId>
                    <artifactId>mapper-generator</artifactId>
                    <version>1.3.3</version>
                </dependency>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>8.0.15</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

动态代码生成

动态代码生成是指在运行时生成代码,这种方式适用于需要动态生成代码的场景。可以通过反射或字节码生成库实现。

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 DynamicCodeGenerator {
    public void generateCode() throws Exception {
        InputStream is = getClass().getResourceAsStream("/generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(new ArrayList<String>());
        Configuration config = cp.parseConfiguration(is);
        DefaultShellCallback callback = new DefaultShellCallback(true);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, null);
        myBatisGenerator.generate(null);
    }
}

代码生成器的灵活性

可以通过配置文件灵活地控制生成的代码,例如,生成特定的字段、方法等。还可以通过自定义插件,扩展生成器的功能。

代码生成器的性能优化

生成器生成代码的过程可能比较耗时,可以通过优化数据库查询、并行生成代码等方式提高性能。

实践案例:通过Mybatis代码生成器快速搭建项目

本节将通过一个实际案例,展示如何使用Mybatis代码生成器快速搭建项目。

准备工作

假设有一个数据库mydatabase,包含以下两个表:

  • users:用户表
  • roles:角色表

表结构如下:

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

CREATE TABLE roles (
  id INT PRIMARY KEY,
  name VARCHAR(255)
);

创建项目

创建一个新的Maven项目,添加必要的依赖,包括Mybatis、Mybatis代码生成器等。

配置generatorConfig.xml

src/main/resources目录下创建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-config_1_0.dtd">

<generatorConfiguration>
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <!-- 数据库驱动属性 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mydatabase"
                        userId="root"
                        password="password"/>

        <!-- Generator属性 -->
        <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"/>
        <table tableName="roles" domainObjectName="Role"/>
    </context>
</generatorConfiguration>

配置Maven插件

pom.xml文件中添加Mybatis代码生成器的Maven插件配置。

<build>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.7</version>
            <configuration>
                <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
                <overwrite>true</overwrite>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>tk.mybatis</groupId>
                    <artifactId>mapper</artifactId>
                    <version>3.4.0</version>
                </dependency>
                <dependency>
                    <groupId>tk.mybatis</groupId>
                    <artifactId>mapper-generator</artifactId>
                    <version>1.3.3</version>
                </dependency>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>8.0.15</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

运行代码生成器

执行mvn mybatis-generator:generate命令,生成所需的代码文件。

编写业务逻辑

根据生成的代码,编写业务逻辑。例如,创建UserService类,实现用户相关的业务逻辑。

package com.example.service;

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

import java.util.List;

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

    public List<User> getAllUsers() {
        return userMapper.selectAll();
    }

    public User getUserById(Integer id) {
        return userMapper.selectByPrimaryKey(id);
    }

    public void addUser(User user) {
        userMapper.insertSelective(user);
    }

    public void updateUser(User user) {
        userMapper.updateByPrimaryKeySelective(user);
    }

    public void deleteUser(Integer id) {
        userMapper.deleteByPrimaryKey(id);
    }
}

编写测试代码

编写测试代码,测试业务逻辑是否正确。

package com.example.test;

import com.example.mapper.UserMapper;
import com.example.model.User;
import com.example.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
public class UserServiceTest {
    @Autowired
    private UserService userService;

    @Test
    public void testGetAllUsers() {
        List<User> users = userService.getAllUsers();
        System.out.println(users);
    }

    @Test
    public void testAddUser() {
        User user = new User();
        user.setName("Tom");
        user.setEmail("tom@example.com");
        user.setAge(25);
        userService.addUser(user);

        User addedUser = userService.getUserById(user.getId());
        System.out.println(addedUser);
    }

    @Test
    public void testUpdateUser() {
        User user = userService.getUserById(1);
        user.setName("Jerry");
        userService.updateUser(user);

        User updatedUser = userService.getUserById(1);
        System.out.println(updatedUser);
    }

    @Test
    public void testDeleteUser() {
        userService.deleteUser(1);
    }
}
点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消