[TOC]
1、前言
俗话说:工欲善其事,必先利其器。
我们在使用springBoot
开发项目的,刚开始的时候,肯定会手动去创建Contoller
、entity
、
、Service
、ServiceImpl
、Mapper
甚至 xml
文件,手动效率实在是慢。
这里介绍,如何去利用代码生成器,帮我们去自动生成各个模块代码;
MyBatis-Plus
的代码生成器,通过 AutoGenerator
可以快速生成 Entity、Mapper、Mapper XML、Service、Controller
等各个模块的代码,极大的提升了开发效率。
效果预览:
代码预览
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项目我就不再多说了,可以参考以下:
引入 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();
}
}
复制代码
第一步:修改为你的数据源
第二步:修改包
第三步:执行 main 方法
这里输入的表名,必须是你数据库真实存在的表,否则不生效;
5、代码展示
以job表
为例:
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);
}
}
复制代码
添加结果如下:
测试成功;
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);
}
}
复制代码