Mybatis代码生成器是一种自动化工具,用于自动生成Mybatis所需的Mapper接口、XML映射文件、实体类等代码,极大地提高了开发效率。本文将详细介绍Mybatis代码生成器的安装、配置和使用方法,帮助开发者快速上手。
Mybatis代码生成器简介与安装Mybatis代码生成器是一种自动化工具,用于自动生成Mybatis的Mapper接口、XML映射文件、实体类等代码。它极大地提高了开发效率,特别是在处理与数据库交互的代码时。本教程将详细介绍如何安装和使用Mybatis代码生成器。
Mybatis代码生成器简介
Mybatis代码生成器主要是通过读取数据库的表结构信息,自动生成Mybatis所需要的Java代码文件。生成的代码包括:
- Mapper接口
- XML映射文件
- 实体类
- 枚举类型
- 构造器工厂
- 查询类
安装Mybatis代码生成器前,请确保已经安装了Java开发环境和Maven构建工具。Mybatis代码生成器支持多种数据库,例如MySQL、Oracle、SQL Server等。
Mybatis代码生成器安装
Mybatis代码生成器可以通过Maven依赖引入。在项目中添加以下依赖:
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-generator</artifactId>
<version>1.3.3</version>
</dependency>
``
#### 配置文件
在项目的`src/main/resources`目录下创建`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">
<!-- 数据库驱动属性 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mydatabase"
userId="root"
password="password"/>
<!-- Generator属性 -->
<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="t_user" domainObjectName="User"/>
<table tableName="t_role" domainObjectName="Role"/>
</context>
</generatorConfiguration>
``
#### 运行代码生成器
在项目的`pom.xml`中配置Maven插件,用于执行代码生成器。
```xml
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-generator</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
``
运行`mvn mybatis-generator:generate`命令,即可生成所需的代码。
## 使用Mybatis代码生成器生成代码
使用Mybatis代码生成器生成代码的基本步骤如下:
1. **创建配置文件**。在`src/main/resources`目录下创建`generatorConfig.xml`文件,并配置数据库连接信息、输出路径和数据库表信息。
2. **配置Maven插件**。在`pom.xml`文件中添加Mybatis代码生成器的Maven插件配置。
3. **运行代码生成器**。执行`mvn mybatis-generator:generate`命令,生成所需的代码文件。
生成的代码文件包括:
- **接口文件**:如`UserMapper.java`,定义了数据库操作的接口。
- **XML文件**:如`UserMapper.xml`,包含SQL语句和映射配置。
- **实体类**:如`User.java`,表示数据库表中的记录。
### 示例代码
假设数据库中有一个`users`表,表结构如下:
```sql
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(255),
email VARCHAR(255),
age INT
);
生成的代码示例如下:
UserMapper.java
package com.example.mapper;
import com.example.model.User;
import java.util.List;
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);
List<User> selectAll();
}
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" jdbcType="INTEGER" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="email" jdbcType="VARCHAR" property="email" />
<result column="age" jdbcType="INTEGER" property="age" />
</resultMap>
<sql id="Base_Column_List">
id, name, email, age
</sql>
<select id="selectAll" resultMap="BaseResultMap">
SELECT
<if test="columnList != null">
${columnList}
</if>
<if test="columnList == null">
<include refid="Base_Column_List" />
</if>
FROM users
</select>
</mapper>
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;
}
}
``
## 配置Mybatis代码生成器
配置Mybatis代码生成器主要通过修改`generatorConfig.xml`文件中的相关配置项。常见的配置项包括:
### 数据库连接信息
配置数据库的连接驱动、URL、用户名和密码。
```xml
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mydatabase"
userId="root"
password="password"/>
输出路径
配置生成代码的输出路径,包括Java模型类、SQL映射文件和Mapper接口。
<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"/>
数据库表映射
配置需要生成代码的数据库表名和对应的Java对象名称。
<table tableName="t_user" domainObjectName="User"/>
<table tableName="t_role" domainObjectName="Role"/>
其他配置选项
还可以配置注释、字段映射等高级选项。
代码生成器的常见问题及解决方法问题1:生成的代码不更新
如果生成的代码没有更新,可能是由于以下原因:
- 配置文件中
overwrite
属性设置为false
:确保配置文件中<configuration>
标签下的overwrite
属性设置为true
。 - 缓存问题:清理Maven的缓存,重新构建项目。执行
mvn clean install
命令。
问题2:生成的实体类缺少注解
有些情况下,生成的实体类可能缺少特定的注解,如@Table
、@Column
等。可以手动添加这些注解,或修改生成器配置文件,添加注解生成。
问题3:生成的Mapper接口缺少方法
如果生成的Mapper接口中缺少某些方法,可以通过修改配置文件中的<table>
标签,添加<generatedKey>
等子标签,指定键生成方式。
问题4:生成的XML文件中的SQL语句不正确
如果生成的XML文件中的SQL语句不正确,可以检查数据库表的字段名是否正确,或手动修改生成的XML文件。
问题5:生成的代码路径错误
如果生成的代码路径错误,可以检查配置文件中<javaModelGenerator>
、<sqlMapGenerator>
、<javaClientGenerator>
标签中的targetPackage
和targetProject
属性是否设置正确。
自定义生成器
可以通过继承MybatisGenerator
类,自定义生成器类,实现更复杂的功能。例如,处理数据库方言、自定义生成器逻辑等。
import tk.mybatis.mapper.generator.MapperGenerator;
public class CustomMybatisGenerator extends MapperGenerator {
public CustomMybatisGenerator(Configuration configuration) {
super(configuration);
}
// 自定义生成逻辑
@Override
public void generateModels() {
super.generateModels();
// 自定义处理逻辑
}
}
静态代码生成
静态代码生成是指在项目构建时生成代码,而不用每次启动项目时生成。通过Maven插件,可以在项目构建时生成代码。
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
</configuration>
<executions>
<execution>
<id>Generate Mybatis Mapper XML</id>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-generator</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
动态代码生成
动态代码生成是指在运行时生成代码,这种方式适用于需要动态生成代码的场景。可以通过反射或字节码生成库实现。
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.InputStream;
import java.util.ArrayList;
import java.util.List;
public class DynamicCodeGenerator {
public void generateCode() throws Exception {
InputStream is = getClass().getResourceAsStream("/generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(new ArrayList<String>());
Configuration config = cp.parseConfiguration(is);
DefaultShellCallback callback = new DefaultShellCallback(true);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, null);
myBatisGenerator.generate(null);
}
}
代码生成器的灵活性
可以通过配置文件灵活地控制生成的代码,例如,生成特定的字段、方法等。还可以通过自定义插件,扩展生成器的功能。
代码生成器的性能优化
生成器生成代码的过程可能比较耗时,可以通过优化数据库查询、并行生成代码等方式提高性能。
实践案例:通过Mybatis代码生成器快速搭建项目本节将通过一个实际案例,展示如何使用Mybatis代码生成器快速搭建项目。
准备工作
假设有一个数据库mydatabase
,包含以下两个表:
users
:用户表roles
:角色表
表结构如下:
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(255),
email VARCHAR(255),
age INT
);
CREATE TABLE roles (
id INT PRIMARY KEY,
name VARCHAR(255)
);
创建项目
创建一个新的Maven项目,添加必要的依赖,包括Mybatis、Mybatis代码生成器等。
配置generatorConfig.xml
在src/main/resources
目录下创建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-config_1_0.dtd">
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<!-- 数据库驱动属性 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mydatabase"
userId="root"
password="password"/>
<!-- Generator属性 -->
<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="users" domainObjectName="User"/>
<table tableName="roles" domainObjectName="Role"/>
</context>
</generatorConfiguration>
配置Maven插件
在pom.xml
文件中添加Mybatis代码生成器的Maven插件配置。
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-generator</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
运行代码生成器
执行mvn mybatis-generator:generate
命令,生成所需的代码文件。
编写业务逻辑
根据生成的代码,编写业务逻辑。例如,创建UserService类,实现用户相关的业务逻辑。
package com.example.service;
import com.example.mapper.UserMapper;
import com.example.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> getAllUsers() {
return userMapper.selectAll();
}
public User getUserById(Integer id) {
return userMapper.selectByPrimaryKey(id);
}
public void addUser(User user) {
userMapper.insertSelective(user);
}
public void updateUser(User user) {
userMapper.updateByPrimaryKeySelective(user);
}
public void deleteUser(Integer id) {
userMapper.deleteByPrimaryKey(id);
}
}
编写测试代码
编写测试代码,测试业务逻辑是否正确。
package com.example.test;
import com.example.mapper.UserMapper;
import com.example.model.User;
import com.example.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void testGetAllUsers() {
List<User> users = userService.getAllUsers();
System.out.println(users);
}
@Test
public void testAddUser() {
User user = new User();
user.setName("Tom");
user.setEmail("tom@example.com");
user.setAge(25);
userService.addUser(user);
User addedUser = userService.getUserById(user.getId());
System.out.println(addedUser);
}
@Test
public void testUpdateUser() {
User user = userService.getUserById(1);
user.setName("Jerry");
userService.updateUser(user);
User updatedUser = userService.getUserById(1);
System.out.println(updatedUser);
}
@Test
public void testDeleteUser() {
userService.deleteUser(1);
}
}
共同学习,写下你的评论
评论加载中...
作者其他优质文章