本文介绍了 Mybatis Generator 的下载、安装与配置过程,以及如何生成 Mybatis 所需的 XML 映射文件和 Java 实体类。文章详细讲解了配置文件的编写和自定义生成规则的方法,并提供了多数据表关系处理的示例。
Mybatis官方生成器简介 Mybatis Generator 是什么Mybatis Generator 是一个强大的代码生成工具,它可以根据数据库表自动生成 Mybatis 操作所需的 XML 映射文件和 Java 实体类。通过简化这些重复繁琐的手动编码任务,Mybatis Generator 可以帮助开发人员提高开发效率,并减少由于手动编码错误带来的问题。
如何获取 Mybatis 官方生成器要使用 Mybatis Generator,您需要先下载它。Mybatis Generator 的官方发布站点是 https://github.com/mybatis/generator/releases。您可以从该站点下载适合您项目的最新版本,通常以 .zip
或 .jar
文件形式提供。
Mybatis Generator 的运行需要 Java 环境。首先确保系统中已安装了 Java。检查 Java 环境的方式如下:
java -version
如果未安装 Java,可以从官网下载安装 https://www.oracle.com/java/technologies/javase-downloads.html。安装完成后,确保 Java 已被添加到您的系统路径中。
接下来,下载 Mybatis Generator 的 jar 文件(通常位于其 GitHub 发布页面)并解压。您可以通过命令行运行 Mybatis Generator,方法如下:
java -jar mybatis-generator-core-1.3.7.jar
此命令将启动 Mybatis Generator,它会查找配置文件并执行配置中指定的任务。配置文件通常命名为 generatorConfig.xml
。
Mybatis Generator 的配置文件 generatorConfig.xml
是其核心配置文件。该文件使用 XML 格式编写,包含所有运行时需要的配置信息。以下是配置文件的基本结构:
<generatorConfiguration>
<context id="default" targetRuntime="MyBatis3" defaultModelType="flat">
<!-- 数据库连接信息 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mydb"
userId="root"
password="password"/>
<!-- 生成的实体类配置 -->
<javaModelGenerator targetPackage="com.example.model"
targetProject="src/main/java"/>
<!-- 生成的映射文件配置 -->
<sqlMapGenerator targetPackage="com.example.mapper"
targetProject="src/main/resources"/>
<!-- 生成的DAO类配置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper"
targetProject="src/main/java"/>
</context>
</generatorConfiguration>
常用标签介绍
在配置文件中,context
标签是最主要的配置标签,它定义了 Mybatis Generator 的运行环境和生成规则。
jdbcConnection
jdbcConnection
标签用于配置数据库连接信息,例如数据库类型、URL、用户名和密码等。
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mydb"
userId="root"
password="password"/>
javaModelGenerator
javaModelGenerator
用于定义 Java 实体类的生成规则。
<javaModelGenerator targetPackage="com.example.model"
targetProject="src/main/java"/>
sqlMapGenerator
sqlMapGenerator
标签定义了 SQL 映射文件的生成规则。
<sqlMapGenerator targetPackage="com.example.mapper"
targetProject="src/main/resources"/>
javaClientGenerator
javaClientGenerator
标签定义了 Java Mapper 接口的生成规则。
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper"
targetProject="src/main/java"/>
实例配置讲解
我们可以通过实例配置来理解如何配置生成器。以下是一个完整的配置文件的例子:
<generatorConfiguration>
<context id="test" targetRuntime="MyBatis3" defaultModelType="flat">
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mydb"
userId="root"
password="password"/>
<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"/>
<table tableName="user">
<generatedKey column="id" sqlStatement="Mysql"/>
</table>
</context>
</generatorConfiguration>
此配置文件中,我们定义了一个 context
,其中包含了数据库连接信息和各生成器的基本设置。table
标签用于指定要生成代码的数据库表。
在配置文件中,我们可以通过配置 context
和 table
标签来控制生成规则。例如:
<generatorConfiguration>
<context id="test" targetRuntime="MyBatis3" defaultModelType="flat">
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mydb"
userId="root"
password="password"/>
<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"/>
<table tableName="user">
<generatedKey column="id" sqlStatement="Mysql"/>
</table>
</context>
</generatorConfiguration>
这里,我们指定了数据库连接信息和生成器的一些基本设置。table
标签中的 tableName
属性用于指定生成代码的表名,generatedKey
标签用于指定主键生成规则。
我们可以通过一些自定义配置来进一步控制生成器的行为。例如,如果我们希望生成的实体类命名规则有所不同,可以在 javaModelGenerator
中添加 property
标签,例如:
<javaModelGenerator targetPackage="com.example.model"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
<property name="immutable" value="false"/>
<property name="useCatalog" value="false"/>
<property name="useInnerSelect" value="true"/>
</javaModelGenerator>
这些配置可以控制实体类的生成细节,如是否启用子包、是否截断字符串等。
自动生成示例假设我们有一个数据库表 user
,我们希望生成其对应的实体类、映射文件和 Mapper 接口。我们按照以下步骤操作:
- 在
generatorConfig.xml
文件中定义配置; - 运行 Mybatis Generator。
配置文件示例
<generatorConfiguration>
<context id="test" targetRuntime="MyBatis3" defaultModelType="flat">
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mydb"
userId="root"
password="password"/>
<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"/>
<table tableName="user">
<generatedKey column="id" sqlStatement="Mysql"/>
</table>
</context>
</generatorConfiguration>
生成代码示例
假设 user
表中包含 id
, username
, password
和 email
等字段,生成的代码可能如下:
实体类 User.java
package com.example.model;
public class User {
private Integer id;
private String username;
private String password;
private String email;
// getters and setters
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
映射文件 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" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="email" property="email"/>
</resultMap>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
SELECT
id,
username,
password,
email
FROM
user
WHERE
id = #{id}
</select>
<insert id="insert" parameterType="com.example.model.User">
INSERT INTO
user (id, username, password, email)
VALUES (
#{id},
#{username},
#{password},
#{email}
)
</insert>
</mapper>
Mapper 接口 UserMapper.java
package com.example.mapper;
import com.example.model.User;
import java.util.List;
public interface UserMapper {
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table user
*
* @mbg.generated
*/
int deleteByPrimaryKey(Integer id);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table user
*
* @mbg.generated
*/
int insert(User record);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table user
*
* @mbg.generated
*/
int insertSelective(User record);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table user
*
* @mbg.generated
*/
User selectByPrimaryKey(Integer id);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table user
*
* @mbg.generated
*/
int updateByPrimaryKeySelective(User record);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table user
*
* @mbg.generated
*/
int updateByPrimaryKey(User record);
}
进阶使用技巧
如何处理多数据表关系
处理多数据表关系时,Mybatis Generator 提供了一些高级配置来简化操作。例如,我们可以通过配置 association
和 collection
标签来生成关联的实体类和映射文件。
示例配置
假设我们有两个数据库表 user
和 order
,其中 user
表中的 userId
字段与 order
表中的 userId
字段关联。我们可以在 generatorConfig.xml
中这样配置:
<generatorConfiguration>
<context id="test" targetRuntime="MyBatis3" defaultModelType="flat">
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mydb"
userId="root"
password="password"/>
<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"/>
<table tableName="user">
<generatedKey column="id" sqlStatement="Mysql"/>
</table>
<table tableName="order">
<generatedKey column="id" sqlStatement="Mysql"/>
<association property="user" javaType="com.example.model.User" column="userId"/>
</table>
</context>
</generatorConfiguration>
示例代码
假设 order
表中的 userId
字段关联 user
表中的 id
字段,那么生成的代码可能如下:
Order.java
package com.example.model;
import com.example.model.User;
public class Order {
private Integer id;
private Integer userId;
private String product;
private String status;
private User user;
// getters and setters
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getProduct() {
return product;
}
public void setProduct(String product) {
this.product = product;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
OrderMapper.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.OrderMapper">
<resultMap id="BaseResultMap" type="com.example.model.Order">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="product" property="product"/>
<result column="status" property="status"/>
<association property="user" javaType="com.example.model.User" column="user_id" select="selectByPrimaryKey"/>
</resultMap>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
SELECT
id,
user_id,
product,
status
FROM
order
WHERE
id = #{id}
</select>
</mapper>
User.java
package com.example.model;
public class User {
private Integer id;
private String username;
private String password;
private String email;
// getters and setters
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
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" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="email" property="email"/>
</resultMap>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
SELECT
id,
username,
password,
email
FROM
user
WHERE
id = #{id}
</select>
</mapper>
生成器与IDE的集成
将 Mybatis Generator 与 IDE 集成可以提高开发效率。以下是如何将 Mybatis Generator 与 IntelliJ IDEA 或 Eclipse 集成的步骤:
IntelliJ IDEA 集成
- 安装 Mybatis Generator 插件
- 在项目中添加生成器配置文件
generatorConfig.xml
- 在 IntelliJ IDEA 中配置外部工具
- 打开
File -> Settings -> Tools -> External Tools
- 点击
+
按钮添加新的外部工具配置 - 设置名称为
Mybatis Generator
- 主要执行文件为
java -jar mybatis-generator-core-1.3.7.jar
- 工作目录为项目的根目录
- 参数为
-configfile generatorConfig.xml
- 打开
- 在项目中右键,选择
External Tools -> Mybatis Generator
来启动生成器
Eclipse 集成
- 安装 Mybatis Generator 插件
- 在项目中添加生成器配置文件
generatorConfig.xml
- 在 Eclipse 中配置外部工具
- 打开
Run -> External Tools -> External Tools Configurations
- 点击
+
按钮添加新的外部工具配置 - 设置名称为
Mybatis Generator
- 主要执行文件为
java -jar mybatis-generator-core-1.3.7.jar
- 工作目录为项目的根目录
- 工具参数为
-configfile generatorConfig.xml
- 打开
- 在项目中右键,选择
Run As -> Mybatis Generator
来启动生成器
调试 Mybatis Generator 时,可以通过日志输出来追踪问题。Mybatis Generator 支持通过日志配置文件 log4j.properties
或 log4j.xml
来配置日志输出级别和格式。
配置示例
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
将上述配置保存为 log4j.properties
文件并放置在与 generatorConfig.xml
同一目录下。启动 Mybatis Generator 后,日志信息将输出到控制台,帮助您排查问题。
如果 Mybatis Generator 不执行,通常是因为配置文件有误或数据库连接信息不正确。请确保配置文件中的 context
标签和 jdbcConnection
标签配置正确,数据库连接信息无误。
问题排查
- 检查数据库连接信息是否正确
- 确认生成器配置文件是否完整
- 执行
java -jar mybatis-generator-core-1.3.7.jar
时确保命令行参数正确
如果生成的代码不符合预期,可能是由于配置文件中的 table
标签配置不正确或 property
标签设置不当。请仔细检查配置文件中的相关配置。
问题排查
- 检查
table
标签中的tableName
,generatedKey
等属性是否正确 - 检查
property
标签中的配置是否符合预期
为了提高 Mybatis Generator 的性能,可以考虑以下建议:
- 减少生成表的数量:只生成实际需要使用的表,减少不必要的代码生成。
- 缓存配置文件:如果生成任务频繁,可以考虑将配置文件缓存在内存中,减少每次生成时的解析时间。
- 并行生成:如果环境支持,并行生成多个表可以提高生成效率。
假设我们正在开发一个电商平台,需要从数据库中读取用户和订单信息。我们可以使用 Mybatis Generator 自动生成相关的代码,并集成到项目中。以下是具体步骤:
- 准备数据库表:创建
user
和order
表,并插入一些示例数据。 - 配置 Mybatis Generator:编写
generatorConfig.xml
文件,定义要生成的表。 - 生成代码并集成:运行 Mybatis Generator 生成代码,并将生成的代码集成到项目中。
- 编写业务逻辑:使用生成的 Mapper 接口和实体类编写业务逻辑。
示例代码
假设 user
表和 order
表定义如下:
-- user 表
CREATE TABLE `user` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`username` VARCHAR(100) NOT NULL,
`password` VARCHAR(100) NOT NULL,
`email` VARCHAR(100)
);
-- order 表
CREATE TABLE `order` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`user_id` INT NOT NULL,
`product` VARCHAR(100) NOT NULL,
`status` VARCHAR(50) NOT NULL,
FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
);
generatorConfig.xml
配置
<generatorConfiguration>
<context id="test" targetRuntime="MyBatis3" defaultModelType="flat">
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mydb"
userId="root"
password="password"/>
<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"/>
<table tableName="user">
<generatedKey column="id" sqlStatement="Mysql"/>
</table>
<table tableName="order">
<generatedKey column="id" sqlStatement="Mysql"/>
<association property="user" javaType="com.example.model.User" column="user_id"/>
</table>
</context>
</generatorConfiguration>
生成后的代码
执行 Mybatis Generator 后,将生成 User
和 Order
的实体类、映射文件和 Mapper 接口。此时,我们可以在项目中编写业务逻辑,例如查询用户订单:
UserService.java
package com.example.service;
import com.example.mapper.UserMapper;
import com.example.mapper.OrderMapper;
import com.example.model.User;
import com.example.model.Order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private OrderMapper orderMapper;
public User getUser(int id) {
return userMapper.selectByPrimaryKey(id);
}
public List<Order> getUserOrders(int id) {
User user = userMapper.selectByPrimaryKey(id);
if (user != null) {
return orderMapper.selectByUserId(id);
}
return null;
}
}
运行项目
在 Spring Boot 项目中,可以使用 Mybatis 和 Spring Data Mybatis 来管理数据库连接和事务管理。确保在 application.properties
文件中配置数据库连接信息,并在 pom.xml
中添加 Mybatis 和 Spring Data Mybatis 依赖。
# application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
<!-- pom.xml -->
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
通过以上步骤,我们可以使用 Mybatis Generator 自动生成代码,并将其集成到项目中,简化开发过程并提高开发效率。
使用经验总结使用 Mybatis Generator 可以显著提高开发效率,减少手动编写代码的错误。以下是一些使用经验总结:
- 配置文件的重要:配置文件是生成器的核心,确保配置文件中的
table
标签和property
标签配置正确。 - 版本兼容性:确保 Mybatis Generator 版本与 Mybatis 版本兼容。
- 性能优化:减少生成表的数量,合理使用缓存和并行生成。
- 代码维护:定期更新生成器配置文件,确保生成的代码与项目需求一致。
- IDE 集成:将生成器与 IDE 集成,提高开发效率。
- Mybatis Generator 官方文档:https://mybatis.org/generator/
- Mybatis Generator GitHub 项目:https://github.com/mybatis/generator
- 慕课网:https://www.imooc.com/,提供 Mybatis Generator 相关课程和视频教程。
通过上述资源,您可以进一步学习和了解 Mybatis Generator 的使用方法和最佳实践。
共同学习,写下你的评论
评论加载中...
作者其他优质文章