Mybatis官方生成器(MBG)是MyBatis提供的一个强大的工具,用于自动生成MyBatis的映射文件、Java Bean和DAO接口。通过减少冗余代码和提高开发效率,MBG广泛应用于新项目启动、代码重构和维护扩展等多种场景。
Mybatis官方生成器简介 Mybatis官方生成器的定义MyBatis Generator(MBG)是MyBatis提供的一个工具,用于自动生成MyBatis的映射文件(Mapper.xml
或Mapper.java
)、Java Bean(实体类)和DAO接口。MBG可以显著减少开发人员编写重复代码的工作量,提高开发效率。
MBG的工作原理是通过解析数据库表结构(包括表名、字段名等信息),根据用户定义的模板生成所需的映射文件、实体类和接口。生成的代码遵循一定的规则和命名约定,便于快速集成和维护。
Mybatis官方生成器的优势-
减少冗余代码:通过自动化的代码生成,开发人员不再需要手动编写大量的重复代码,如SQL映射文件、实体类和接口等。
-
提高开发效率:MBG可以在短时间内生成大量的代码,节省开发时间,特别是在项目初期或者需要快速迭代开发时尤为明显。
-
一致的编码标准:通过MBG生成的代码,可以保证代码风格和命名规则的一致性,便于团队开发和维护。
- 灵活的配置选项:MBG提供了丰富的配置选项,用户可以根据具体需求定制生成代码的细节,如表名转换规则、字段名转换规则、注释信息等。
-
新项目启动:对于新的项目,特别是那些数据模型比较复杂、数据表较多的项目,MBG可以快速生成基础的代码框架,从而加速项目启动。
-
代码重构:在现有的项目中,如果数据模型发生了变化(如新增了表、字段等),可以利用MBG重新生成一部分代码,从而避免手动修改大量代码。
- 维护和扩展:对于已经使用MyBatis的项目,如果需要维护或者扩展数据库操作,MBG可以生成新的代码,帮助开发者更快地完成开发任务。
-
下载MBG:可以到MyBatis Generator的GitHub页面下载最新版本的MBG,或者使用Maven引入MBG的依赖。
<dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.7</version> </dependency>
-
配置文件准备:MBG需要一个配置文件,该文件定义了如何生成代码以及生成哪些代码。配置文件通常是一个XML文件,例如
generatorConfig.xml
。<generatorConfiguration> <context id="DB2Tables" targetRuntime="MyBatis3"> <commentGenerator> <property name="suppressDate" value="true"/> </commentGenerator> <classPathEntry location="lib/mysql-connector-java-8.0.22.jar"/> <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mydatabase" userId="root" password="password"/> <javaTypeResolver> <property name="unambiguousTypeOverrides" value="true"/> </javaTypeResolver> <javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> <property name="trimStrings" value="true"/> </javaModelGenerator> <sqlMapGenerator targetPackage="com.example.mappers" targetProject="src/main/resources"> </sqlMapGenerator> <javaClientGenerator type="SqlMapClient" targetPackage="com.example.mapper" targetProject="src/main/java"> </javaClientGenerator> </context> </generatorConfiguration>
-
运行MBG:通过命令行工具或者Maven插件运行MBG。
mvn mybatis-generator:generate
或者在命令行中直接执行生成命令:
java -jar mybatis-generator-core-1.3.7.jar -configfile generatorConfig.xml -overwrite
配置文件generatorConfig.xml
是MBG的核心配置文件,它定义了MBG如何生成代码。以下是配置文件的主要元素及其功能:
-
context:定义了生成器的上下文环境。每个上下文可以定义一个或多个目标数据库,一个或多个目标包路径等。
<context id="DB2Tables" targetRuntime="MyBatis3">
id
:上下文的唯一标识符,用于区分多个上下文。targetRuntime
:生成代码的目标运行时环境,如MyBatis3、MyBatis3Simple等。
-
commentGenerator:配置生成的代码中的注释信息。
<commentGenerator> <property name="suppressDate" value="true"/> </commentGenerator>
suppressDate
:是否在生成代码中添加日期注释。
-
classPathEntry:配置依赖的JDBC驱动类路径。
<classPathEntry location="lib/mysql-connector-java-8.0.22.jar"/>
-
jdbcConnection:配置数据库连接信息。
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mydatabase" userId="root" password="password"/>
driverClass
:数据库驱动类。connectionURL
:数据库连接URL。userId
:数据库用户名。password
:数据库密码。
-
javaTypeResolver:配置Java类型解析器。
<javaTypeResolver> <property name="unambiguousTypeOverrides" value="true"/> </javaTypeResolver>
-
javaModelGenerator:配置实体类生成器。
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> <property name="trimStrings" value="true"/> </javaModelGenerator>
targetPackage
:实体类的包名。targetProject
:存放生成的Java代码的项目路径。enableSubPackages
:是否启用子包,根据数据库表名生成子包。trimStrings
:生成的实体类中字段是否使用trim(String)
函数来去除字符串前后的空格。
-
sqlMapGenerator:配置SQL映射文件生成器。
<sqlMapGenerator targetPackage="com.example.mappers" targetProject="src/main/resources"> </sqlMapGenerator>
targetPackage
:SQL映射文件的包名。targetProject
:存放生成的SQL映射文件的项目路径。
-
javaClientGenerator:配置DAO接口生成器。
<javaClientGenerator type="SqlMapClient" targetPackage="com.example.mapper" targetProject="src/main/java"> </javaClientGenerator>
type
:生成的DAO接口类型,如SqlMapClient
、Annotation
等。targetPackage
:DAO接口的包名。targetProject
:存放生成的DAO接口的项目路径。
Mapper接口是MyBatis中用于定义数据库访问操作的一种方式。通过MBG,可以自动生成这些接口。
<javaClientGenerator type="XmlMapper" targetPackage="com.example.mapper"
targetProject="path/to/project">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
该配置生成一个Mapper接口,例如:
package com.example.mapper;
public interface UserMapper {
int insert(User record);
int insertSelective(User record);
List<User> selectAll();
int updateByPrimaryKey(User record);
int updateByPrimaryKeySelective(User record);
}
生成SQL映射文件
SQL映射文件是MyBatis用来定义SQL语句和结果集映射的地方。通过MBG,可以自动生成这些文件。
<sqlMapGenerator targetPackage="com.example.mappers"
targetProject="src/main/resources">
</sqlMapGenerator>
该配置生成一个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="com.example.mapper.UserMapper">
<resultMap id="BaseResultMap" type="com.example.model.User">
<id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="email" property="email" jdbcType="VARCHAR" />
</resultMap>
<insert id="insert" parameterType="com.example.model.User">
insert into user (id, name, email)
values (#{id}, #{name}, #{email})
</insert>
<select id="selectAll" resultMap="BaseResultMap">
select id, name, email from user
</select>
<update id="updateByPrimaryKey" parameterType="com.example.model.User">
update user set name = #{name}, email = #{email} where id = #{id}
</update>
</mapper>
生成实体类
实体类是Java对象,用于表示数据库中的表。通过MBG,可以自动生成这些类。
<javaModelGenerator targetPackage="com.example.model"
targetProject="path/to/project">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
该配置生成一个Java实体类,例如:
package com.example.model;
public class User {
private Integer id;
private String name;
private String email;
// Getter and Setter methods
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;
}
}
Mybatis官方生成器的高级用法
自定义生成规则
MBG允许用户通过配置文件自定义生成代码的规则。例如,可以自定义实体类的属性命名规则、字段名转换规则等。
<javaModelGenerator targetPackage="com.example.model"
targetProject="path/to/project">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
<property name="baseRecordType" value="BaseRecord"/>
<property name="baseResultMap" value="BaseResultMap"/>
<property name="modelPackage" value="model"/>
</javaModelGenerator>
通过这些配置,用户可以自定义生成代码的细节,使其更符合项目的需求。
插件扩展MBG支持插件扩展,允许用户通过编写插件来扩展MBG的功能。插件可以通过实现org.mybatis.generator.plugin.PluginAdapter
接口来完成。
public class CustomPlugin extends PluginAdapter {
@Override
public boolean validate(List<String> warnings) {
// Validation logic
return true;
}
@Override
public boolean sqlMapGenerated(Interface interfaze, IntrospectedTable introspectedTable) {
// Custom SQL map generation logic
return true;
}
@Override
public boolean javaModelGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
// Custom Java model generation logic
return true;
}
}
通过插件,可以灵活地扩展MBG的功能,满足更多复杂的需求。
Mybatis官方生成器常见问题解答 常见错误及解决方法-
配置文件解析错误:如果生成器无法正确解析配置文件,通常是因为配置文件有语法错误或者路径配置不正确。
- 解决方法:检查配置文件的语法是否正确,确保路径配置正确。
-
数据库连接失败:如果生成器无法连接到数据库,通常是因为数据库连接信息配置错误或者数据库服务未启动。
- 解决方法:检查数据库连接URL、用户名和密码是否正确,确保数据库服务已启动并运行正常。
-
生成代码错误:如果生成的代码有逻辑错误或者不符合预期,通常是因为配置文件中的选项配置不正确。
- 解决方法:检查配置文件中的选项配置是否正确,确保生成器能够正确理解用户的意图。
-
生成代码路径错误:如果生成的代码没有被放置在预期的路径下,通常是因为生成器配置中的路径设置错误。
- 解决方法:检查配置文件中的路径设置,确保生成的代码被放置在正确的路径下。
-
生成代码重复:如果生成的代码被重复生成,通常是因为生成器配置中的重复生成设置或重复执行生成操作。
- 解决方法:检查配置文件中的生成设置,确保生成器不会重复生成代码。
-
如何防止生成的代码被IDE自动格式化?
- 解决方案:在生成器配置文件中,可以通过
<property name="enableSubPackages" value="true"/>
等属性配置来控制生成的代码格式。此外,可以在IDE中设置代码保存时的格式化规则。
- 解决方案:在生成器配置文件中,可以通过
-
如何处理生成的代码中的注释信息?
- 解决方案:在配置文件的
<commentGenerator>
标签中,可以通过设置suppressDate
等属性来控制生成代码中的注释信息。
- 解决方案:在配置文件的
-
生成的代码如何与现有代码集成?
- 解决方案:将生成的代码放置在与现有代码一致的包路径下,并确保生成的代码和现有代码之间没有命名冲突。如果需要,可以手动修改生成的代码以适应现有代码的结构。
-
如何自定义生成代码的命名规则?
- 解决方案:在配置文件中,可以通过设置
baseRecordType
、baseResultMap
等属性来自定义生成代码的命名规则。
- 解决方案:在配置文件中,可以通过设置
-
如何防止生成的代码被覆盖?
- 解决方案:在运行生成器时,可以通过命令行参数设置
-overwrite
选项来控制是否覆盖已生成的代码。如果不希望覆盖已有的代码,可以去掉-overwrite
选项。
- 解决方案:在运行生成器时,可以通过命令行参数设置
本节通过一个具体的案例来展示如何使用MBG生成MyBatis所需的代码。假设我们有一个数据库表user
,并且想要生成相关的Mapper接口、SQL映射文件和实体类。
数据库表结构
CREATE TABLE `user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
`email` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
配置文件
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressDate" value="true"/>
</commentGenerator>
<classPathEntry location="lib/mysql-connector-java-8.0.22.jar"/>
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mydatabase"
userId="root"
password="password"/>
<javaTypeResolver>
<property name="unambiguousTypeOverrides" value="true"/>
</javaTypeResolver>
<javaModelGenerator targetPackage="com.example.model"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<sqlMapGenerator targetPackage="com.example.mappers"
targetProject="src/main/resources">
</sqlMapGenerator>
<javaClientGenerator type="XmlMapper" targetPackage="com.example.mapper"
targetProject="src/main/java">
</javaClientGenerator>
</context>
</generatorConfiguration>
生成代码
运行生成器:
mvn mybatis-generator:generate
或者在命令行中直接执行:
java -jar mybatis-generator-core-1.3.7.jar -configfile generatorConfig.xml -overwrite
生成结果
-
Mapper接口
package com.example.mapper; import java.util.List; import com.example.model.User; public interface UserMapper { int insert(User record); int insertSelective(User record); List<User> selectAll(); int updateByPrimaryKey(User record); int updateByPrimaryKeySelective(User record); }
-
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="com.example.mapper.UserMapper"> <resultMap id="BaseResultMap" type="com.example.model.User"> <id column="id" property="id" jdbcType="INTEGER" /> <result column="name" property="name" jdbcType="VARCHAR" /> <result column="email" property="email" jdbcType="VARCHAR" /> </resultMap> <insert id="insert" parameterType="com.example.model.User"> insert into user (id, name, email) values (#{id}, #{name}, #{email}) </insert> <select id="selectAll" resultMap="BaseResultMap"> select id, name, email from user </select> <update id="updateByPrimaryKey" parameterType="com.example.model.User"> update user set name = #{name}, email = #{email} where id = #{id} </update> </mapper>
-
实体类
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; } }
通过使用MBG,我们可以快速生成MyBatis所需的代码,大大减少了开发人员编写重复代码的工作量,提高了开发效率。生成的代码遵循一定的规则和命名约定,便于快速集成和维护。此外,MBG还支持自定义生成规则和插件扩展,使得生成的代码能够更符合项目的需求。
在实际项目中,建议仔细阅读和理解MBG的配置文件,以确保生成的代码能够满足项目的需求。同时,通过编写插件来扩展MBG的功能,可以使生成器更加灵活和强大。
如果在使用过程中遇到任何问题,可以通过查阅官方文档或者社区支持来解决。此外,还可以参考一些开源项目,学习其他开发者是如何使用MBG的。通过不断实践和积累经验,可以更好地利用MBG来提高开发效率。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章