![f7c33a4f45344fcb397d609f0c562246.png](https://img-blog.csdnimg.cn/img_convert/f7c33a4f45344fcb397d609f0c562246.png)
- 1、前言
- 2、安装依赖
- 3、配置
- 4、生成器代码
- 5、代码展示
- 6、代码测试
- 6.1 添加工作
- 6.2 其余操作
1、前言
俗话说:工欲善其事,必先利其器。
我们在使用springBoot
开发项目的,刚开始的时候,肯定会手动去创建Contoller
、entity
、
、Service
、ServiceImpl
、Mapper
甚至 xml
文件,手动效率实在是慢。
这里介绍,如何去利用代码生成器,帮我们去自动生成各个模块代码;
![8eadfe868bf26044b1ab60ee5b8ae412.png](https://img-blog.csdnimg.cn/img_convert/8eadfe868bf26044b1ab60ee5b8ae412.png)
)
MyBatis-Plus
的代码生成器,通过 AutoGenerator
可以快速生成 Entity、Mapper、Mapper XML、Service、Controller
等各个模块的代码,极大的提升了开发效率。
❝ 效果预览:
❞
![3f62c94442f18e0f49b471ab25b3cc75.png](https://img-blog.csdnimg.cn/img_convert/3f62c94442f18e0f49b471ab25b3cc75.png)
❝ 代码预览
❞
package com.scaffold.test.base;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class CodeGenerator {
/**
* <p>
* 读取控制台内容
* </p>
*/
public static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("请输入" + tip + ":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotEmpty(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("alex wong");
gc.setOpen(false);
// 设置名字
gc.setControllerName("%sController");
gc.setServiceName("%sService");
gc.setServiceImplName("%sServiceImpl");
gc.setMapperName("%sMapper");
// 设置 resultMap
gc.setBaseResultMap(true);
gc.setBaseColumnList(true);
// gc.setFileOverride(true);
// gc.setSwagger2(true); 实体属性 Swagger2 注解
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("admin");
dsc.setPassword("你的mysql密码");
mpg.setDataSource(dsc);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
// 包配置
PackageConfig pc = new PackageConfig();
// pc.setModuleName(scanner("模块名"));
pc.setParent("com.scaffold.test");
mpg.setPackageInfo(pc);
// 如果模板引擎是 velocity
String templatePath = "/templates/mapper.xml.vm";
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setXml(null);
mpg.setTemplate(templateConfig);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
// 写于父类中的公共字段
// strategy.setSuperEntityColumns("id");
strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new VelocityTemplateEngine());
mpg.execute();,
}
}
2、安装依赖
初始一个spring boot项目我就不再多说了,可以参考以下:
![6ee7f362851b9be80d74011c38e9abd3.png](https://img-blog.csdnimg.cn/img_convert/6ee7f362851b9be80d74011c38e9abd3.png)
引入 spring-boot-starter
、spring-boot-starter-test
、mybatis-plus-boot-starter
、lombok
、mysql-connector
依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- lombok 简化代码-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- mybatis-plus启动器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<!-- mysql jdbc -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.2</version>
</dependency>
<!-- 生成器默认版本依赖 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
</dependencies>
3、配置
在 application.yml
配置文件中添加mysql数据库的相关配置
server:
port: 9002
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test
username: admin
password: ************
logging:
level:
root: warn
com.scaffold.test.mapper: trace
4、生成器代码
新建 com.scaffold.test.base.CodeGenerator 类
package com.scaffold.test.base;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class CodeGenerator {
/**
* <p>
* 读取控制台内容
* </p>
*/
public static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("请输入" + tip + ":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotEmpty(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("alex wong");
gc.setOpen(false);
// 设置名字
gc.setControllerName("%sController");
gc.setServiceName("%sService");
gc.setServiceImplName("%sServiceImpl");
gc.setMapperName("%sMapper");
// 设置 resultMap
gc.setBaseResultMap(true);
gc.setBaseColumnList(true);
// gc.setFileOverride(true);
// gc.setSwagger2(true); 实体属性 Swagger2 注解
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("admin");
dsc.setPassword("**********");
mpg.setDataSource(dsc);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
// 包配置
PackageConfig pc = new PackageConfig();
// pc.setModuleName(scanner("模块名"));
pc.setParent("com.scaffold.test");
mpg.setPackageInfo(pc);
// 如果模板引擎是 velocity
String templatePath = "/templates/mapper.xml.vm";
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setXml(null);
mpg.setTemplate(templateConfig);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
// 写于父类中的公共字段
// strategy.setSuperEntityColumns("id");
strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new VelocityTemplateEngine());
mpg.execute();
}
}
❝ 第一步:修改为你的数据源
❞
![e8df2c35156a3c7546f65b9922a0acd5.png](https://img-blog.csdnimg.cn/img_convert/e8df2c35156a3c7546f65b9922a0acd5.png)
❝ 第二步:修改包
❞
![745eab723121476a894b853dca30be40.png](https://img-blog.csdnimg.cn/img_convert/745eab723121476a894b853dca30be40.png)
❝ 第三步:执行 main 方法
❞
![a256817484e414b224815d10d02f7955.png](https://img-blog.csdnimg.cn/img_convert/a256817484e414b224815d10d02f7955.png)
这里输入的表名,必须是你数据库真实存在的表,否则不生效;
5、代码展示
以job表
为例:
![c6a626e373091dfa17d60662014b1605.png](https://img-blog.csdnimg.cn/img_convert/c6a626e373091dfa17d60662014b1605.png)
❝ jobController
❞
package com.scaffold.test.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 前端控制器
* </p>
*
* @author alex wong
* @since 2020-06-14
*/
@RestController
@RequestMapping("/job")
public class JobController {
}
❝ job entity 实体类
❞
package com.scaffold.test.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
*
* </p>
*
* @author alex wong
* @since 2020-06-14
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class Job implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String name;
private Integer age;
private String position;
}
❝ Job mapper
❞
package com.scaffold.test.mapper;
import com.scaffold.test.entity.Job;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author alex wong
* @since 2020-06-14
*/
public interface JobMapper extends BaseMapper<Job> {
}
❝ Job Service 服务类接口
❞
package com.scaffold.test.service;
import com.scaffold.test.entity.Job;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 服务类
* </p>
*
* @author alex wong
* @since 2020-06-14
*/
public interface JobService extends IService<Job> {
}
❝ Job ServiceImpl 服务类的实现方法
❞
package com.scaffold.test.service.impl;
import com.scaffold.test.entity.Job;
import com.scaffold.test.mapper.JobMapper;
import com.scaffold.test.service.JobService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 服务实现类
* </p>
*
* @author alex wong
* @since 2020-06-14
*/
@Service
public class JobServiceImpl extends ServiceImpl<JobMapper, Job> implements JobService {
}
❝ Mapper 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.scaffold.test.mapper.JobMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.scaffold.test.entity.Job">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="age" property="age" />
<result column="position" property="position" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, name, age, position
</sql>
</mapper>
6、代码测试
我们依然以 job 表为例,虽然单表操作执行,一般不用Mapper XML,可以使用Mybatis-plus的CRUD , 不过 我们接下来依然是用XML来做数据库操作。
6.1 添加工作
❝ 1、Mapper XML 增加sql语句 mapper/JobMapper.xml
❞
<insert id="insertJob">
insert into job
(name, age, position)
values
(#{name}, #{age}, #{position})
</insert>
❝ 2、com.scaffold.test.mapper.JobMapper
❞
package com.scaffold.test.mapper;
import com.scaffold.test.entity.Job;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.beans.factory.annotation.Autowired;
/**
* <p>
* Mapper 接口
* </p>
*
* @author alex wong
* @since 2020-06-14
*/
public interface JobMapper extends BaseMapper<Job> {
public void insertJob(Job job);
}
❝ 3、增加Service接口和实现方法
❞
❝ Service接口: com.scaffold.test.service.JobService
❞
package com.scaffold.test.service;
import com.scaffold.test.entity.Job;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 服务类
* </p>
*
* @author alex wong
* @since 2020-06-14
*/
public interface JobService extends IService<Job> {
public String addJob(Job job);
}
❝ JobServiceImpl接口实现方法:com.scaffold.test.service.impl.JobServiceImpl
❞
package com.scaffold.test.service.impl;
import com.scaffold.test.entity.Job;
import com.scaffold.test.mapper.JobMapper;
import com.scaffold.test.service.JobService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* <p>
* 服务实现类
* </p>
*
* @author alex wong
* @since 2020-06-14
*/
@Service
public class JobServiceImpl extends ServiceImpl<JobMapper, Job> implements JobService {
@Autowired
private JobMapper jobMapper;
@Override
public String addJob(Job job) {
jobMapper.insertJob(job);
return "添加成功";
}
}
❝ JobController控制层:com.scaffold.test.controller.JobController
❞
package com.scaffold.test.controller;
import com.scaffold.test.entity.Job;
import com.scaffold.test.service.JobService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 前端控制器
* </p>
*
* @author alex wong
* @since 2020-06-14
*/
@RestController
@RequestMapping("/job")
public class JobController {
@Autowired
private JobService jobService;
@PostMapping("/add")
public String add(){
Job job = new Job();
job.setAge(20);
job.setPosition("总经理");
job.setName("汪汪");
return jobService.addJob(job);
}
}
添加结果如下:
![0765a1965fa5b39f5f8aff7c4337994a.png](https://img-blog.csdnimg.cn/img_convert/0765a1965fa5b39f5f8aff7c4337994a.png)
![ed6bff235c448edd2b982d14f0919244.png](https://img-blog.csdnimg.cn/img_convert/ed6bff235c448edd2b982d14f0919244.png)
测试成功;
6.2 其余操作
其余增删改查操作不再赘述:
代码如下:
❝ src/main/resources/mapper/JobMapper.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.scaffold.test.mapper.JobMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.scaffold.test.entity.Job">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<result column="position" property="position"/>
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, name, age, position
</sql>
<insert id="insertJob">
insert into job
(name, age, position)
values
(#{name}, #{age}, #{position})
</insert>
<select id="selectAll" resultMap="BaseResultMap">
select * from job
</select>
<update id="updateJob">
update job set
name = #{name},
age = #{age},
position = #{position}
</update>
<delete id="deleteJobById">
delete from job
where id = #{id}
</delete>
</mapper>
❝ com.scaffold.test.mapper.JobMapper
❞
package com.scaffold.test.mapper;
import com.scaffold.test.entity.Job;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
/**
* <p>
* Mapper 接口
* </p>
*
* @author alex wong
* @since 2020-06-14
*/
public interface JobMapper extends BaseMapper<Job> {
public void insertJob(Job job);
public List<Job> selectAll();
public void updateJob(Job job);
public void deleteJobById(int id);
}
❝ com.scaffold.test.service.JobService
❞
package com.scaffold.test.service;
import com.scaffold.test.entity.Job;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
* 服务类
* </p>
*
* @author alex wong
* @since 2020-06-14
*/
public interface JobService extends IService<Job> {
public String addJob(Job job);
public List<Job> findAll();
public String updateJob(Job job);
public String deleteJobById(int id);
}
❝ com.scaffold.test.service.impl.JobServiceImpl
❞
package com.scaffold.test.service.impl;
import com.scaffold.test.entity.Job;
import com.scaffold.test.mapper.JobMapper;
import com.scaffold.test.service.JobService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 服务实现类
* </p>
*
* @author alex wong
* @since 2020-06-14
*/
@Service
public class JobServiceImpl extends ServiceImpl<JobMapper, Job> implements JobService {
@Autowired
private JobMapper jobMapper;
@Override
public String addJob(Job job) {
jobMapper.insertJob(job);
return "添加成功";
}
@Override
public List<Job> findAll() {
return jobMapper.selectAll();
}
@Override
public String updateJob(Job job) {
jobMapper.updateJob(job);
return "更新成功";
}
@Override
public String deleteJobById(int id) {
jobMapper.deleteJobById(id);
return "删除成功";
}
}
❝ com.scaffold.test.controller.JobController
❞
package com.scaffold.test.controller;
import com.scaffold.test.entity.Job;
import com.scaffold.test.service.JobService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* <p>
* 前端控制器
* </p>
*
* @author alex wong
* @since 2020-06-14
*/
@RestController
@RequestMapping("/job")
public class JobController {
@Autowired
private JobService jobService;
// 添加
@PostMapping("/add")
public String add() {
Job job = new Job();
job.setAge(20);
job.setPosition("总经理");
job.setName("汪汪");
return jobService.addJob(job);
}
// 查询所有
@GetMapping("/list")
public List<Job> getList() {
return jobService.findAll();
}
// 更新
@PostMapping("/update")
public String update() {
Job job = new Job();
job.setAge(20);
// 汪汪被降职
job.setPosition("总经理助理");
job.setName("汪汪");
return jobService.updateJob(job);
}
// 删除
@PostMapping("/delete")
public String delete(@RequestParam int id) {
// 汪汪被删除
return jobService.deleteJobById(id);
}
}