1. MyBatis逆向工程核心概念解析
逆向工程在软件开发领域是一个常见且高效的技术手段。对于MyBatis框架而言,逆向工程特指根据已有的数据库表结构,自动生成对应的Java实体类、Mapper接口以及XML映射文件的过程。这与传统的正向开发模式形成鲜明对比。
正向工程模式下,开发者需要先手动编写Java实体类,然后通过框架功能(如Hibernate的hbm2ddl)生成数据库表结构。这种方式适合从零开始的全新项目,但在面对遗留系统或需要快速对接现有数据库时,就显得效率低下了。
MyBatis逆向工程的核心价值在于:
- 节省90%以上的基础CRUD代码编写时间
- 保证实体类与数据库表的严格对应关系
- 自动生成符合MyBatis规范的Mapper接口和XML文件
- 支持多种生成策略满足不同复杂度需求
实际开发中,我建议即使是新项目也优先考虑逆向工程。因为数据库设计往往比业务代码更稳定,从表结构出发生成代码能减少后续因表结构变更导致的代码调整。
2. 环境准备与依赖配置
2.1 Maven依赖详解
完整的pom.xml配置需要包含三个层次的依赖:
- 核心依赖:MyBatis框架本身
- 测试依赖:JUnit单元测试支持
- 插件依赖:逆向工程的核心组件
xml复制<dependencies>
<!-- MyBatis核心 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- 测试框架 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 日志组件 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
2.2 插件配置关键点
逆向工程通过Maven插件形式实现,需要特别注意插件版本与核心依赖的兼容性:
xml复制<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.0</version>
<dependencies>
<!-- 生成器核心 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.2</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
经验之谈:MySQL驱动建议使用5.1.47版本,这是经过大量项目验证的稳定版本。新版本(8.x)在逆向工程时可能会出现时区问题。
3. 配置文件深度解析
3.1 MyBatis核心配置
mybatis-config.xml是MyBatis的入口配置文件,逆向工程需要的基础配置如下:
xml复制<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"/>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<package name="com.baidu.mybatis.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.baidu.mybatis.mapper"/>
</mappers>
</configuration>
关键配置说明:
mapUnderscoreToCamelCase:开启数据库下划线命名到Java驼峰命名的自动转换typeAliases:配置实体类包路径,避免写全限定类名environments:配置开发环境数据源
3.2 逆向工程核心配置
generatorConfig.xml是逆向工程的核心配置文件,每个配置项都直接影响生成结果:
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-config_1_0.dtd">
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<!-- 防止生成的代码中有注释 -->
<commentGenerator>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- 数据库连接配置 -->
<jdbcConnection
driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis?useSSL=false"
userId="root"
password="123456">
</jdbcConnection>
<!-- Java实体类生成配置 -->
<javaModelGenerator
targetPackage="com.baidu.mybatis.pojo"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- XML映射文件生成配置 -->
<sqlMapGenerator
targetPackage="mapper"
targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- Mapper接口生成配置 -->
<javaClientGenerator
type="XMLMAPPER"
targetPackage="com.baidu.mybatis.mapper"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 表配置 -->
<table tableName="employee" domainObjectName="Employee">
<generatedKey column="id" sqlStatement="JDBC" identity="true"/>
</table>
</context>
</generatorConfiguration>
4. 执行与结果分析
4.1 执行生成流程
在IDEA中执行逆向工程的两种方式:
- 通过Maven面板找到mybatis-generator插件,双击执行
- 命令行执行:
mvn mybatis-generator:generate
执行成功后控制台会输出类似日志:
code复制[INFO] table:employee生成成功
[INFO] table:dept生成成功
[INFO] 生成完成,耗时:2.3s
4.2 生成结果解析
逆向工程会生成三类核心文件:
- 实体类(Employee.java):
java复制package com.baidu.mybatis.pojo;
public class Employee {
private Integer id;
private String empName;
private Integer age;
private String gender;
private Integer deptId;
// getter/setter省略
}
- Mapper接口(EmployeeMapper.java):
java复制package com.baidu.mybatis.mapper;
public interface EmployeeMapper {
int deleteByPrimaryKey(Integer id);
int insert(Employee record);
Employee selectByPrimaryKey(Integer id);
List<Employee> selectAll();
int updateByPrimaryKey(Employee record);
}
- XML映射文件(EmployeeMapper.xml):
xml复制<mapper namespace="com.baidu.mybatis.mapper.EmployeeMapper">
<resultMap id="BaseResultMap" type="Employee">
<id column="id" property="id" />
<result column="emp_name" property="empName" />
<result column="age" property="age" />
<result column="gender" property="gender" />
<result column="dept_id" property="deptId" />
</resultMap>
<sql id="Base_Column_List">
id, emp_name, age, gender, dept_id
</sql>
<!-- 各种CRUD语句 -->
</mapper>
5. 高级配置与实战技巧
5.1 生成策略选择
targetRuntime的两个可选值及区别:
| 配置项 | 生成内容 | 适用场景 |
|---|---|---|
| MyBatis3Simple | 基础CRUD方法 | 简单查询需求 |
| MyBatis3 | 增强方法(Example查询、批量操作等) | 复杂业务场景 |
5.2 字段映射控制
通过