🍀 前言
博客地址:
👋 简介
上一章以及介绍了Mybatis-Plus基础配置和数据库表的创建,本章节主要介绍下Mybatis-Plus代码生成器的功能。
📖 正文
1 Generator的配置依赖
xml
<!--mybatis plus代码生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.2</version>
</dependency>
<!--模板引擎-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
上面两个依赖,一个是代码生成器需要的依赖,另外一个是一个模板引擎,如果没有这个模板引擎,会在生成代码的时候导致失败
2 Generator的代码生成
编写测试类,编写代码生成器的代码,然后执行生成需要的文件
java
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.sql.DataSource;
import java.util.Collections;
@SpringBootTest
public class GeneratorTest {
// 作者
private static String AUTHOR = "power";
// 生成文件目录
private static String OUTPUT_DIR = "D:\\mpdemo";
// 生成xml文件目录
private static String XML_DIR = "D:\\mpdemo\\mapper";
// 数据库表名
private static String[] TABLES = {"tb_user", "tb_role", "tb_menu", "tb_user_role", "tb_role_menu"};
// 项目路径
private static String TARGET_PACKAGE = "com.power.mpdemo";
@Autowired
private DataSource dataSource;
@Test
void contextLoads() {
//使用上面自动注入的dataSource创建FastAutoGenerator
FastAutoGenerator.create(new DataSourceConfig.Builder(dataSource))
.globalConfig(builder -> {
builder.fileOverride() // 覆盖已生成文件
.author(AUTHOR)// 设置作者
.enableSwagger() // 开启swagger模式自动添加swagger注解
.outputDir(OUTPUT_DIR); // 指定输出目录
})
.packageConfig(builder -> {
builder.parent(TARGET_PACKAGE) // 设置父包名
// .moduleName("system") // 设置父包模块名
.pathInfo(Collections.singletonMap(OutputFile.xml, XML_DIR)); // 设置mapperXml生成路径
})
.strategyConfig(builder -> {
builder.addInclude(TABLES) // 设置需要生成的表名;
.addTablePrefix("tb_"); // 设置过滤表前缀
})
//这里可能会报错找不到Freemarker类,就需要引入下面的pom.xml的freemarker引擎
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
.execute();
}
}
代码执行完毕,会在本地D:\
下生成两个文件夹
3 修改项目代码
3.1 Mapper映射文件
该文件可以配置sql,一般简单的sql可以通过Mybatis-Plus来实现,如果有一些特别复杂的sql,我们可以通过mapper映射文件来写sql,这里我们将mapper映射文件放到项目的resource目录下
同时,在application.yml
文件中添加配置
yaml
mybatis-plus:
# 当mapper接口和mapper接口对应的配置文件在不在同目录下,需要进行绑定
mapper-locations: classpath*:/mapper/**/*.xml
3.2 项目代码
将com目录中的文件,和项目目录对应起来,将最顶层文件拷贝到项目中
controller
:目录中存放的都是接口层的代码entity
:目录中存放的为数据库表对应的实体类文件mapper
:目录中存放的是数据层的接口文件service
:目录中存放的是业务逻辑层的接口及接口实现类
4 生成的文件简介
4.1 entity实体类
这里用角色表对应的实体类举例(因为代码较少),生成的代码,我们用lombok
注解修改下,自动生成构造,setter,getter等方法,减少代码冗余度
java
package com.power.mpdemo.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* <p>
* 角色表
* </p>
*
* @author power
* @since 2023-12-21
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@TableName("tb_role")
@ApiModel(value = "Role对象", description = "角色表")
public class Role implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("角色id")
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty("角色名称")
private String roleName;
@ApiModelProperty("角色编码")
private String roleCode;
@ApiModelProperty("描述")
private String description;
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
@ApiModelProperty("更新时间")
private LocalDateTime updateTime;
@ApiModelProperty("删除标记(0:可用 1:已删除)")
private Integer isDeleted;
}
注解介绍(Mybatis-Plus相关):
@TableName("tb_role")
:标识实体类对应的表,如果类名和表名相同,可以不加@TableId(value = "id", type = IdType.AUTO)
:声明实体类中的主键对应的字段,类型为自增长
其他注解为swagger和lombok注解,这里不过多介绍
4.2 mapper接口
Mybatis-Plus提供的接口BaseMapper
,本身已经实现了很多CRUD的操作,我们生成的mapper通过继承Mybatis-Plus提供的这个接口,就等于已经实现了这些方法
java
package com.power.mpdemo.mapper;
import com.power.mpdemo.entity.Role;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 角色表 Mapper 接口
* </p>
*
* @author power
* @since 2023-12-21
*/
public interface RoleMapper extends BaseMapper<Role> {
}
4.3 service接口
同4.2一样,Mybatis-Plus在业务逻辑层也实现了很多接口供我们进行CRUD,具体的方法可以通过源码,或者Mybatis-Plus官网进行查看,这里不过多介绍
java
package com.power.mpdemo.service;
import com.power.mpdemo.entity.Role;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 角色表 服务类
* </p>
*
* @author power
* @since 2023-12-21
*/
public interface IRoleService extends IService<Role> {
}
4.4 service实现类
在service目录下,还有一个impl的文件夹,里面存放的代码文件都是service接口的实现类,同样的这个实现类一样继承了Mybatis-Plus提供的类,并且实现接口,这里主要作用就是用来实现业务逻辑的
java
package com.power.mpdemo.service.impl;
import com.power.mpdemo.entity.Role;
import com.power.mpdemo.mapper.RoleMapper;
import com.power.mpdemo.service.IRoleService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 角色表 服务实现类
* </p>
*
* @author power
* @since 2023-12-21
*/
@Service
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IRoleService {
}
4.5 controller控制器
这一层为控制层,主要实现API接口,用于前后端进行交互,比如返回内容给前端,接收前端传递过来的参数之类的操作
java
package com.power.mpdemo.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;
/**
* <p>
* 角色表 前端控制器
* </p>
*
* @author power
* @since 2023-12-21
*/
@Controller
@RequestMapping("/role")
public class RoleController {
}
我们这里代码生成器生成的注解为@Controller
,因为我们需要前后端以json的形式进行交互,所以手动修改成@RestController
java
@RestController
@RequestMapping("/role")
public class RoleController {
}
至此,对于代码生成器生成的代码层级结构,已经每一层作用,以及需要修改的地方都已做了基本修改。
✏ 总结
通过Mybatis-Plus
的代码生成器根据数据库表生成对应的实体类、接口、控制器等,节省了编写基础类的时间,将精力更多的放在业务上。