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代码生成器之前,你需要先配置好开发环境。以下是安装步骤:
- 确保你的电脑上已经安装了Java开发环境。
- 安装Maven,这是一个强大的项目管理工具,用于构建和管理依赖。
- 下载并安装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>
- 在项目中创建
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
包含了多个标签,每个标签都有其特定的功能:
<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>
<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>
<javaTypeResolver>
标签定义了Java类型解析器,用于确定数据库字段与Java类型的映射关系。
<javaTypeResolver forceBigDecimals="false"/>
<javaModelGenerator>
标签定义了生成Java模型类的配置信息,包括生成的类的包名和存放路径。
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"/>
<sqlMapGenerator>
标签定义了生成SQL映射文件的配置信息,包括生成的SQL文件的包名和存放路径。
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources"/>
<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操作代码。以下是生成基本CRUD操作代码的示例:
假设我们有一个名为user
的数据库表,包含以下字段:id
(主键),name
,age
,email
。
在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类名,enableCountByExample
、enableUpdateByExample
、enableDeleteByExample
、enableSelectByExample
属性定义了是否生成示例查询和更新的代码片段。
在运行代码生成器之后,会生成以下文件:
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代码生成器时,可能会遇到配置错误,导致代码生成失败。以下是一些常见的配置错误排查方法:
-
检查数据库连接信息是否正确
确保
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>
-
检查数据库表名是否正确
确保
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>
-
检查Maven依赖是否正确
确保Maven项目的
pom.xml
文件中已经添加了Mybatis代码生成器的依赖。<dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.7</version> </dependency>
-
检查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>
-
检查模板文件是否正确
如果使用了自定义的模板文件,确保模板文件的路径和文件名正确,并且模板文件中没有语法错误。
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"> <property name="modelTemplate" value="ModelTemplate.ftl"/> </javaModelGenerator>
在生成代码时,可能会遇到一些问题,以下是一些常见问题及其解决方法:
-
生成的代码不完整或不正确
如果生成的代码不完整或不正确,检查
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>
-
生成的代码格式不正确
如果生成的代码格式不正确,检查自定义模板文件中的语法是否正确。模板文件使用Freemarker模板引擎,确保模板文件中的语法符合Freemarker规则。
<#list columnList as column> private ${column.jdbcType} ${column.columnName}; </#list>
-
生成的代码无法编译
如果生成的代码无法编译,检查生成的代码文件路径是否正确,确保生成的代码文件路径与项目目录结构一致。此外,确保Java模型类和接口文件中的包名和导入语句正确。
package com.example.model; import org.apache.ibatis.annotations.Mapper;
-
生成的代码无法运行
如果生成的代码无法运行,检查生成的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>
-
生成的代码无法与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); }
在实际项目开发中,通常需要频繁地执行CRUD操作。例如,一个简单的用户管理系统需要实现用户信息的增删改查功能。在这个案例中,我们将使用Mybatis代码生成器来生成这些基础的CRUD操作代码,并进行相应的配置和调整。
定义数据库表结构
假设我们有一个名为user
的数据库表,包含以下字段:
字段名 | 类型 | 描述 |
---|---|---|
id | int | 用户ID,主键 |
name | varchar | 用户名 |
age | int | 年龄 |
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类。这种方式大大提高了代码生成的灵活性,满足了项目开发中的各种需求。
共同学习,写下你的评论
评论加载中...
作者其他优质文章