Mybatis代码生成器是一款强大的工具,能够自动生成Mybatis映射文件和Java模型类,从而提高开发效率并减少错误。本文将详细介绍Mybatis代码生成器的安装与配置、基本使用方法、自定义模板以及常见问题解决方法,并通过实战案例展示如何将生成的代码应用到实际项目中。Mybatis代码生成器资料将帮助开发者更高效地进行Mybatis开发。
Mybatis是一款优秀的持久层框架,它通过简单的 XML 或注解进行配置和原始映射,将接口和 Java 的 POJO 与数据库表和记录映射起来。它支持自定义 SQL 语句,存储过程以及高级映射。Mybatis 的灵活性主要体现在 SQL 语句执行的控制和结果映射上,使得它适合于各种场合。
Mybatis的核心特性包括:
Mybatis与 Hibernate相比,更注重 SQL 语句的灵活性和控制性,而 Hibernate更注重对象关系的映射。Mybatis是一个半自动化 ORM 框架,它需要开发者手动编写 SQL 语句,但在一定程度上简化了对象与数据库之间的映射过程。
Mybatis代码生成器为开发者提供了自动生成Mybatis映射文件(XML)和Java模型类的能力,从而减少了手动编写这些文件的繁琐工作,同时保证了生成代码的一致性与格式的规范性。这些生成的代码通常是与数据库表结构对应的,可以快速构建 CRUD(Create, Read, Update, Delete)操作,大大提高了开发效率。
代码生成器的优势包括:
在开始使用Mybatis代码生成器之前,你需要先配置好开发环境。以下是安装步骤:
以下是在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代码生成器允许开发者自定义模板文件来生成代码。自定义模板可以用来生成更符合项目需求的代码。
默认情况下,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映射文件模板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接口模板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操作代码,并将其整合到项目中。这种方式大大提高了开发效率,减少了手动编写代码的工作量。
在实际项目中,我们经常需要编写复杂的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语句,可以通过配置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类,可以通过配置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类模板,可以通过创建一个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类。这种方式大大提高了代码生成的灵活性,满足了项目开发中的各种需求。