Mybatis官方生成器是一种强大的逆向工程工具,它能够根据数据库生成Mybatis的映射文件和实体类,显著提高开发效率。通过简单的配置,Mybatis Generator可以自动生成统一格式的代码,减少手工编写代码的工作量。本文将详细介绍Mybatis Generator的配置和使用方法,帮助开发者快速上手。
Mybatis官方生成器简介 Mybatis简介Mybatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。Mybatis避免了几乎所有JDBC代码和手动设置参数以及获取结果集的需求。它可以通过简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(普通老式Java对象)映射成数据库中的记录。Mybatis的架构使其既支持存储过程又支持存储过程的输出参数,能够将存储过程输出参数映射到一个Java对象的属性。
Mybatis官方生成器概述Mybatis Generator是一款Mybatis官方的逆向工程工具,它能够根据数据库生成对应的Mybatis映射文件(XML或注解形式)以及实体类。使用Mybatis Generator可以大大减少手工编写代码的工作量,特别是在处理复杂的数据库表结构时,可以显著提高开发效率。通过配置简单的XML文件,Mybatis Generator可以自动生成Java类,同时映射XML文件,使得开发人员可以更加专注于业务逻辑的实现,而不需要花太多时间处理数据库相关的代码。
生成器的优势和应用场景优势
- 减少手工编写代码:Mybatis Generator可以自动生成映射文件和实体类,减少了开发人员手动编写这些代码的时间。
- 提高开发效率:自动生成的代码基础,开发人员可以更快速地完成数据库相关代码的开发。
- 维护简单:当数据库表结构发生变化时,只需要重新运行Mybatis Generator,即可生成最新的映射文件和实体类,减少了手工修改代码的工作量。
- 统一结构:Mybatis Generator生成的映射文件和实体类结构统一,有助于团队开发。
应用场景
- 新项目开发:对于新开发的项目,使用Mybatis Generator生成基础代码,可以加快开发进度。
- 已有项目重构:对于已经存在的项目,如果需要重构数据库相关的代码,使用Mybatis Generator可以快速生成统一格式的代码,提高代码质量。
- 团队协作:在团队开发中,使用Mybatis Generator可以保证每个人生成的代码格式一致,方便团队协作。
开发环境包括:Java开发环境、数据库环境以及Mybatis Generator的运行环境。这里假设开发者已经安装了Java环境和数据库(如MySQL),下面介绍如何搭建Mybatis Generator的开发环境。
- Java环境:确保已经安装了JDK环境,可以通过命令
java -version
检查是否安装成功。 - 数据库:确保已经安装了数据库,这里以MySQL为例。安装完成后,通过命令行工具连接数据库。
- IDE:推荐使用IntelliJ IDEA或Eclipse作为开发工具,这里以IntelliJ IDEA为例。
在开发中,使用Maven管理依赖是常见的做法。Mybatis Generator的运行需要添加相关的依赖。在项目中配置Maven,可以在pom.xml
文件中添加以下依赖:
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
其中,mybatis-generator-core
是Mybatis Generator的核心库,mysql-connector-java
是MySQL的连接库。
项目的基本目录结构如下:
src
└── main
├── java
│ └── com.example
│ └── generator
│ └── Generator.java
└── resources
└── generatorConfig.xml
其中,Generator.java
是一个简单的Java程序,用于运行Mybatis Generator。generatorConfig.xml
是Mybatis Generator的配置文件。
generatorConfig.xml
是Mybatis Generator的核心配置文件,它定义了生成器的配置信息。以下是配置文件的基本结构及具体配置项的解释:
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!-- 数据库相关配置 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/testdb"
userId="root"
password="password">
</jdbcConnection>
<!-- 实体类生成配置 -->
<javaModelGenerator targetPackage="com.example.model"
targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 映射文件生成配置 -->
<sqlMapGenerator targetPackage="com.example.mapper"
targetProject="src/main/resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- Mapper接口生成配置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper"
targetProject="src/main/java">
</javaClientGenerator>
<!-- 表生成配置 -->
<table tableName="user" domainObjectName="User" enableCountByExample="false"
enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false">
</table>
</context>
</generatorConfiguration>
评论生成器配置
<commentGenerator>
标签用于配置生成的代码是否包含注释。通过<property name="suppressAllComments" value="true" />
可以禁用自动生成的注释。
数据库连接配置
<jdbcConnection>
标签定义了数据库连接信息,包括驱动类名、连接URL、用户名和密码。
实体类生成配置
<javaModelGenerator>
标签定义了生成Java模型类的包名和目标项目路径。enableSubPackages
属性用于启用子包生成,trimStrings
属性用于控制字符串的处理方式。
映射文件生成配置
<sqlMapGenerator>
标签定义了生成Mapper XML文件的包名和目标项目路径。
Mapper接口生成配置
<javaClientGenerator>
标签定义了生成Mapper接口的包名、类型和目标项目路径。type="XMLMAPPER"
指定生成XML形式的Mapper接口。
表生成配置
<table>
标签定义了生成的表名称和对应的域对象名称。enableCountByExample
等属性用于控制生成的Mapper接口的功能。
生成器的启动和运行可以通过运行一个简单的Java程序来实现。在项目的src/main/java
目录下创建一个Java类Generator.java
,并编写代码启动Mybatis Generator。运行生成器后,可以在指定的目录下查看生成的代码。
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class Generator {
public static void main(String[] args) throws Exception {
List<String> warnings = new ArrayList<>();
boolean overwrite = true;
File configFile = new File("src/main/resources/generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
}
运行Generator.java
后,会在targetProject
指定的目录下生成相应的Java类、Mapper XML文件和Mapper接口。例如,如果配置文件中指定了targetProject="src/main/java"
和targetProject="src/main/resources"
,那么生成的代码将会出现在src/main/java
和src/main/resources
目录下。
生成的代码包括:
- 模型类:在
com.example.model
包下生成User.java
类。 - Mapper接口:在
com.example.mapper
包下生成UserMapper.java
接口。 - Mapper XML文件:在
com.example.mapper
包下生成UserMapper.xml
文件。
生成的代码示例如下:
// User.java
package com.example.model;
public class User {
private Integer id;
private String username;
private String password;
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;
}
}
// UserMapper.java
package com.example.mapper;
public interface UserMapper {
int deleteByPrimaryKey(Integer id);
int insert(User record);
int insertSelective(User record);
User selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(User record);
int updateByPrimaryKey(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">
<resultMap id="BaseResultMap" type="com.example.model.User">
<id column="id" property="id" />
<result column="username" property="username" />
<result column="password" property="password" />
</resultMap>
<sql id="Base_Column_List">
id, username, password
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
select
<if test="columnList != null and columnList.length > 0">
${columnList}
</if>
<if test="columnList == null or columnList.length == 0">
*
</if>
from user
where id = #{id, jdbcType=INTEGER}
</select>
<insert id="insert" parameterType="com.example.model.User">
insert into user (
id,
username,
password
) values (
#{id, jdbcType=INTEGER},
#{username, jdbcType=VARCHAR},
#{password, jdbcType=VARCHAR}
)
</insert>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
delete from user
where id = #{id, jdbcType=INTEGER}
</delete>
<update id="updateByPrimaryKeySelective" parameterType="com.example.model.User">
update user
<set>
<if test="username != null">
username = #{username, jdbcType=VARCHAR},
</if>
<if test="password != null">
password = #{password, jdbcType=VARCHAR},
</if>
</set>
where id = #{id, jdbcType=INTEGER}
</update>
</mapper>
动态更新生成的代码
当数据库表结构发生变化时,可以通过重新运行Mybatis Generator来生成新的代码。例如,如果添加了一个新的字段email
到user
表中,可以通过修改配置文件,再运行Generator.java
来生成新的代码。
- ClassNotFoundException:通常是因为缺少相应的JDBC驱动类。确保在
pom.xml
中添加了正确的JDBC驱动依赖。 - Connection refused:检查数据库连接URL是否正确,确保数据库服务已经启动并且可访问。
- Schema not found:检查数据库的schema(即数据库名)是否正确。
- Incorrect column type:检查
generatorConfig.xml
中的列名是否与数据库中的列名一致。 - Mapper XML文件缓存问题:有时候需要删除
target
目录下的缓存,重新生成代码。
Mybatis Generator提供了丰富的配置选项,可以通过修改generatorConfig.xml
来定制化生成代码。例如,可以通过设置enableSubPackages
属性来启用子包生成,或者通过设置trimStrings
属性来控制字符串的处理方式。
<javaModelGenerator targetPackage="com.example.model"
targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
生成器与IDE集成
为了方便开发人员使用Mybatis Generator,可以将Generator.java
集成到IDE中。例如,在IntelliJ IDEA中,可以将Generator.java
添加到项目的Run Configurations
中,这样就可以通过点击IDE中的运行按钮来启动生成器。
假设我们有一个简单的用户表user
,用于存储用户的ID、用户名和密码。可以通过Mybatis Generator生成对应的Java类、Mapper接口和Mapper XML文件。
- 创建数据库表:首先在数据库中创建用户表
user
。
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
- 配置生成器:在
generatorConfig.xml
中配置数据库连接和表生成信息。
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/testdb"
userId="root"
password="password">
</jdbcConnection>
<javaModelGenerator targetPackage="com.example.model"
targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="com.example.mapper"
targetProject="src/main/resources">
<property name="enableSubPackages" value=" PyTupleProxy.true" />
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper"
targetProject="src/main/java">
</javaClientGenerator>
<table tableName="user" domainObjectName="User" enableCountByExample="false"
enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false">
</table>
</context>
</generatorConfiguration>
- 运行生成器:运行
Generator.java
,生成对应的代码。
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class Generator {
public static void main(String[] args) throws Exception {
List<String> warnings = new ArrayList<>();
boolean overwrite = true;
File configFile = new File("src/main/resources/generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
}
示例项目运行
运行生成的代码,可以编写简单的测试代码来验证生成的代码是否正确。例如,可以编写一个简单的Spring Boot应用来使用生成的Mapper接口。
- 配置Spring Boot项目:
- 在
pom.xml
中添加相关依赖。
- 在
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
</dependencies>
- 在
application.yml
中配置数据库连接信息。
spring:
datasource:
url: jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
username: root
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
- 使用生成的Mapper接口:
- 创建一个简单的Mapper接口和控制器来操作生成的代码。
// UserMapper.java
package com.example.mapper;
public interface UserMapper {
int deleteByPrimaryKey(Integer id);
int insert(User record);
int insertSelective(User record);
User selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(User record);
int updateByPrimaryKey(User record);
}
// UserController.java
package com.example.controller;
import com.example.mapper.UserMapper;
import com.example.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/all")
public List<User> getAllUsers() {
return userMapper.selectAll();
}
@GetMapping("/{id}")
public User getUserById(@RequestParam Integer id) {
return userMapper.selectByPrimaryKey(id);
}
}
示例项目优化
可以通过以下方式进一步优化生成的代码:
- 添加注释:在生成的代码中添加有用的注释,帮助其他开发者理解代码。
- 自定义模板:使用Mybatis Generator提供的自定义模板功能,生成更加符合项目规范的代码。
- 自动化生成:将生成器集成到持续集成(CI)流程中,每次代码仓库有更新时自动生成代码,确保代码的一致性和正确性。
// 自定义模板示例
package com.example.template;
public class CustomUser {
private Integer id;
private String username;
private String password;
// 自定义构造器和方法
}
共同学习,写下你的评论
评论加载中...
作者其他优质文章