Mybatis Generator(MBG)是Mybatis官方提供的代码生成工具,它可以根据数据库表信息自动生成Mybatis相关的实体类、Mapper接口及对应的XML配置文件。本文将详细介绍MBG的使用方法,并提供相关的配置和使用示例,帮助你更好地理解和应用Mybatis官方生成器资料。
什么是Mybatis生成器Mybatis Generator(以下简称MBG)是Mybatis官方提供的一款代码生成工具,可以根据数据库表信息自动生成Mybatis相关的实体类(JavaBean)、Mapper接口及对应的XML配置文件。通过MBG,开发人员可以快速生成初始代码,从而减少手工编码的工作量,提高开发效率。
示例配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-configuration_1_0.dtd">
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3Simple">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 false: 否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!-- 数据库链接URL -->
<jdbcConnection driverType="H2">
<property name="driver" value="org.h2.Driver" />
<property name="url" value="jdbc:h2:~/test" />
<property name="username" value="sa" />
<property name="password" value="sa" />
</jdbcConnection>
<!-- 生成模型(对应的实体类) -->
<javaModelGenerator targetPackage="com.example.model" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 生成映射文件 -->
<sqlMapGenerator targetPackage="mappers" targetProject=".\src\main\resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- 生成DAO接口 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
</context>
</generatorConfiguration>
Mybatis生成器的作用与优势
Mybatis Generator的主要作用是减少重复的代码编写工作,特别是在处理数据库相关操作时。例如,当数据库表结构发生变更时,手动更新实体类和Mapper接口将变得繁琐且容易出错。使用MBG可以自动生成这些代码,从而确保代码的准确性和一致性。此外,MBG支持多种数据库,如MySQL、Oracle等,可以灵活适应不同的开发环境。
优势
- 提高开发效率:自动生成的代码减少了开发人员的手动编码工作量。
- 减少错误:自动生成的代码减少了由于人工编码造成的错误。
- 易维护性:当数据库表结构发生变化时,可以快速更新生成的代码,维护更简便。
下载Mybatis Generator
从官方网站下载Mybatis Generator的JAR包,当前版本为1.4.0。下载地址:https://github.com/mybatis/generator/releases/latest
引入依赖
在你的项目中引入Mybatis Generator的依赖。如果使用的是Maven项目,可以将以下依赖添加到pom.xml
文件中:
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>
创建配置文件
创建Mybatis Generator的配置文件,如generatorConfig.xml
。以下是一个简单的配置文件示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-configuration_1_0.dtd">
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3Simple">
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<jdbcConnection driverType="H2">
<property name="driver" value="org.h2.Driver" />
<property name="url" value="jdbc:h2:~/test" />
<property name="username" value="sa" />
<property name="password" value="sa" />
</jdbcConnection>
<javaModelGenerator targetPackage="com.example.model" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="mappers" targetProject=".\src\main\resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
</context>
</generatorConfiguration>
执行代码生成
使用命令行工具运行Mybatis Generator。确保你的项目编译成功后,执行以下命令:
java -jar mybatis-generator-core-1.4.0.jar -configfile generatorConfig.xml -overwrite
配置XML文件详解
XML文件结构
generatorConfig.xml
文件是 Mybatis Generator 的配置文件,定义了生成代码的规则和目标。以下是各标签的详细说明:
<generatorConfiguration>
:根标签,声明DTD和版本信息。<context>
:定义一个生成环境。可以有多个<context>
标签,每个<context>
标签表示一个生成环境。<commentGenerator>
:配置注释生成器,可以设置是否生成注释。<jdbcConnection>
:配置数据库连接信息。<javaModelGenerator>
:生成Java实体类的配置。<sqlMapGenerator>
:生成SQL映射文件的配置。<javaClientGenerator>
:生成DAO接口的配置。
示例配置文件
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3Simple">
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<jdbcConnection driverType="H2">
<property name="driver" value="org.h2.Driver" />
<property name="url" value="jdbc:h2:~/test" />
<property name="username" value="sa" />
<property name="password" value="sa" />
</jdbcConnection>
<javaModelGenerator targetPackage="com.example.model" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="mappers" targetProject=".\src\main\resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<table tableName="users" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />
</context>
</generatorConfiguration>
<context>
标签中的targetRuntime
属性定义了生成代码的目标运行时环境,如 MyBatis3Simple。<jdbcConnection>
标签中的driverType
属性指定了数据库驱动类型,property
标签用于配置驱动类名、数据库URL、用户名和密码。<javaModelGenerator>
标签中的targetPackage
属性指定了生成Java实体类的包名,targetProject
属性指定了生成代码的目标项目路径。<sqlMapGenerator>
和<javaClientGenerator>
标签中的targetPackage
和targetProject
属性与<javaModelGenerator>
类似,分别用于SQL映射文件和DAO接口的生成。<table>
标签用于指定需要生成代码的数据库表,tableName
属性指定了表名,domainObjectName
属性指定了实体类的名称。
创建一个简单的数据库表 users
,用于演示MBG的使用。以下是创建 users
表的SQL语句:
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(255),
email VARCHAR(255),
age INT
);
插入数据
插入一些示例数据:
INSERT INTO users (id, name, email, age) VALUES (1, 'John Doe', 'john@example.com', 30);
INSERT INTO users (id, name, email, age) VALUES (2, 'Jane Smith', 'jane@example.com', 25);
INSERT INTO users (id, name, email, age) VALUES (3, 'Alice Johnson', 'alice@example.com', 28);
生成实体类、Mapper接口和XML文件
使用前面配置好的 generatorConfig.xml
文件生成代码。执行以下命令:
java -jar mybatis-generator-core-1.4.0.jar -configfile generatorConfig.xml -overwrite
MBG将根据 generatorConfig.xml
文件中的配置生成以下文件:
com.example.model
包下的User.java
实体类。mappers
包下的UserMapper.xml
映射文件。com.example.mapper
包下的UserMapper.java
接口。
以下是生成的代码示例:
User.java
package com.example.model;
public class User {
private Integer id;
private String name;
private String email;
private Integer age;
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;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
UserMapper.java
package com.example.mapper;
import com.example.model.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.session.RowBounds;
import java.util.List;
public interface UserMapper {
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table users
*
* @mbg.generated
*/
int deleteByPrimaryKey(Integer id);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table users
*
* @mbg.generated
*/
int insert(User record);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table users
*
* @mbg.generated
*/
int insertSelective(User record);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table users
*
* @mbg.generated
*/
List<User> selectByExampleWithRowbounds(@Param("example") User record, @Param("rowBounds") RowBounds rowBounds);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table users
*
* @mbg.generated
*/
int selectCountByExample(User record);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table users
*
* @mbg.generated
*/
int updateByPrimaryKeySelective(@Param("record") User record);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table users
*
* @mbg.generated
*/
int updateByPrimaryKey(@Param("record") User record);
}
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">
<cache />
<resultMap id="BaseResultMap" type="com.example.model.User">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="email" property="email" />
<result column="age" property="age" />
</resultMap>
<sql id="Base_Column_List">id, name, email, age</sql>
<select id="selectByExample" resultMap="BaseResultMap" parameterType="com.example.model.User">
select
<if test="_parameter != null">
<if test="distinct">
distinct
</if>
<if test="oredCriteria != null">
<if test="oredCriteria.size > 0">
<set>
${oredCriteria[0].sql}
</set>
</if>
</if>
<if test="orderByClause != null">
order by ${orderByClause}
</if>
</if>
</select>
... <!-- 更多的SQL映射语句 -->
</mapper>
Mybatis生成器常用配置选项
模板配置
MBG允许用户自定义模板生成代码。模板文件通常位于 generatorConfig.xml
文件中的 <template>
标签内。例如,可以自定义生成的实体类模板:
自定义实体类模板
<template type="mapper" file="userMapper.java">
<property name="fileEncoding" value="UTF-8" />
<property name="targetPackage" value="com.example.mapper" />
<property name="targetProject" value=".\src\main\java" />
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</template>
模板示例
package ${package};
import ${entityModelPackage}.${entityName};
import ${entityModelPackage}.Example.${entityName}Example;
public interface ${entityName}Mapper {
int deleteByPrimaryKey(Integer id);
int insert(${entityName} record);
int insertSelective(${entityName} record);
List<${entityName}> selectByExample(${entityName}Example example);
${entityName} selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(${entityName} record);
int updateByPrimaryKey(${entityName} record);
}
生成规则配置
MBG支持多种生成规则配置,可以通过配置文件中的 property
标签来控制生成的行为。
示例配置
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3Simple">
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<jdbcConnection driverType="H2">
<property name="driver" value="org.h2.Driver" />
<property name="url" value="jdbc:h2:~/test" />
<property name="username" value="sa" />
<property name="password" value="sa" />
</jdbcConnection>
<javaModelGenerator targetPackage="com.example.model" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="mappers" targetProject=".\src\main\resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<table tableName="users" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />
</context>
</generatorConfiguration>
enableCountByExample
:是否生成countByExample
方法。enableUpdateByExample
:是否生成updateByExample
方法。enableDeleteByExample
:是否生成deleteByExample
方法。enableSelectByExample
:是否生成selectByExample
方法。selectByExampleQueryId
:是否生成selectByExampleQueryId
方法。
如果生成的代码与实际情况不匹配,可以考虑以下方法:
- 检查数据库表结构:确认数据库表结构是否与配置文件中的定义一致。
- 更新配置文件:根据实际情况更新
generatorConfig.xml
文件中的配置。 - 重新运行生成器:执行
java -jar mybatis-generator-core-1.4.0.jar -configfile generatorConfig.xml -overwrite
命令重新生成代码。
示例错误及解决方案
假设生成的代码中有一个编译错误,提示某个方法不存在:
public interface UserMapper {
int deleteByPrimaryKey(Integer id); // 错误:方法不存在
}
解决方案:
- 检查
generatorConfig.xml
文件中的<table>
标签,确认tableName
和domainObjectName
属性配置正确。 - 确认数据库表结构与配置文件中的定义一致。
- 重新生成代码:执行
java -jar mybatis-generator-core-1.4.0.jar -configfile generatorConfig.xml -overwrite
。
如果生成的代码中出现错误,检查以下可能的原因:
- 数据库连接配置:确保数据库连接配置正确,如驱动类名、URL、用户名和密码。
- 模板文件路径:确保自定义模板文件路径正确。
- 模板文件内容:检查模板文件内容是否符合规范。
示例错误及解决方案
假设生成的代码中有一个编译错误,提示某个方法不存在:
public interface UserMapper {
int deleteByPrimaryKey(Integer id); // 错误:方法不存在
}
解决方案:
- 检查
generatorConfig.xml
文件中的<table>
标签,确认tableName
和domainObjectName
属性配置正确。 - 确认数据库表结构与配置文件中的定义一致。
- 重新生成代码:执行
java -jar mybatis-generator-core-1.4.0.jar -configfile generatorConfig.xml -overwrite
。
- 生成代码后需要手动修改:对于一些特殊情况,MBG生成的代码可能需要手动调整,如字段命名、注释等。
- 生成代码的性能问题:MBG生成的代码性能可能不如手工编写的代码,特别是复杂查询时。
解决方案
- 手动修改生成的代码:对于需要特殊处理的字段或方法,手动修改生成的代码。
- 优化查询性能:对于复杂的查询,考虑使用原生SQL语句或Mybatis的动态SQL功能来提高性能。
在实际开发中,数据库表结构可能会不断变化。MBG支持动态修改生成的代码,以适应新的数据库结构。
示例
假设 users
表新增了一个字段 address
:
ALTER TABLE users ADD COLUMN address VARCHAR(255);
可以重新运行MBG生成器,MBG将根据新的数据库结构生成新的代码:
java -jar mybatis-generator-core-1.4.0.jar -configfile generatorConfig.xml -overwrite
生成的 User.java
实体类将包含新的 address
字段:
public class User {
private Integer id;
private String name;
private String email;
private Integer age;
private String address;
// Getter and Setter methods
}
注意事项
- 数据迁移:在修改数据库表结构之前,确保数据迁移过程不会丢失重要数据。
- 生成代码重命名:如果新的字段名称与旧的字段名称冲突,可能需要手动修改生成的代码以避免冲突。
MBG允许用户通过自定义模板来自定义生成的代码。这可以用于生成特定的业务逻辑代码,如特定的查询方法、事务管理等。
示例
假设需要生成一个自定义的查询方法 getUserById
,可以修改 UserMapper.java
模板文件:
package ${package};
import ${entityModelPackage}.${entityName};
import ${entityModelPackage}.Example.${entityName}Example;
public interface ${entityName}Mapper {
int deleteByPrimaryKey(Integer id);
int insert(${entityName} record);
int insertSelective(${entityName} record);
List<${entityName}> selectByExample(${entityName}Example example);
${entityName} selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(${entityName} record);
int updateByPrimaryKey(${entityName} record);
// 自定义查询方法
${entityName} getUserById(Integer id);
}
生成的代码将包含自定义的 getUserById
方法:
public interface UserMapper {
int deleteByPrimaryKey(Integer id);
int insert(User record);
int insertSelective(User record);
List<User> selectByExample(UserExample example);
User selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(User record);
int updateByPrimaryKey(User record);
// 自定义查询方法
User getUserById(Integer id);
}
注意事项
- 模板文件路径:确保模板文件路径正确,并在
generatorConfig.xml
文件中正确配置。 - 模板文件内容:确保模板文件内容符合语法规范,避免生成代码时出现错误。
通过自定义模板,用户可以根据实际需求生成特定的代码,从而更好地适应项目需求。
共同学习,写下你的评论
评论加载中...
作者其他优质文章