目录
#代码生成器插件MybatisPlus(与创建代码生成器类效果相同)
自动生成代码两种方式(1,创建代码生成器类 2,代码生成器插件MybatisPlus)
-
创建maven项目
-
导入SpringBoot起步依赖和项目所需依赖(在pom.xml文件中添加以下内容)
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.cqgcxy</groupId> <artifactId>bmAutio</artifactId> <version>1.0-SNAPSHOT</version> <properties> <swagger.version>3.0.0</swagger.version> <mybatis-plus.version>3.4.2</mybatis-plus.version> <mybatis-plus-generator.version>3.4.1</mybatis-plus-generator.version> <velocity-engine-core.version>2.3</velocity-engine-core.version> </properties> <!--springboot已经写好了一个项目,该项目已经包含了项目需要的很多必要的插件,我们需要继承该项目--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--spring-test相关依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <!-- mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> </dependency> <!--添加Swagger依赖--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>${swagger.version}</version> </dependency> <!--ui更换--> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>swagger-bootstrap-ui</artifactId> <version>1.9.6</version> </dependency> <dependency> <groupId>org.springframework.plugin</groupId> <artifactId>spring-plugin-core</artifactId> <version>2.0.0.RELEASE</version> </dependency> <!-- mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus.version}</version> </dependency> <!-- 逆向工程代码生成器--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>${mybatis-plus-generator.version}</version> </dependency> <!-- 生成器默认模板引擎--> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>${velocity-engine-core.version}</version> </dependency> <!-- Swagger的优化UI大家用这个 knife4j的--> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-ui</artifactId> <version>3.0.3</version> </dependency> </dependencies> </project>
-
数据库准备,并编写SpringBoot的配置文件application.yml
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm_sso
username: root
password: 123456
mybatis-plus:
configuration:
map-underscore-to-camel-case: true #驼峰
#日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
type-aliases-package: com.cqgcxy.entity
4.创建启动类
package com.cqgcxy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//编写启动类,
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);//内嵌了tomcat,启动main时其实是启动了内嵌的tomcat
}
}
代码生成器所需依赖
<properties>
<mybatis-plus-generator.version>3.4.1</mybatis-plus-generator.version>
<velocity-engine-core.version>2.3</velocity-engine-core.version>
</properties><!-- 逆向工程代码生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>${mybatis-plus-generator.version}</version>
</dependency>
<!-- 生成器默认模板引擎-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>${velocity-engine-core.version}</version>
</dependency>
#创建代码生成器类
创建代码生成器类CodeGenerator(与启动类在同一层级的包下)
package com.cqgcxy;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
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 org.apache.commons.lang3.StringUtils;
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("Pep7Chiao");
gc.setOpen(false);
// 设置名字
gc.setControllerName("%sController");
gc.setServiceName("%sService");
gc.setServiceImplName("%sServiceImpl");
gc.setMapperName("%sMapper");
// 设置 resultMap
gc.setBaseResultMap(true);
gc.setBaseColumnList(true);
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/ssm_sso?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
mpg.setDataSource(dsc);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
// 包配置
PackageConfig pc = new PackageConfig();
// pc.setModuleName(scanner("模块名"));
pc.setParent("com.cqgcxy");
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.setInclude(scanner("表名,多个英文逗号分割").split(","));
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new VelocityTemplateEngine());
mpg.execute();
}
}
运行代码生成器类,输入表名
自动生成各层代码效果:
成功生成后找到mapper包下的接口,在其加上@Mapper使其能被扫描到,并实例化
#代码生成器插件MybatisPlus(与创建代码生成器类效果相同)
下载插件(这个插件可能在idea中找不到,可以在网上下载,然后选择后台磁盘安装这个插件包)
成功后点击other,显示有config Database(配置数据库)和Code Generator(代码生成器)
点击config Database:填写你的数据库信息
点击Code Generator:
自定义响应类(结果返回 )
R
package com.cqgcxy.config;
import com.cqgcxy.dto.AccountInfoDTO;
import io.swagger.annotations.*;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
public final class R<T> {
private int code;
private String msg;
private T data;
public R() {
}
public R(int code) {
this.code = code;
this.msg = "";
this.data = null;
}
public R(int code, String msg) {
this.code = code;
this.msg = msg;
this.data = null;
}
public R(int code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public static R Success(Object data) {
return new R( ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(), data);
}
public static R Success(String message, Object data) {
return new R( ResultCodeEnum.SUCCESS.getCode(), message, data);
}
public static R Success() {
return Success("");
}
public static R Failed(String msg) {
return new R( ResultCodeEnum.SYSTEM_EXCEPTION.getCode(), msg);
}
public static R Failed() {
return Failed("Failed");
}
public static R Failed(int code, String msg) {
return new R(code, msg);
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public boolean succeeded() {
return getCode() == ResultCodeEnum.SUCCESS.getCode();
}
public boolean failed() {
return getCode() != ResultCodeEnum.SUCCESS.getCode();
}
}
ResultCodeEnum
package com.cqgcxy.conf.result;
import java.util.ArrayList;
import java.util.List;
public enum ResultCodeEnum {
SUCCESS(100200, "返回成功"),
SYSTEM_EXCEPTION(100500, "系统异常"),
REQUEST_PARAM_ERROR(100401, "请求参数错误"),
REQUEST_OUT_OVERTIME(100408, "请求超时"),
REQUEST_NOT_FOUND(100404, "请求的资源或服务未找到"),
REQUEST_LENGTH_LIMIT(100414, "请求URI太长"),
REQUEST_Format_NOT_SUPPORTED(100415, "请求的格式不支持"),
TOKEN_EXPIRED_REDIRECT(100302, "token过期,请重新登录"),
DUPLICATE_KEY_EXCEPTION(100416, "数据已存在,请勿重复操作"),
INTERFACE_BASIC_INFORMATION_NULL(100001, "接口基本信息为空"),
INTERFACE_NAME_NULL(100002, "接口名称为空"),
INTERFACE_SOURCE_NULL(100005, "接口来源为空"),
INTERFACE_PROTOCOL_NULL(100003, "接口协议为空"),
INTERFACE_NOT_ENABLED(100123, "接口未启用"),
INTERFACE_IP_PORT_NULL(100012, "ip和端口为空"),
INTERFACE_PATH_NULL(100004, "接口路径为空"),
INTERFACE_REQUEST_METHOD_NULL(100008, "接口请求方式"),
REQUEST_TIMEOUT(100014, "超时时限为空"),
REQUEST_PARAM_NULL(100012, "请求参数为空"),
INTERFACE_BASE_NOT_FOUND(100013, "未找到该条接口基本信息"),
INTERFACE_SETTING_NOT_FOUND(100015, "未找到该条接口配置信息"),
INTERFACE_BASE_EXIST(100026, "接口基本信息已存在"),
INTERFACE_BASE_NOT_EXIST(100025, "接口基本信息不存在"),
INTERFACE_SETTING_EXIST(100027, "接口配置信息已存在"),
INTERFACE_SETTING_NOT_EXIST(100028, "接口配置信息不存在"),
INTERFACE_PATH_ILLEGAL(100009, "接口路径不符合规范"),
REQUIRED_FIELD_IS_BLANK(100007, "入参必填字段为空: "),
REQUEST_OUT_API_FAIL(100018, "请求外部接口失败,返回状态码:"),
REQUEST_OUT_GET_OVERTIME(100019, "GET请求外部接口失败,请求超时"),
REQUEST_OUT_POST_OVERTIME(100020, "POST请求外部接口失败,请求超时"),
REQUEST_OUT_PUT_OVERTIME(100021, "PUT请求外部接口失败,请求超时"),
REQUEST_OUT_DELETE_OVERTIME(100022, "DELETE请求外部接口失败,请求超时"),
OTHER_METHODS_NOT_SUPPORTED(100023, "现阶段不支持其他请求方式"),
PARAM_BODY_CONTENT_ERROR(100024, "请求body不是json格式"),
SPLICING_PARAM_IS_FAIL(100031, "拼接GET请求入参出错,请检查参数"),
//登录登出模块
PASSWORD_FAIL(210001, "登录账户或密码错误,请重新输入!"),
INSUFFICIENT_PERMISSIONS(210002, "用户权限不足"),
ACCOUNT_NOT_FIND_RESOURCE(210003, "用户未查询到资源"),
APP_WAS_NOT_QUERIED(210004, "应用id不存在"),
SIGNATURE_VERIFICATION_FAILED(210005, "验签未通过"),
RANDOM_CODE_EXPIRED(210006, "随机码已过期"),
INCORRECT_RANDOM_CODE_VALUE(210007, "随机码值不正确"),
TOKEN_GENERATION_FAILED(210008, "token 生成失败"),
NO_TOKEN_PASSED_IN(210009, "未传入 token"),
NO_USER_FOUND_TOKEN(210009, "token 未查询到用户"),
TOKEN_VERIFICATION_FAILED(210009, "token 校验失败"),
ILLEGAL_TOKEN_INFORMATION(210010, "token 信息不匹配"),
USER_DOES_NOT_EXIST(210011, "用户不存在"),
SIGN_EXPIRED(210012, "sign 已过期"),
PASSWORD_VIOLATION(210013, "密码需包含六位及以上字母和数字"),
//需要跳转登录的code
NO_REFRESH_PASSED_IN(210019, "未传入 token"),
NO_REFRESH_USER_FOUND_TOKEN(210019, "token 未查询到用户"),
REFRESH_VERIFICATION_FAILED(210019, "token 校验失败"),
JSON_CONVERSION_ERROR(210019, "json转换出错"),
REFRESH_GENERATION_FAILED(210019, "token 生成失败"),
NO_LOGIN_STRATEGY(210020, "%s该认证策略不存在"),
NOT_HAVE_ACCOUNT(202003, "账户不存在"),
;
/**
* 枚举值
*/
private final Integer code;
/**
* 枚举描述
*/
private final String message;
/**
* 构造一个<code>LocalCacheEnum</code>枚举对象
*
* @param code 枚举值
* @param message 枚举描述
*/
ResultCodeEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
/**
* 获取全部枚举
*
* @return List<LocalCacheEnum>
*/
public static List<ResultCodeEnum> getAllEnum() {
List<ResultCodeEnum> list = new ArrayList<>();
for (ResultCodeEnum each : values()) {
list.add(each);
}
return list;
}
/**
* 获取全部枚举值
*
* @return List<String>
*/
public static List<Integer> getAllEnumCode() {
List<Integer> list = new ArrayList<>();
for (ResultCodeEnum each : values()) {
list.add(each.code);
}
return list;
}
public Integer getCode() {
return code;
}
public String getMessage() {
return message;
}
public <T> R<T> result() {
return new R(getCode(), getMessage());
}
public <T> R<T> result(String message) {
return new R(getCode(), message);
}
/**
* 将返回码标准的信息 填充到message里面,message必须包含一个%s
*/
public <T> R<T> resultFillingMessage(String message) {
return new R(getCode(), String.format(message, getMessage()));
}
/**
* 将message添加到返回码标准的信息后面 再返回{@link R}
*/
public <T> R<T> resultAppendMessage(String message) {
return new R(getCode(), getMessage() + message);
}
}
到此各层代码已大致完成,然后在controller层完善功能实现代码,运行启动类
@RestController @Api(tags = {"人员信息"}) public class AccountInfoController { @Autowired private AccountInfoService accountInfoService; @GetMapping("/getById/{account}") @ApiOperation("根据账号查询人员信息") @ApiResponses({@ApiResponse( code = 100200, message = "OK" ), @ApiResponse( code = 202001, message = "账号不存在" ), @ApiResponse( code = 202002, message = "密码解码失败" )}) public R<AccountInfo> getById( @ApiParam(value = "要查询的账号", required = true, example = "1") @PathVariable String account) { return R.Success(accountInfoService.getById(account)); } @PostMapping("/add") @ApiOperation("新增人员信息") public ResponseEntity<String> add(@Valid @RequestBody AccountInfoDTO accountInfoDTO) { AccountInfo accountInfo = new AccountInfo(); BeanUtils.copyProperties(accountInfoDTO, accountInfo); accountInfoService.save(accountInfo); return ResponseEntity.ok("Account information added successfully"); } @GetMapping("/getAccountInfoByAccount/{account}") @ApiOperation("根据账号进行查询") public ResponseEntity<AccountInfo> getAccountInfoByAccount(@PathVariable("account") @ApiParam("账号") String account) { AccountInfo accountInfo = accountInfoService.getById(account); if (accountInfo != null) { return ResponseEntity.ok(accountInfo); } else { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null); } } }