1.豆豆项目搭建之springboot集成mybatis-plus(包含mybatis-plus自动生成基础代码)
·
1.项目版本说明
| 组件 | 版本 | 说明 |
|---|---|---|
| springboot | 2.4.2 | 是为了后面集成cloud2020.0.0 和 cloud-alibaba2021.1 版本 |
| mybatis-plus | 3.4.3.1 |
2.idea 创建springboot项目
2.0 项目整体结构预览

2.1 pom.xml引入pom依赖
<!--springboot-web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.4.2</version>
</dependency>
<!--spring-boot-starter-aop-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>2.4.2</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.1</version>
</dependency>
<!--mybatis plus 代码生成及分页 start-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.4.3.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<!--打印mybatis plus 执行sql-->
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.8.1</version>
</dependency>
<!-- mybatis-plus-generator默认模板引擎依赖 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
<!--swagger-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<!--mybatis plus 代码生成及分页 end-->
<!-- lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<version>1.18.8</version>
</dependency>
2.2 common 包下创建MysqlGenerator类 ,利用main方法生成基础代码
package com.doudou.common;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
/**
* @Date 2021/7/22 13:40
*/
public class MysqlGenerator {
public static void main(String[] args) {
AutoGenerator mpg = new AutoGenerator(); // 代码生成器
GlobalConfig gc = new GlobalConfig(); // 全局配置
//根据项目灵活选择要生成的文件放置的第一级目录
//E:\dubbo-nacos-mybatisplus\dubbo-service-provider\src\main\java\com\douyu\dubbo_Service_Provider\controller
// String projectPath = System.getProperty("user.dir");
String projectPath = "E:/DOUDOU/mybatis-plus-code";
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("hc); // 作者
gc.setOpen(false); //生成代码后是否打开文件夹
gc.setServiceName("%sService"); // 设置Service接口生成名称,这样生成接口前面就不会有 I
gc.setSwagger2(true);//实体属性 Swagger2 注解
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://ip:端口/hczr?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC");
// dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("password");
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName("user_one"); // 模块名称, 这里可以根据不同模块来写
pc.setParent("com.doudou"); // 父包名
mpg.setPackageInfo(pc);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
// 自定义实体父类
//strategy.setSuperControllerClass("com.douyu.controller.BaseController");
//strategy.setSuperEntityClass("com.douyu.entity.BaseEntity");
// strategy.setTablePrefix("sys_");// 此处可以修改为您的表前缀
strategy.setEntityLombokModel(true);
// strategy.setInclude(new String[] { "t_user" }); // 需要生成的表
strategy.setInclude("t_ms_user"); //需要生成代码的表; 如果要生成多个,这里可以传入String[]
// strategy.setTablePrefix(new String[]{"t_"});// 此处可以修改为您的表前缀
// strategy.setExclude(new String[]{"test"}); // 排除生成的表
mpg.setStrategy(strategy);
mpg.execute();
}
}
生成后,本地结构如下图:

2.3 config包配置相关java配置类
2.3.1 mybatis-plus 分页插件配置类:MybatisPlusConfig
package com.doudou.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
public class MybatisPlusConfig {
// 最新版 添加mybatisPlus 分页插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
2.3.2 log 切面配置类:WebLogAspectConfig
package com.doudou.config;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.Arrays;
/**
* weblog切面
*/
@Aspect
@Component
public class WebLogAspectConfig {
public static final Logger log = LoggerFactory.getLogger(WebLogAspectConfig.class);
/**
* 进入方法时间戳
*/
private Long startTime;
/**
* 方法结束时间戳(计时)
*/
private Long endTime;
public WebLogAspectConfig() {
}
/**
* 定义请求日志切入点,其切入点表达式有多种匹配方式,这里是指定路径
*/
@Pointcut("execution(public * com.doudou.controller.*.*(..))")
public void webLogPointcut() {
}
/**
* 前置通知:
* 1. 在执行目标方法之前执行,比如请求接口之前的登录验证;
* 2. 在前置通知中设置请求日志信息,如开始时间,请求参数,注解内容等
*
* @param joinPoint
* @throws Throwable
*/
@Before("webLogPointcut()")
public void doBefore(JoinPoint joinPoint) {
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//打印请求的内容
startTime = System.currentTimeMillis();
log.info("请求开始时间:{}", LocalDateTime.now());
log.info("请求Url : {}", request.getRequestURL().toString());
log.info("请求方式 : {}", request.getMethod());
log.info("请求ip : {}", request.getRemoteAddr());
log.info("请求方法 : {}", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
log.info("请求参数 : {}", Arrays.toString(joinPoint.getArgs()));
}
/**
* 返回通知:
* 1. 在目标方法正常结束之后执行
* 1. 在返回通知中补充请求日志信息,如返回时间,方法耗时,返回值,并且保存日志信息
*
* @param ret
* @throws Throwable
*/
@AfterReturning(returning = "ret", pointcut = "webLogPointcut()")
public void doAfterReturning(Object ret) throws Throwable {
endTime = System.currentTimeMillis();
log.info("请求结束时间:{}", LocalDateTime.now());
log.info("请求耗时:{}", (endTime - startTime));
// 处理完请求,返回内容
log.info("请求返回 : {}", ret);
}
/**
* 异常通知:
* 1. 在目标方法非正常结束,发生异常或者抛出异常时执行
* 1. 在异常通知中设置异常信息,并将其保存
* @param throwable
*/
@AfterThrowing(value = "webLogPointcut()", throwing = "throwable")
public void doAfterThrowing(Throwable throwable) {
// 保存异常日志记录
log.error("发生异常时间:{}", LocalDateTime.now());
log.error("抛出异常:{}", throwable.getMessage());
}
}
2.3.3 swagger java配置类:Swagger2Config
package com.doudou.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* @description swagger2控制器
*/
@Configuration
@EnableSwagger2
public class Swagger2Config {
@Value("${swagger.is.enable}")
private boolean swaggerIsEnable;
/**
* Docket对象包含三个方面信息:
* 1. 整个API的描述信息,即ApiInfo对象包括的信息,这部分信息会在页面上展示。
* 2. 指定生成API文档的包名。
* 3. 指定生成API的路径。
*
* @return docket
*/
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2).enable(swaggerIsEnable)
.apiInfo(apiInfo())
//是否开启 (true 开启 false隐藏。生产环境建议隐藏)
//.enable(false)
.select()
//扫描的路径包,设置basePackage会将包下的所有被@Api标记类的所有方法作为api
.apis(RequestHandlerSelectors.basePackage("com.midea.smart.iot.ota.mgmt.controller"))
//指定路径处理PathSelectors.any()代表所有的路径
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
//设置文档标题(API名称)
.title("user_one:API接口文档")
//文档描述
// .description("接口说明")
//服务条款URL
// .termsOfServiceUrl("http://localhost:8080/")
//版本号
.version("1.0.0")
.build();
}
}
2.4 resources包下 添加项目配置:
2.4.1 appliaction.yml :springboot
server:
port: 7010
spring:
application:
name: user-one
# profiles:
# active: dev
#数据源
datasource:
#driverClassName: com.mysql.cj.jdbc.Driver
#url: jdbc:mysql://106.14.150.2:3306/hczr?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
#添加mybatis-plus执行时打印sql 语句
driverClassName: com.p6spy.engine.spy.P6SpyDriver
url: jdbc:p6spy:mysql://106.14.150.2:3306/hczr?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
username: root
password: Hc200217zr@
hikari:
minimum-idle: 5
maximum-pool-size: 15
auto-commit: true
idle-timeout: 30000
pool-name: DatebookHikariCP
max-lifetime: 1800000
connection-timeout: 10000
connection-test-query: SELECT 1
swagger:
is:
enable: true
2.4.2 spy.properties :mybatis-plus 添加执行sql必要的配置文件
#mybatis-plus 添加执行sql打印
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 设置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前缀
useprefix=true
# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动可多个
#driverlist=org.h2.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2
2.5分页接口测试
1.controller类
package com.doudou.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doudou.entity.TMsUser;
import com.doudou.req.UserListQueryDTO;
import com.doudou.service.TMsUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @since 2021-07-22
*/
@RestController
@RequestMapping("/user_one/tMsUser")
public class TMsUserController {
@Autowired
private TMsUserService userService;
@PostMapping("/getList")
public Object getList(@RequestBody UserListQueryDTO dto) {
return userService.getList(dto);
}
}
2.请求dto类
package com.doudou.req;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.doudou.common.PageQuery;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@ApiModel(value = "用户查询对象",description = "用户查询对象封装")
@Data
public class UserListQueryDTO extends PageQuery {
@ApiModelProperty(value = "用户昵称")
private String nickName;
@ApiModelProperty(value = "用户密码")
private String password;
@ApiModelProperty(value = "用户手机")
private String mobile;
@ApiModelProperty(value = "用户邮箱")
private String email;
@ApiModelProperty(value = "地址")
private String address;
@ApiModelProperty(value = "1未激活 2激活 3禁止")
private Integer accountStatus;
@ApiModelProperty(value = "注册时间")
private LocalDateTime registerTime;
@ApiModelProperty(value = "个性签名")
private String signature;
@ApiModelProperty(value = "头像")
private String profilePicUrl;
@ApiModelProperty(value = "性别")
private Integer sex;
@ApiModelProperty(value = "电话")
private String phone;
@ApiModelProperty(value = "年龄")
private Integer age;
}
package com.doudou.common;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class PageQuery {
public Integer pageSize=10;
public Integer pageIndex = 1;
}
3.services相关类
package com.doudou.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.doudou.entity.TMsUser;
import com.doudou.req.UserListQueryDTO;
/**
* 服务类
*/
public interface TMsUserService extends IService<TMsUser> {
/**
* 条件分页查询
*
* @return
*/
Object getList(UserListQueryDTO dto);
}
package com.doudou.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doudou.entity.TMsUser;
import com.doudou.mapper.TMsUserMapper;
import com.doudou.req.UserListQueryDTO;
import com.doudou.service.TMsUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 服务实现类
* </p>
*/
@Service
public class TMsUserServiceImpl extends ServiceImpl<TMsUserMapper, TMsUser> implements TMsUserService {
@Autowired
private TMsUserMapper userMapper;
/**
* 分页条件查询
*
* @param dto
* @return
*/
@Override
public Object getList(UserListQueryDTO dto) {
//创建page对象
Page<TMsUser> userPage = new Page<>(dto.getPageIndex(),dto.getPageSize());
//构建条件
QueryWrapper<TMsUser> wrapper = new QueryWrapper<>();
//获取传入讲师的条件是否为空
String name = dto.getNickName();
Integer age = dto.getAge();
//多条件组合查询
//判断条件值是否为空,如果不为空拼接条件
if (!StringUtils.isEmpty(name)) {
//构建条件 模糊查询
wrapper.like("nick_name", name);
}
if (null != age) {
//等于
wrapper.eq("age", age);
//大于等于
//wrapper.ge("age",age);
//小于等于
//wrapper.le("age",age);
}
//调用mybatis plus分页方法进行查询
userMapper.selectPage(userPage, wrapper);
//通过Page对象获取分页信息
//long current = page.getCurrent();//当前页
List<TMsUser> records = userPage.getRecords(); //每页的数据 list集合
//long size = eduTeacherPage.getSize(); //每页显示的条数
long total = userPage.getTotal(); //总记录数
long pages = userPage.getPages(); //总页数
boolean pagehasNext = userPage.hasNext(); //下一页
boolean pagehasPrevious = userPage.hasPrevious(); //上一页
return userPage;
}
}
3.测试
3.1 请求接口
localhost:7010/user_one/tMsUser/getList
3.2 请求参数
{
"nickName":"HC",
"age":29,
"pageIndex":1,
"pageSize":12
}
3.3请求返回
本地控制台输出 aop 请求切面log
mysql执行sql语句输出
2021-08-05 17:48:48.222 INFO 43324 --- [nio-7010-exec-1] com.doudou.config.WebLogAspectConfig : 请求开始时间:2021-08-05T17:48:48.222
2021-08-05 17:48:48.223 INFO 43324 --- [nio-7010-exec-1] com.doudou.config.WebLogAspectConfig : 请求Url : http://localhost:7010/user_one/tMsUser/getList
2021-08-05 17:48:48.223 INFO 43324 --- [nio-7010-exec-1] com.doudou.config.WebLogAspectConfig : 请求方式 : POST
2021-08-05 17:48:48.223 INFO 43324 --- [nio-7010-exec-1] com.doudou.config.WebLogAspectConfig : 请求ip : 0:0:0:0:0:0:0:1
2021-08-05 17:48:48.224 INFO 43324 --- [nio-7010-exec-1] com.doudou.config.WebLogAspectConfig : 请求方法 : com.doudou.controller.TMsUserController.getList
2021-08-05 17:48:48.224 INFO 43324 --- [nio-7010-exec-1] com.doudou.config.WebLogAspectConfig : 请求参数 : [UserListQueryDTO(nickName=HC, password=null, mobile=null, email=null, address=null, accountStatus=null, registerTime=null, signature=null, profilePicUrl=null, sex=null, phone=null, age=29)]
2021-08-05 17:48:48.359 INFO 43324 --- [nio-7010-exec-1] com.zaxxer.hikari.HikariDataSource : DatebookHikariCP - Starting...
Consume Time:30 ms 2021-08-05 17:48:49
Execute SQL:SELECT 1
2021-08-05 17:48:49.294 INFO 43324 --- [nio-7010-exec-1] com.zaxxer.hikari.HikariDataSource : DatebookHikariCP - Start completed.
Consume Time:23 ms 2021-08-05 17:48:49
Execute SQL:SELECT COUNT(*) FROM t_ms_user WHERE (nick_name LIKE '%HC%' AND age = 29)
Consume Time:23 ms 2021-08-05 17:48:49
Execute SQL:SELECT id,nick_name,password,mobile,email,address,account_status,register_time,signature,profile_pic_url,sex,phone,age FROM t_ms_user WHERE (nick_name LIKE '%HC%' AND age = 29) LIMIT 12
2021-08-05 17:48:49.373 INFO 43324 --- [nio-7010-exec-1] com.doudou.config.WebLogAspectConfig : 请求结束时间:2021-08-05T17:48:49.373
2021-08-05 17:48:49.373 INFO 43324 --- [nio-7010-exec-1] com.doudou.config.WebLogAspectConfig : 请求耗时:1154
2021-08-05 17:48:49.373 INFO 43324 --- [nio-7010-exec-1] com.doudou.config.WebLogAspectConfig : 请求返回 : com.baomidou.mybatisplus.extension.plugins.pagination.Page@66d34d07
返回body:
{
"records": [
{
"id": 1,
"nickName": "HC",
"password": "123456",
"mobile": "18062731207",
"email": "4649@qq.com",
"address": null,
"accountStatus": 0,
"registerTime": "2021-07-22T14:16:20",
"signature": null,
"profilePicUrl": null,
"sex": null,
"phone": null,
"age": 29
}
],
"total": 1,
"size": 12,
"current": 1,
"orders": [],
"optimizeCountSql": true,
"searchCount": true,
"countId": null,
"maxLimit": null,
"pages": 1
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)