Mybatis Generator是一个强大的自动化工具,能够根据数据库表结构生成Mybatis所需的实体类、Mapper接口和对应的XML映射文件。使用它可以显著提高开发效率,减少手动编写基础代码的工作量。本文将详细介绍Mybatis Generator的作用、优势、安装步骤、配置方法以及高级用法,提供全面的mybatis官方生成器资料。
Mybatis生成器简介 Mybatis生成器的作用和优势Mybatis Generator是一个强大的工具,它能够根据数据库表生成Mybatis的实体类、Mapper接口和对应的XML映射文件。使用Mybatis Generator可以极大地提高开发效率,尤其是在处理大量数据库表的时候。它的主要作用和优势如下:
- 自动化生成代码:Mybatis Generator可以自动识别数据库表结构并生成相应的Java实体类、Mapper接口、映射文件以及SQL语句。这直接减少了开发人员重复编写基础代码的工作量。
- 提高开发效率:通过自动生成代码,开发人员可以将更多精力放在业务逻辑的实现上,避免了手动编写大量模板代码。
- 保持代码一致性:自动生成的代码遵循一定的规范,有助于保持代码风格和结构的一致性。
- 易于维护:生成的代码结构清晰,易于理解和维护,便于团队协作。
Mybatis Generator适用于以下场景:
- 大规模项目:当项目中涉及大量数据库表时,手动编写Mybatis所需的各种文件会非常繁琐,此时使用Mybatis Generator可以节省大量的开发时间。
- 快速原型开发:在快速原型开发阶段,通过Mybatis Generator可以快速搭建起基础的数据库操作层,使开发人员能够快速验证业务逻辑。
- 代码重构或迁移:当你需要将旧系统迁移至新的数据库表结构或需要重构现有代码时,Mybatis Generator可以快速生成新的代码,减少重构工作量。
- 团队协作:团队成员可以借助Mybatis Generator快速搭建起开发环境,确保每个人拥有相同的基础代码模板,方便协作开发。
安装Mybatis Generator需要以下步骤:
- 添加Maven依赖:在你的项目
pom.xml
文件中添加Mybatis Generator的Maven依赖。 - 下载数据库驱动:下载并添加对应数据库的JDBC驱动到项目的
lib
目录。 - 配置生成器配置文件:创建
generatorConfig.xml
文件,并初始化配置。
Maven依赖
在pom.xml
文件中添加如下依赖:
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>
<!-- 添加数据库驱动依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
</dependencies>
下载数据库驱动
根据你使用的数据库下载相应的JDBC驱动,并将其放置到你的项目lib
目录中。例如,对于MySQL数据库,可以使用如下命令下载:
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.29.tar.gz
tar -zxvf mysql-connector-java-8.0.29.tar.gz
cp mysql-connector-java-8.0.29/mysql-connector-java-8.0.29.jar ${YOUR_PROJECT_PATH}/lib/
搭建开发环境
开发环境搭建包括创建配置文件和初始化配置文件。下面是一个简单的generatorConfig.xml
文件示例:
<generatorConfiguration>
<classPathEntry location="${YOUR_PROJECT_PATH}/lib/mysql-connector-java-8.0.29.jar" />
<context id="default" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<jdbcConnection driverType="MYSQL"
connectionURL="jdbc:mysql://localhost:3306/mydatabase"
userId="root"
password="password" />
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"/>
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources"/>
<javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"/>
<table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
</context>
</generatorConfiguration>
这段配置文件定义了数据库连接信息、生成代码的位置以及需要生成的表的信息。<jdbcConnection>
标签定义了数据库连接的类型、URL、用户名和密码。<javaModelGenerator>
标签定义了实体类的生成位置和包名。<sqlMapGenerator>
标签定义了映射文件的生成位置和包名。<javaClientGenerator>
标签定义了Mapper接口的生成位置和包名。<table>
标签定义了需要生成的表名和对应的类名。
generatorConfig.xml
配置文件是Mybatis Generator的核心配置文件。它定义了生成器生成代码的行为,如目标数据库、生成的Java文件位置等。
配置文件包含多个标签,以下是常用标签及其说明:
<generatorConfiguration>
id
: 用来唯一标识一个配置文件。targetRuntime
: 指定生成的代码将兼容的目标Mybatis版本。常见的值有MyBatis3
和MyBatis3Simple
。MyBatis3Simple
表示生成的代码将使用@Select
,@Insert
等注解,而不使用XML配置文件。
<classPathEntry>
location
: 指定数据库驱动的位置。
<jdbcConnection>
driverType
: 数据库类型。例如MYSQL
、POSTGRESQL
等。connectionURL
,userId
,password
: 数据库连接信息。
<javaModelGenerator>
targetPackage
: Java实体类生成的包名。targetProject
: Java实体类生成的项目路径。
<sqlMapGenerator>
targetPackage
: SQL映射文件生成的包名。targetProject
: SQL映射文件生成的项目路径。
<javaClientGenerator>
type
: Mapper接口的生成类型。例如ANNOTATEDMAPPER
表示生成带有注解的Mapper接口,XMLMAPPER
表示生成带有XML配置的Mapper接口。targetPackage
: Mapper接口生成的包名。targetProject
: Mapper接口生成的项目路径。
<table>
tableName
: 数据库表名。domainObjectName
: 对应的实体类名称。enableCountByExample
,enableUpdateByExample
,enableDeleteByExample
,enableSelectByExample
: 控制是否生成特定的示例查询。
<context>
id
: 用来唯一标识一个配置文件。targetRuntime
: 指定生成的代码将兼容的目标Mybatis版本。常见的值有MyBatis3
和MyBatis3Simple
。MyBatis3Simple
表示生成的代码将使用@Select
,@Insert
等注解,而不使用XML配置文件。
<jdbcConnection>
driverType
: 数据库类型。例如MYSQL
、POSTGRESQL
等。connectionURL
: 数据库连接URL。userId
: 数据库用户名。password
: 数据库密码。
<javaModelGenerator>
targetPackage
: Java实体类生成的包名。targetProject
: Java实体类生成的项目路径。
<sqlMapGenerator>
targetPackage
: SQL映射文件生成的包名。targetProject
: SQL映射文件生成的项目路径。
<javaClientGenerator>
type
: Mapper接口的生成类型。例如ANNOTATEDMAPPER
表示生成带有注解的Mapper接口,XMLMAPPER
表示生成带有XML配置的Mapper接口。targetPackage
: Mapper接口生成的包名。targetProject
: Mapper接口生成的项目路径。
<table>
tableName
: 数据库表名。domainObjectName
: 对应的实体类名称。enableCountByExample
,enableUpdateByExample
,enableDeleteByExample
,enableSelectByExample
: 控制是否生成特定的示例查询。useActualColumnNames
: 如果设置为true
,则生成的SQL语句中将使用实际的数据库列名,而不是字段名。
使用Mybatis Generator命令行工具来生成Mapper接口和对应的XML映射文件:
mvn mybatis-generator:generate
运行上述命令后,Mybatis Generator会根据配置文件生成Mapper接口和对应的XML映射文件。例如,生成的Mapper接口可能如下所示:
package com.example.mapper;
import com.example.model.User;
import java.util.List;
public interface UserMapper {
int insertUser(User record);
int insertSelective(User record);
User selectUserByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(User record);
int updateByPrimaryKey(User record);
}
生成的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="userResultMap" type="com.example.model.User">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="email" property="email" />
</resultMap>
<insert id="insertUser" parameterType="com.example.model.User">
INSERT INTO user (name, email)
VALUES (#{name}, #{email})
</insert>
<select id="selectUserByPrimaryKey" resultMap="userResultMap" parameterType="int">
SELECT * FROM user WHERE id = #{id}
</select>
<update id="updateByPrimaryKey" parameterType="com.example.model.User">
UPDATE user
SET name = #{name}, email = #{email}
WHERE id = #{id}
</update>
</mapper>
生成Entity类和DAO层代码
使用Mybatis Generator命令行工具来生成Entity类和DAO层代码:
mvn mybatis-generator:generate
运行上述命令后,Mybatis Generator会根据配置文件生成Entity类和DAO层代码。例如,生成的Entity类可能如下所示:
package com.example.model;
public class User {
private Integer id;
private String name;
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 String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
生成的Mapper接口可能如下所示:
package com.example.mapper;
import com.example.model.User;
import java.util.List;
public interface UserMapper {
int insertUser(User record);
int insertSelective(User record);
User selectUserByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(User record);
int updateByPrimaryKey(User record);
}
生成的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="userResultMap" type="com.example.model.User">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="email" property="email" />
</resultMap>
<insert id="insertUser" parameterType="com.example.model.User">
INSERT INTO user (name, email)
VALUES (#{name}, #{email})
</insert>
<select id="selectUserByPrimaryKey" resultMap="userResultMap" parameterType="int">
SELECT * FROM user WHERE id = #{id}
</select>
<update id="updateByPrimaryKey" parameterType="com.example.model.User">
UPDATE user
SET name = #{name}, email = #{email}
WHERE id = #{id}
</update>
</mapper>
Mybatis生成器的高级用法
自定义生成规则
Mybatis Generator允许你自定义生成规则以满足特定需求。例如,可以通过<columnOverride>
标签来覆盖默认生成的列名或类型。下面是一个示例:
<generatorConfiguration>
<classPathEntry location="${YOUR_PROJECT_PATH}/lib/mysql-connector-java-8.0.29.jar" />
<context id="default" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<jdbcConnection driverType="MYSQL"
connectionURL="jdbc:mysql://localhost:3306/mydatabase"
userId="root"
password="password" />
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"/>
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources"/>
<javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"/>
<table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
<columnOverride column="email" javaType="java.lang.String"/>
</table>
</context>
</generatorConfiguration>
在这个例子中,<columnOverride>
标签用于覆盖默认的email
列的Java类型。javaType
属性指定了列的Java类型。
Mybatis Generator支持通过插件扩展其功能。例如,你可以编写自定义插件来生成特定的Mapper方法。这可以让你在默认生成的代码基础上添加更多自定义的功能。
创建自定义插件
你可以创建一个实现org.mybatis.generator.plugins.PluginAdapter
接口的类,并重写其中的方法来实现自定义逻辑。例如,下面是一个简单的自定义插件示例:
package com.example.generator.plugin;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.TopLevelClass;
public class CustomPlugin extends PluginAdapter {
@Override
public boolean validate(List<String> warnings) {
return true;
}
@Override
public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
if (introspectedTable.getFullyQualifiedTableNameAtRuntime().equals("user")) {
topLevelClass.addMethod(generateCustomMethod());
}
return true;
}
private Method generateCustomMethod() {
Method method = new Method();
method.setVisibility(JavaVisibility.PUBLIC);
method.setName("customMethod");
method.setReturnType(FullyQualifiedJavaType.getIntInstance());
method.addParameter(new Parameter(FullyQualifiedJavaType.getIntInstance(), "id"));
method.addBodyLine("return id * 2;");
return method;
}
}
在配置文件中启用插件
为了使自定义插件生效,需要在配置文件中启用它:
<generatorConfiguration>
<classPathEntry location="${YOUR_PROJECT_PATH}/lib/mysql-connector-java-8.0.29.jar" />
<context id="default" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<jdbcConnection driverType="MYSQL"
connectionURL="jdbc:mysql://localhost:3306/mydatabase"
userId="root"
password="password" />
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"/>
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources"/>
<javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"/>
<plugin type="com.example.generator.plugin.CustomPlugin"/>
<table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
</context>
</generatorConfiguration>
在这个例子中,<plugin>
标签指定了自定义插件类的全限定名。这样,Mybatis Generator会调用自定义插件中的方法来生成特定的Mapper方法。
在使用Mybatis Generator的过程中,可能会遇到一些常见的错误。下面是一些常见错误及其解决方法:
错误:数据库连接失败
错误信息: Could not get connection to the database
原因: 数据库连接信息配置错误,如数据库URL、用户名、密码等。
解决方案:
- 检查
generatorConfig.xml
文件中的<jdbcConnection>
标签,确保数据库的连接URL、用户名和密码正确无误。 - 确保数据库服务已经启动,并且数据库URL、端口和用户名密码正确。
- 检查数据库驱动文件是否已经正确添加到项目中。
错误:表不存在
错误信息: Table XXX does not exist in database
原因: 配置文件中指定的表名与数据库中的表名不一致。
解决方案:
- 检查
generatorConfig.xml
文件中的<table>
标签,确保表名正确。 - 如果表名中包含特殊字符或大小写敏感,确保在配置文件中正确使用。
错误:生成的代码不完整或不正确
错误信息: 生成的Mapper接口或SQL映射文件内容不完整或不正确。
原因: 配置文件中的某些配置项设置不正确,导致生成的代码不符合预期。
解决方案:
- 检查
generatorConfig.xml
文件中的配置项,确保它们正确设置。 - 使用
mvn mybatis-generator:validate
命令来验证配置文件是否有语法错误。 - 重新运行
mvn mybatis-generator:generate
命令,确保生成器能够正确生成代码。
错误:生成的代码类型错误
错误信息: 生成的字段类型与数据库中的字段类型不一致。
原因: 数据库字段类型与Java类型自动映射关系有误。
解决方案:
- 检查数据库中的字段类型,并在
generatorConfig.xml
文件中通过<columnOverride>
标签来覆盖默认的类型映射。 - 重新运行生成器命令,确保自定义的类型映射生效。
在使用Mybatis Generator时,需要注意以下几个方面:
- 配置文件编写:确保配置文件中的配置项正确无误。特别是数据库连接信息、表名、生成代码的位置等。
- 数据库驱动:确保已经正确下载并配置了数据库驱动。如果没有正确配置,生成器将无法正确连接到数据库。
- 生成代码的一致性:自动生成的代码应遵循项目中的代码风格和规范。如果有特殊需求,可以通过插件来扩展生成器的功能。
- 版本兼容性:确保生成器的版本与项目中的Mybatis版本兼容。Mybatis Generator的
targetRuntime
属性指定了生成代码的目标版本。 - 代码维护:虽然生成器可以自动生成代码,但生成的代码仍然是项目的一部分,需要定期进行维护和更新。如果数据库结构发生变化,应及时更新配置文件并重新生成代码。
- 测试生成的代码:生成的Mapper接口和SQL映射文件需要进行测试,确保它们能够正确地与数据库进行交互。
- 代码整洁:生成的代码可能包含一些不必要的注释或空行,这可能会使代码看起来不够整洁。可以使用代码格式化工具来美化生成的代码。
- 文档更新:如果项目中有详细的技术文档,确保文档中包含使用Mybatis Generator的信息,并且文档与代码保持一致。
共同学习,写下你的评论
评论加载中...
作者其他优质文章