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

Mybatis代码生成器资料:新手入门教程

标签:
Java SSM 数据库
概述

Mybatis代码生成器是一款强大的工具,能够自动生成Mybatis映射文件和Java模型类,从而提高开发效率并减少错误。本文将详细介绍Mybatis代码生成器的安装与配置、基本使用方法、自定义模板以及常见问题解决方法,并通过实战案例展示如何将生成的代码应用到实际项目中。Mybatis代码生成器资料将帮助开发者更高效地进行Mybatis开发。

Mybatis代码生成器简介
Mybatis简介

Mybatis是一款优秀的持久层框架,它通过简单的 XML 或注解进行配置和原始映射,将接口和 Java 的 POJO 与数据库表和记录映射起来。它支持自定义 SQL 语句,存储过程以及高级映射。Mybatis 的灵活性主要体现在 SQL 语句执行的控制和结果映射上,使得它适合于各种场合。

Mybatis的核心特性包括:

  • 动态 SQL
  • 一级和二级缓存
  • 数据库连接池
  • 事务管理
  • 查询语句分页

Mybatis与 Hibernate相比,更注重 SQL 语句的灵活性和控制性,而 Hibernate更注重对象关系的映射。Mybatis是一个半自动化 ORM 框架,它需要开发者手动编写 SQL 语句,但在一定程度上简化了对象与数据库之间的映射过程。

代码生成器的作用和优势

Mybatis代码生成器为开发者提供了自动生成Mybatis映射文件(XML)和Java模型类的能力,从而减少了手动编写这些文件的繁琐工作,同时保证了生成代码的一致性与格式的规范性。这些生成的代码通常是与数据库表结构对应的,可以快速构建 CRUD(Create, Read, Update, Delete)操作,大大提高了开发效率。

代码生成器的优势包括:

  • 提高开发效率:自动完成CRUD操作的代码生成,节省了开发人员编写基础代码的时间。
  • 减少错误:手动编写代码时,容易出现拼写错误或逻辑错误,而代码生成器可以减少这种错误。
  • 保持一致性:生成的代码格式和编码风格保持一致,有助于团队协作。
  • 扩展性:可以根据项目需要自定义模板,灵活生成代码。
Mybatis代码生成器的安装与配置
快速安装指南

在开始使用Mybatis代码生成器之前,你需要先配置好开发环境。以下是安装步骤:

  1. 确保你的电脑上已经安装了Java开发环境。
  2. 安装Maven,这是一个强大的项目管理工具,用于构建和管理依赖。
  3. 下载并安装Mybatis代码生成器的Maven依赖。

以下是在Maven项目中添加Mybatis代码生成器依赖的代码示例:

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.23</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-core</artifactId>
        <version>1.3.7</version>
    </dependency>
</dependencies>
  1. 在项目中创建generatorConfig.xml配置文件,并填写数据库相关配置。配置文件示例如下:
<generatorConfiguration>
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <jdbcConnection driverType="MySQL">
            <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/test"/>
            <property name="username" value="root"/>
            <property name="password" value="password"/>
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <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"/>
    </context>
</generatorConfiguration>
基本配置步骤详解

Mybatis代码生成器的配置文件generatorConfig.xml包含了多个标签,每个标签都有其特定的功能:

  1. <context>标签定义了代码生成器的运行环境,包括数据库连接信息、生成的Java类的包名、生成的SQL映射文件的包名等。
<context id="DB2Tables" targetRuntime="MyBatis3">
    <jdbcConnection driverType="MySQL">
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/test"/>
        <property name="username" value="root"/>
        <property name="password" value="password"/>
    </jdbcConnection>
    <javaTypeResolver forceBigDecimals="false"/>
    <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"/>
</context>
  1. <jdbcConnection>标签定义了数据库连接信息,包括数据库驱动类名、连接字符串、用户名和密码。
<jdbcConnection driverType="MySQL">
    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/test"/>
    <property name="username" value="root"/>
    <property name="password" value="password"/>
</jdbcConnection>
  1. <javaTypeResolver>标签定义了Java类型解析器,用于确定数据库字段与Java类型的映射关系。
<javaTypeResolver forceBigDecimals="false"/>
  1. <javaModelGenerator>标签定义了生成Java模型类的配置信息,包括生成的类的包名和存放路径。
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"/>
  1. <sqlMapGenerator>标签定义了生成SQL映射文件的配置信息,包括生成的SQL文件的包名和存放路径。
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources"/>
  1. <javaClientGenerator>标签定义了生成Java接口的配置信息,包括生成的接口的包名和存放路径。
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"/>

完成配置后,可以通过在Maven项目的pom.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>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>8.0.23</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

然后执行Maven命令mvn mybatis-generator:generate来生成代码。

Mybatis代码生成器的基本使用
生成常用CRUD操作代码

Mybatis代码生成器可以生成基本的CRUD操作代码。以下是生成基本CRUD操作代码的示例:

假设我们有一个名为user的数据库表,包含以下字段:id(主键),nameageemail

generatorConfig.xml配置文件中,可以通过如下配置生成CRUD代码:

<generatorConfiguration>
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <jdbcConnection driverType="MySQL">
            <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/test"/>
            <property name="username" value="root"/>
            <property name="password" value="password"/>
        </jdbcConnection>
        <javaTypeResolver forceBigDecimals="false"/>
        <table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
            <generatedKey column="id" sqlType="INTEGER" identity="true"/>
        </table>
        <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"/>
    </context>
</generatorConfiguration>

<table>标签定义了需要生成代码的数据库表的相关信息。domainObjectName属性定义了生成的Java类名,enableCountByExampleenableUpdateByExampleenableDeleteByExampleenableSelectByExample属性定义了是否生成示例查询和更新的代码片段。

在运行代码生成器之后,会生成以下文件:

  • User.java:Java模型类
  • UserMapper.xml:SQL映射文件
  • UserMapper.java:Java接口

下面是生成的Java模型类User.java的示例代码:

package com.example.model;

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

    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 Integer getAge() {
        return age;
    }

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

    public String getEmail() {
        return email;
    }

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

以下是生成的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="name" jdbcType="VARCHAR" property="name" />
        <result column="age" jdbcType="INTEGER" property="age" />
        <result column="email" jdbcType="VARCHAR" property="email" />
    </resultMap>
    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
        SELECT
            id,
            name,
            age,
            email
        FROM
            user
        WHERE
            id = #{id,jdbcType=INTEGER}
    </select>
    <insert id="insert" parameterType="com.example.model.User">
        INSERT INTO
            user (name, age, email)
        VALUES
            (#{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}, #{email,jdbcType=VARCHAR})
    </insert>
    <update id="updateByPrimaryKeySelective" parameterType="com.example.model.User">
        UPDATE
            user
        SET
            name = #{name,jdbcType=VARCHAR},
            age = #{age,jdbcType=INTEGER},
            email = #{email,jdbcType=VARCHAR}
        WHERE
            id = #{id,jdbcType=INTEGER}
    </update>
    <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
        DELETE FROM
            user
        WHERE
            id = #{id,jdbcType=INTEGER}
    </delete>
</mapper>

以下是生成的Java接口UserMapper.java的示例代码:

package com.example.mapper;

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

public interface UserMapper {
    @Select("SELECT id, name, age, email FROM user WHERE id = #{id}")
    User selectByPrimaryKey(@Param("id") Integer id);

    int insert(User record);

    int updateByPrimaryKeySelective(@Param("record") User record);

    int deleteByPrimaryKey(@Param("id") Integer id);
}
自定义模板与生成规则

Mybatis代码生成器允许开发者自定义模板文件来生成代码。自定义模板可以用来生成更符合项目需求的代码。

自定义Java模型类模板

默认情况下,Mybatis代码生成器会根据数据库表结构生成Java模型类。如果需要自定义Java模型类的生成规则,可以创建一个新的模板文件ModelTemplate.ftl,并将其放在src/main/resources/templates目录下。模板文件使用Freemarker模板引擎,可以参考Freemarker语法来自定义模板。

以下是一个自定义模型类模板的示例:

package ${package};

import java.io.Serializable;

public class ${className} implements Serializable {
    private static final long serialVersionUID = 1L;

    private ${idType} id;
    <#list columnList as column>
    private ${column.jdbcType} ${column.columnName};
    </#list>

    public ${className}() {
    }

    public ${idType} getId() {
        return id;
    }

    public void setId(${idType} id) {
        this.id = id;
    }
    <#list columnList as column>
    public ${column.jdbcType} get${column.columnNameCapitalized}() {
        return ${column.columnName};
    }

    public void set${column.columnNameCapitalized}(${column.jdbcType} ${column.columnName}) {
        this.${column.columnName} = ${column.columnName};
    }
    </#list>
}

自定义SQL映射文件模板

同样,也可以创建一个自定义的SQL映射文件模板SqlMapTemplate.ftl,并将其放在src/main/resources/templates目录下。模板文件使用Freemarker模板引擎,可以参考Freemarker语法来自定义模板。

以下是一个自定义SQL映射文件模板的示例:

<?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="${namespace}">
    <resultMap id="BaseResultMap" type="${className}">
        <#list columnList as column>
        <result column="${column.columnName}" jdbcType="${column.jdbcType}" property="${column.columnName}" />
        </#list>
    </resultMap>
    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.${idType}">
        SELECT
            ${columnsSelect}
        FROM
            ${tableName}
        WHERE
            ${idColumnName} = #{id,jdbcType=${idType}}
    </select>
    <insert id="insert" parameterType="${className}">
        INSERT INTO
            ${tableName} (${columnsInsert})
        VALUES
            (${columnValuesInsert})
    </insert>
    <update id="updateByPrimaryKeySelective" parameterType="${className}">
        UPDATE
            ${tableName}
        SET
            ${columnsUpdate}
        WHERE
            ${idColumnName} = #{id,jdbcType=${idType}}
    </update>
    <delete id="deleteByPrimaryKey" parameterType="java.lang.${idType}">
        DELETE FROM
            ${tableName}
        WHERE
            ${idColumnName} = #{id,jdbcType=${idType}}
    </delete>
</mapper>

自定义Java接口模板

同样,也可以创建一个自定义的Java接口模板MapperTemplate.ftl,并将其放在src/main/resources/templates目录下。模板文件使用Freemarker模板引擎,可以参考Freemarker语法来自定义模板。

以下是一个自定义Java接口模板的示例:

package ${package};

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

@Mapper
public interface ${className}Mapper {
    ${className} selectByPrimaryKey(@Param("id") ${idType} id);
    int insert(${className} record);
    int updateByPrimaryKeySelective(@Param("record") ${className} record);
    int deleteByPrimaryKey(@Param("id") ${idType} id);
}

generatorConfig.xml配置文件中,可以通过<template>标签启用自定义模板文件:

<generatorConfiguration>
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <jdbcConnection driverType="MySQL">
            <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/test"/>
            <property name="username" value="root"/>
            <property name="password" value="password"/>
        </jdbcConnection>
        <javaTypeResolver forceBigDecimals="false"/>
        <table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
            <generatedKey column="id" sqlType="INTEGER" identity="true"/>
        </table>
        <javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java">
            <property name="enableConstructor" value="true"/>
            <property name="modelTemplate" value="ModelTemplate.ftl"/>
        </javaModelGenerator>
        <sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources">
            <property name="enableInsert" value="true"/>
            <property name="sqlTemplate" value="SqlMapTemplate.ftl"/>
        </sqlMapGenerator>
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java">
            <property name="clientTemplate" value="MapperTemplate.ftl"/>
        </javaClientGenerator>
    </context>
</generatorConfiguration>

以上配置代码中,modelTemplate属性指定了生成Java模型类的自定义模板文件名,sqlTemplate属性指定了生成SQL映射文件的自定义模板文件名,clientTemplate属性指定了生成Java接口的自定义模板文件名。

常见问题及解决方法
配置错误排查

在使用Mybatis代码生成器时,可能会遇到配置错误,导致代码生成失败。以下是一些常见的配置错误排查方法:

  1. 检查数据库连接信息是否正确

    确保generatorConfig.xml文件中的数据库连接信息(驱动类名、连接字符串、用户名和密码)都填写正确。错误的数据库连接信息会导致代码生成器无法连接到数据库。

    <jdbcConnection driverType="MySQL">
       <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
       <property name="url" value="jdbc:mysql://localhost:3306/test"/>
       <property name="username" value="root"/>
       <property name="password" value="password"/>
    </jdbcConnection>
  2. 检查数据库表名是否正确

    确保generatorConfig.xml文件中的<table>标签中的tableName属性值与实际数据库中的表名一致。错误的表名会导致代码生成器无法找到对应的表。

    <table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
       <generatedKey column="id" sqlType="INTEGER" identity="true"/>
    </table>
  3. 检查Maven依赖是否正确

    确保Maven项目的pom.xml文件中已经添加了Mybatis代码生成器的依赖。

    <dependency>
       <groupId>org.mybatis.generator</groupId>
       <artifactId>mybatis-generator-core</artifactId>
       <version>1.3.7</version>
    </dependency>
  4. 检查Maven插件配置是否正确

    确保Maven项目的pom.xml文件中已经添加了Mybatis代码生成器的Maven插件配置。

    <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>mysql</groupId>
               <artifactId>mysql-connector-java</artifactId>
               <version>8.0.23</version>
           </dependency>
       </dependencies>
    </plugin>
  5. 检查模板文件是否正确

    如果使用了自定义的模板文件,确保模板文件的路径和文件名正确,并且模板文件中没有语法错误。

    <javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java">
       <property name="modelTemplate" value="ModelTemplate.ftl"/>
    </javaModelGenerator>
生成代码问题解析

在生成代码时,可能会遇到一些问题,以下是一些常见问题及其解决方法:

  1. 生成的代码不完整或不正确

    如果生成的代码不完整或不正确,检查generatorConfig.xml文件中的配置是否正确,特别是<table>标签中的属性值。确保配置文件中的表名、字段名等信息与实际数据库表结构一致。

    <table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
       <columnOverride column="id" jdbcType="INTEGER" javaType="java.lang.Integer" javaName="id"/>
    </table>
  2. 生成的代码格式不正确

    如果生成的代码格式不正确,检查自定义模板文件中的语法是否正确。模板文件使用Freemarker模板引擎,确保模板文件中的语法符合Freemarker规则。

    <#list columnList as column>
    private ${column.jdbcType} ${column.columnName};
    </#list>
  3. 生成的代码无法编译

    如果生成的代码无法编译,检查生成的代码文件路径是否正确,确保生成的代码文件路径与项目目录结构一致。此外,确保Java模型类和接口文件中的包名和导入语句正确。

    package com.example.model;
    
    import org.apache.ibatis.annotations.Mapper;
  4. 生成的代码无法运行

    如果生成的代码无法运行,检查生成的SQL映射文件中的SQL语句是否正确。确保SQL语句中的表名和字段名与实际数据库表结构一致,并且SQL语句语法正确。

    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
       SELECT
           id,
           name,
           age,
           email
       FROM
           user
       WHERE
           id = #{id,jdbcType=INTEGER}
    </select>
  5. 生成的代码无法与Mybatis集成

    如果生成的代码无法与Mybatis集成,检查生成的Java接口文件中的注解是否正确。确保使用了Mybatis支持的注解,例如@Select@Insert@Update@Delete

    package com.example.mapper;
    
    import com.example.model.User;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Param;
    import org.apache.ibatis.annotations.Select;
    
    @Mapper
    public interface UserMapper {
       @Select("SELECT id, name, age, email FROM user WHERE id = #{id}")
       User selectByPrimaryKey(@Param("id") Integer id);
    
       int insert(User record);
    
       int updateByPrimaryKeySelective(@Param("record") User record);
    
       int deleteByPrimaryKey(@Param("id") Integer id);
    }
实战案例:使用Mybatis代码生成器完成项目开发
实战背景介绍

在实际项目开发中,通常需要频繁地执行CRUD操作。例如,一个简单的用户管理系统需要实现用户信息的增删改查功能。在这个案例中,我们将使用Mybatis代码生成器来生成这些基础的CRUD操作代码,并进行相应的配置和调整。

定义数据库表结构

假设我们有一个名为user的数据库表,包含以下字段:

字段名 类型 描述
id int 用户ID,主键
name varchar 用户名
age int 年龄
email varchar 邮箱地址

定义项目结构

假设我们的项目结构如下:

mybatis-generator-example/
├── src/main/java/
│   └── com/example/
│       └── mapper/
│           └── UserMapper.java
│       └── model/
│           └── User.java
├── src/main/resources/
│   └── mapper/
│       └── UserMapper.xml
└── src/main/resources/
    └── generatorConfig.xml
模板应用示例

为了更好地适应项目需求,我们将自定义Mybatis代码生成器的模板文件。以下是一个自定义Java模型类模板的示例:

package ${package};

import java.io.Serializable;

public class ${className} implements Serializable {
    private static final long serialVersionUID = 1L;

    private ${idType} id;
    <#list columnList as column>
    private ${column.jdbcType} ${column.columnName};
    </#list>

    public ${className}() {
    }

    public ${idType} getId() {
        return id;
    }

    public void setId(${idType} id) {
        this.id = id;
    }
    <#list columnList as column>
    public ${column.jdbcType} get${column.columnNameCapitalized}() {
        return ${column.columnName};
    }

    public void set${column.columnNameCapitalized}(${column.jdbcType} ${column.columnName}) {
        this.${column.columnName} = ${column.columnName};
    }
    </#list>
}

自定义SQL映射文件模板:

<?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="${namespace}">
    <resultMap id="BaseResultMap" type="${className}">
        <#list columnList as column>
        <result column="${column.columnName}" jdbcType="${column.jdbcType}" property="${column.columnName}" />
        </#list>
    </resultMap>
    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.${idType}">
        SELECT
            ${columnsSelect}
        FROM
            ${tableName}
        WHERE
            ${idColumnName} = #{id,jdbcType=${idType}}
    </select>
    <insert id="insert" parameterType="${className}">
        INSERT INTO
            ${tableName} (${columnsInsert})
        VALUES
            (${columnValuesInsert})
    </insert>
    <update id="updateByPrimaryKeySelective" parameterType="${className}">
        UPDATE
            ${tableName}
        SET
            ${columnsUpdate}
        WHERE
            ${idColumnName} = #{id,jdbcType=${idType}}
    </update>
    <delete id="deleteByPrimaryKey" parameterType="java.lang.${idType}">
        DELETE FROM
            ${tableName}
        WHERE
            ${idColumnName} = #{id,jdbcType=${idType}}
    </delete>
</mapper>

自定义Java接口模板:

package ${package};

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

@Mapper
public interface ${className}Mapper {
    ${className} selectByPrimaryKey(@Param("id") ${idType} id);
    int insert(${className} record);
    int updateByPrimaryKeySelective(@Param("record") ${className} record);
    int deleteByPrimaryKey(@Param("id") ${idType} id);
}

生成代码并整合到项目中

在完成模板文件后,需要在generatorConfig.xml中配置这些模板文件的路径:

<generatorConfiguration>
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <jdbcConnection driverType="MySQL">
            <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/test"/>
            <property name="username" value="root"/>
            <property name="password" value="password"/>
        </jdbcConnection>
        <javaTypeResolver forceBigDecimals="false"/>
        <table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
            <generatedKey column="id" sqlType="INTEGER" identity="true"/>
        </table>
        <javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java">
            <property name="modelTemplate" value="ModelTemplate.ftl"/>
        </javaModelGenerator>
        <sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources">
            <property name="sqlTemplate" value="SqlMapTemplate.ftl"/>
        </sqlMapGenerator>
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java">
            <property name="clientTemplate" value="MapperTemplate.ftl"/>
        </javaClientGenerator>
    </context>
</generatorConfiguration>

运行生成器并生成代码:

mvn mybatis-generator:generate

生成的代码将放置在指定的目录中。接下来,将这些生成的代码整合到项目中,完成项目的开发。

运行示例

假设我们要实现一个简单的用户查询功能,可以使用生成的UserMapper接口和相应的SQL映射文件。在服务层代码中调用这些生成的接口:

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;

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

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

在控制器层代码中调用服务层的方法:

package com.example.controller;

import com.example.model.User;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/user/{id}")
    public User getUserById(@PathVariable Integer id) {
        return userService.getUserById(id);
    }
}

通过以上步骤,我们成功地使用Mybatis代码生成器生成了用户信息的CRUD操作代码,并将其整合到项目中。这种方式大大提高了开发效率,减少了手动编写代码的工作量。

Mybatis代码生成器的进阶使用技巧
生成复杂查询代码

在实际项目中,我们经常需要编写复杂的SQL查询语句,例如连接查询、分页查询、聚合查询等。使用Mybatis代码生成器,我们可以生成这些复杂查询的代码。

生成连接查询代码

假设我们有一个order表和一个product表,每个订单关联多个产品。我们可以通过配置generatorConfig.xml文件来生成连接查询的代码。

<table tableName="order" domainObjectName="Order" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
    <joinTable tableName="product" joinColumn="productId" joinTableName="order_product" joinColumn="orderId" joinColumnProperty="productId" joinTableProperty="orderProduct">
        <columnOverride column="name" jdbcType="VARCHAR" javaType="String" javaName="name"/>
    </joinTable>
</table>

在上述配置中,joinTable标签定义了两个表之间的连接关系。通过这种方式,可以生成包含连接查询的代码。

生成分页查询代码

假设我们需要实现分页查询功能,可以通过配置generatorConfig.xml文件来生成分页查询的代码。

<table tableName="order" domainObjectName="Order" enableCountByExample="true" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false">
    <exampleColumn column="id" isKeyColumn="true"/>
    <generatedKey column="id" sqlType="INTEGER" identity="true"/>
</table>

在上述配置中,enableCountByExample属性设置为true,启用分页查询的支持。exampleColumn标签定义了分页查询的主键列。

生成聚合查询代码

假设我们需要实现聚合查询功能,可以通过配置generatorConfig.xml文件来生成聚合查询的代码。

<table tableName="order" domainObjectName="Order" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
    <columnOverride column="total_amount" jdbcType="DECIMAL" javaType="java.math.BigDecimal" javaName="totalAmount"/>
    <generatedKey column="id" sqlType="INTEGER" identity="true"/>
</table>

在上述配置中,columnOverride标签定义了聚合查询所需的列。

生成联合查询代码

假设我们需要实现联合查询功能,可以通过配置generatorConfig.xml文件来生成联合查询的代码。

<table tableName="order" domainObjectName="Order" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
    <generatedKey column="id" sqlType="INTEGER" identity="true"/>
</table>
<sql id="selectOrders">
    SELECT
        o.id as orderId,
        p.id as productId,
        p.name as productName,
        p.price as productPrice
    FROM
        order o
    JOIN
        product p ON o.productId = p.id
</sql>

在上述配置中,sql标签定义了联合查询的SQL语句。

扩展代码生成器功能

除了生成基本的CRUD操作代码外,Mybatis代码生成器还支持扩展功能,例如生成自定义的SQL语句、生成自定义的Java类等。

生成自定义的SQL语句

假设我们需要生成一个自定义的SQL语句,可以通过配置generatorConfig.xml文件来实现。

<table tableName="order" domainObjectName="Order" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
    <generatedKey column="id" sqlType="INTEGER" identity="true"/>
</table>
<sql id="selectOrdersByDate">
    SELECT
        o.id as orderId,
        o.order_date as orderDate,
        p.id as productId,
        p.name as productName,
        p.price as productPrice
    FROM
        order o
    JOIN
        product p ON o.productId = p.id
    WHERE
        o.order_date >= #{startDate} AND o.order_date <= #{endDate}
</sql>

在上述配置中,sql标签定义了一个自定义的SQL语句。

生成自定义的Java类

假设我们需要生成一个自定义的Java类,可以通过配置generatorConfig.xml文件来实现。

<table tableName="order" domainObjectName="Order" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
    <generatedKey column="id" sqlType="INTEGER" identity="true"/>
</table>
<javaTypeResolver forceBigDecimals="false"/>
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java">
    <property name="modelTemplate" value="ModelTemplate.ftl"/>
</javaModelGenerator>
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources">
    <property name="sqlTemplate" value="SqlMapTemplate.ftl"/>
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java">
    <property name="clientTemplate" value="MapperTemplate.ftl"/>
</javaClientGenerator>

在上述配置中,javaModelGenerator标签定义了一个自定义的Java类模板文件。

使用自定义的Java类模板

假设我们需要生成一个自定义的Java类模板,可以通过创建一个ModelTemplate.ftl文件来实现。

package ${package};

import java.io.Serializable;

public class ${className} implements Serializable {
    private static final long serialVersionUID = 1L;

    private ${idType} id;
    <#list columnList as column>
    private ${column.jdbcType} ${column.columnName};
    </#list>

    public ${className}() {
    }

    public ${idType} getId() {
        return id;
    }

    public void setId(${idType} id) {
        this.id = id;
    }
    <#list columnList as column>
    public ${column.jdbcType} get${column.columnNameCapitalized}() {
        return ${column.columnName};
    }

    public void set${column.columnNameCapitalized}(${column.jdbcType} ${column.columnName}) {
        this.${column.columnName} = ${column.columnName};
    }
    </#list>
}

在上述模板文件中,定义了自定义的Java类模板。

通过以上步骤,我们成功地扩展了Mybatis代码生成器的功能,生成了复杂的查询代码和自定义的Java类。这种方式大大提高了代码生成的灵活性,满足了项目开发中的各种需求。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消