一.简介
MyBatis-Plus(简称 MP)是MyBatis 的增强工具,MyBatis-Plus的出现是为了简化我们的开发,提高开发效率。
二.在IDEA中基于SpringBoot整合Mybatis-Plus
1.新建一个Maven工程
如图,此处不过多赘述相关创建细节
2.在pom.xml中导入相关依赖
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<swagger.version>3.0.0</swagger.version>
<mybatis-plus.version>3.4.2</mybatis-plus.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<version>2.0.5.RELEASE</version>
<artifactId>spring-boot-starter-parent</artifactId>
</parent>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.9.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.0.5.RELEASE</version>
<!-- <scope>test</scope>-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>true</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>org.springframework.plugin</groupId>
<artifactId>spring-plugin-core</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
</plugin>
</plugins>
</build>
3.创建并配置application.yml文件
#数据库连接
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql:///ssm?characterEncoding=utf-8
username: root
password: 1234
#别名
mybatis-plus:
type-aliases-package: com.cqgcxy.entity
configuration:
map-underscore-to-camel-case: true
#日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
!!!!这里注意修改成自己的数据库连接
4.在com.cqgcxy.entity包下新建AccountInfo实体类
这里需要用到数据库中的表
创建account_info表
CREATE TABLE `account_info` (
`account` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '账户名',
`username` varchar(255) COLLATE utf8mb4_bin DEFAULT 'r' COMMENT '用户名',
`password` varchar(255) COLLATE utf8mb4_bin DEFAULT '001' COMMENT '密码',
PRIMARY KEY (`account`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='账户信息';
表中数据
account | username | password |
12345 | 张三 | 567890 |
admin | admin | 9cbf8a4dcb8e30682b927f352d6559a0 |
pep | 佩普 | 9cbf8a4dcb8e30682b927f352d6559a0 |
package com.cqgcxy.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
@Data
public class AccountInfo {
@TableId(value = "account", type = IdType.ASSIGN_ID)
private String account;
private String userName;
private String password;
}
5 .自定义响应类
在com.cqgcxy.config.result下创建R和ResultCodeEnum类由于结果返回
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);
}
}
R
package com.cqgcxy.conf.result;
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();
}
}
6.在com.cqgcxy.mapper下新建AccountInfoMapper接口
package com.cqgcxy.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cqgcxy.entity.AccountInfo;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface AccountInfoMapper extends BaseMapper<AccountInfo> {
}
7.在com.cqgcxy.service下新建接口AccountInfoService和接口实现类AccountInfoServiceImpl
AccountInfoService
package com.cqgcxy.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cqgcxy.entity.AccountInfo;
public interface AccountInfoService extends IService<AccountInfo> {
}
AccountInfoServiceImpl
package com.cqgcxy.service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cqgcxy.entity.AccountInfo;
import com.cqgcxy.mapper.AccountInfoMapper;
import org.springframework.stereotype.Service;
@Service
public class AccountInfoServiceImpl extends ServiceImpl<AccountInfoMapper, AccountInfo> implements AccountInfoService {
}
8.在com.cqgcxy.controller
package com.cqgcxy.controller;
import com.cqgcxy.config.result.R;
import com.cqgcxy.entity.AccountInfo;
import com.cqgcxy.service.AccountInfoService;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Api(value = "积分等级管理",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));
}
}