3. 集成Mybatis Plus
3.1 配置基础依赖⚙️
👉首先,项目中会使用到mysql、mybatis-plus、druid数据连接池等等功能,接下来我们就一一讲解一下。
依赖名称 | 依赖描述 | 版本 |
---|---|---|
mysql-connector-java:mysql-connector-java | mysql驱动 | 8.0.29 |
com.alibaba:druid | 阿里巴巴Druid数据库连接池 | 1.2.11 |
com.baomidou:mybatis-plus-boot-starter | mybatis-plus的依赖 | 3.5.2 |
com.baomidou:mybatis-plus-generator | mybatis-plus的自动生成代码插件 | 3.5.2 |
org.apache.velocity:velocity-engine-core | Java 的模板引擎框架,用于代码自动生成 | 2.3 |
org.projectlombok:lombok | 代码简化,getter/setter、构造器编译时生成 | 1.18.24 |
com.alibaba:fastjson | 阿里巴巴Json操作工具类 | 2.0.7 |
完整的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.maple</groupId>
<artifactId>maple-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>maple-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java-version>1.8</java-version>
<lombok-version>1.18.24</lombok-version>
<druid-version>1.2.11</druid-version>
<mybatis-plus-version>3.5.2</mybatis-plus-version>
<velocity-version>2.3</velocity-version>
<fastjson-version>2.0.7</fastjson-version>
<mysql-connector-version>8.0.29</mysql-connector-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</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>
<!-- 引入web相关 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--使用Mysql数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector-version}</version>
</dependency>
<!--使用阿里巴巴druid数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid-version}</version>
</dependency>
<!-- mybatis-plus的依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus-version}</version>
</dependency>
<!-- mybatis-plus的自动生成代码插件 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>${mybatis-plus-version}</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>${velocity-version}</version>
</dependency>
<!--Lombok管理Getter/Setter/log等-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
<version>${lombok-version}</version>
</dependency>
<!-- 处理JSON -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson-version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.2 引入Mysql配置
👉首先我们需要创建一个Mysql数据库maple,字符集选择utf8。这里我们使用的工具是Navicat Premium 11。当然其他工具都是一样,没有特使要求。
👉创建一张usc_user表,当然有很多字段我们可能暂且不需要,暂且保留,sql如下:👇
CREATE TABLE `usc_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`account` varchar(30) DEFAULT NULL COMMENT '用户账号',
`user_name` varchar(30) DEFAULT NULL COMMENT '用户姓名',
`nick_name` varchar(30) DEFAULT NULL COMMENT '用户昵称',
`user_type` varchar(2) DEFAULT '00' COMMENT '用户类型(00系统用户,01小程序用户)',
`email` varchar(50) DEFAULT '' COMMENT '用户邮箱',
`phone` varchar(11) DEFAULT '' COMMENT '手机号码',
`sex` char(1) DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)',
`avatar` varchar(100) DEFAULT '' COMMENT '头像地址',
`salt` varchar(32) DEFAULT NULL COMMENT '用户加密盐值',
`password` varchar(100) DEFAULT '' COMMENT '密码',
`status` char(1) DEFAULT '0' COMMENT '帐号状态(0正常 1停用)',
`create_id` bigint(20) DEFAULT NULL COMMENT '创建人id',
`create_name` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_id` bigint(20) DEFAULT NULL COMMENT '更新人id',
`update_name` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`delete_flag` tinyint(1) DEFAULT '0' COMMENT '删除标志',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用户中心-用户信息表';
👉创建好数据库后,配置我们项目的application.yml文件
server:
port: 6666
spring:
application:
name: maple-admin
# 配置数据库连接
datasource:
# 数据库连接地址及常用配置
url: jdbc:mysql://127.0.0.1:3306/maple?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
# 数据库连接驱动
driverClassName: com.mysql.cj.jdbc.Driver
# 数据库用户
username: root
# 数据库用户密码
password: 123456
# 配置druid数据库连接池---------------------------------------
type: com.alibaba.druid.pool.DruidDataSource
druid:
# 初始化大小,最小,最大
initialSize: 5
minIdle: 5
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 校验SQL,Oracle配置 spring.datasource.validationQuery=SELECT 1 FROM DUAL,如果不配validationQuery项,则下面三项配置无用
validationQuery: SELECT 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
useGlobalDataSourceStat: true
# 配置mybatis-plus的xml和bean的目录
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
configuration:
# 开启驼峰功能
map-underscore-to-camel-case: true
# 日志打印功能
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#逻辑删除配置
global-config:
db-config:
# 逻辑已删除值(默认为 1)
logic-delete-value: 1
# 逻辑未删除值(默认为 0)
logic-not-delete-value: 0
至此,我们的数据库配置已经完成✌。接下来我们配置一下Mybatis-plus。
3.3 引入MyBatis-Plus配置
配置MyBatis-Plus
- MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
- MyBatis-Plus是基于MyBatis框架进一步的封装,增强了MyBatis的功能,只需简单配置,即可快速进行单表 CRUD 操作,从而节省大量时间,以及一些常用工具的封装。
- MyBatis中文文档地址:https://mybatis.org/mybatis-3/zh/index.html
- MyBatis-Plus官方地址:https://baomidou.com/
接下来我们就一起配置一下MyBatis-Plus:
这里我们会使用Mybatis-plus生成代码、分页、逻辑删除、常用字段自动注入数据等插件。
👉首先是application.yml
# 配置mybatis-plus的xml和bean的目录
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
configuration:
map-underscore-to-camel-case: true # 开启驼峰功能
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 日志打印功能
global-config: #逻辑删除配置
db-config:
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
然后我们在com.maple.demo下创建config目录存放我们的系统配置,在config目录创建MybatisPlusConfig.java文件
这里配置下Mybaits的自动填充机制和druid监控页面
package com.maple.demo.config;
import com.alibaba.druid.support.http.StatViewServlet;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.servlet.Servlet;
import java.util.Date;
/**
* Mybatis plus配置
*
* @author 笑小枫
* @date 2022/7/10
*/
@EnableTransactionManagement
@Configuration
@MapperScan("com.maple.demo.mapper")
public class MybatisPlusConfig implements MetaObjectHandler {
/**
* 新增时,自动填充数据
*/
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("isDeleted", false, metaObject);
this.setFieldValByName("createId", 1L, metaObject);
this.setFieldValByName("createName", "占位符", metaObject);
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateId", 1L, metaObject);
this.setFieldValByName("updateName", "占位符", metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
/**
* 修改时,自动填充数据
*/
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateId", 1L, metaObject);
this.setFieldValByName("updateName", "占位符", metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
/**
* 配置druid监控服务器
*
* @return 返回监控注册的servlet对象
*/
@Bean
public ServletRegistrationBean<Servlet> statViewServlet() {
ServletRegistrationBean<Servlet> servletRegistrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
// 添加IP白名单,如果不需要黑名单、白名单的功能,注释掉即可
servletRegistrationBean.addInitParameter("allow", "192.168.25.125,127.0.0.1");
// 添加IP黑名单,当白名单和黑名单重复时,黑名单优先级更高
servletRegistrationBean.addInitParameter("deny", "192.168.25.123");
// 添加控制台管理用户
servletRegistrationBean.addInitParameter("loginUsername", "druid");
servletRegistrationBean.addInitParameter("loginPassword", "123456");
// 是否能够重置数据
servletRegistrationBean.addInitParameter("resetEnable", "false");
return servletRegistrationBean;
}
}
其中,createId、createName暂时使用占位符,后期结合登录后从JWT里面获取。
配置自动生成代码插件
👉首先创建BaseEntity.java
,所有的实体类都继承该对象,用于存放系统字段,代码如下👇
package com.maple.demo.config.bean;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* @author 笑小枫
* @date 2022/7/11
*/
@Data
public class BaseEntity implements Serializable {
@TableId(type = IdType.AUTO)
protected Long id;
@ApiModelProperty("创建人id")
@TableField(value = "create_id", fill = FieldFill.INSERT)
private Long createId;
@ApiModelProperty("创建人名称")
@TableField(value = "create_name", fill = FieldFill.INSERT)
private String createName;
@ApiModelProperty("创建时间")
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;
@ApiModelProperty("更新人id")
@TableField(value = "update_id", fill = FieldFill.INSERT_UPDATE)
private Long updateId;
@ApiModelProperty("更新人名称")
@TableField(value = "update_name", fill = FieldFill.INSERT_UPDATE)
private String updateName;
@ApiModelProperty("更新时间")
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
👉配置MyBatis-Plus代码生成工具,在com.maple.demo目录下创建util目录,用于存放工具类。
然后创建Generator.java,代码如下:👇
package com.maple.demo.util;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.maple.demo.config.bean.BaseEntity;
/**
* MyBatis-Plus代码生成工具
*
* @author 笑小枫
* @date 2019/4/25
*/
public class Generator {
public static void main(String[] args) {
// 设置作者
String auth = "笑小枫";
// 设置父包名
String packageName = "com.maple.demo";
// 设置父包模块名
String moduleName = "";
// 指定输出目录
String path = "D:";
String url = "jdbc:mysql://127.0.0.1:3306/maple?useUnicode=true&useSSL=false&characterEncoding=utf8";
String username = "root";
String password = "Zhang123";
// 设置需要生成的表名
String table = "usc_user";
// 设置过滤表前缀
String[] tablePrefix = {"usc_", "sys_"};
generateTest(auth, packageName, path, moduleName, url, username, password, table, tablePrefix);
}
private static void generateTest(String auth, String packageName, String path, String moduleName,
String url, String username, String password, String table, String[] tablePrefix) {
FastAutoGenerator.create(url, username, password)
.globalConfig(builder -> builder.author(auth)
// 开启 swagger 模式
.enableSwagger()
.outputDir(path))
.packageConfig(builder -> builder.parent(packageName)
.moduleName(moduleName)
// 设置mapperXml生成路径
//.pathInfo(Collections.singletonMap(OutputFile.xml, path))
)
.strategyConfig(builder -> builder.addInclude(table)
.addTablePrefix(tablePrefix)
.entityBuilder().superClass(BaseEntity.class).enableLombok().logicDeleteColumnName("delete_flag")
.controllerBuilder().enableRestStyle()
)
.execute();
}
}
注意:适用版本:mybatis-plus-generator 3.5.1 及其以上版本,对历史版本不兼容!3.5.1 以下的请参考代码生成器旧
- superClass(BaseEntity.class):entity使用父类BaseEntity.class,减少id、创建人、修改人等系统字段
- .enableSwagger():我们配置了knife4j,所以我们开启swagger模式,这样会自动生成一些swagger的注解
- logicDeleteColumnName("delete_flag"):开启逻辑删除
- enableLombok():项目使用lombok,减少getter/setter代码的编写,使用插件编译时自动生成
- controllerBuilder().enableRestStyle():controller使用Rest代码风格
👉然后我们执行该Main方法
然后会在配置的目录下生成com文件夹,本文的在D:盘下。
我们将代码复制到我们的项目中,此时的项目代码结构如下如:👇
3.3 功能测试👌
编写一个测试用例测试一下吧
在UserController.java文件中添加新增用户和根据ID查询用户信息的接口👇
package com.maple.demo.controller;
import com.maple.demo.entity.User;
import com.maple.demo.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
/**
* <p>
* 用户中心-用户信息表 前端控制器
* </p>
*
* @author 笑小枫
* @since 2022-07-11
*/
@RestController
@RequestMapping("/user")
@AllArgsConstructor
@Api(tags = "用户信息管理")
public class UserController {
private final IUserService userService;
@ApiOperation(value = "插入用户信息")
@PostMapping("/insert")
public User insert(@RequestBody User user){
userService.save(user);
return user;
}
@ApiOperation(value = "根据用户ID查询用户信息")
@GetMapping("/selectById")
public User selectById(Long userId){
return userService.getById(userId);
}
}
这是我们在打开我们的Knife4j,可以在Swagger Models里面看到我们添加的User对象👇
在用户信息管理里面可以看到我们的接口信息,我们先调用一下插入方法。
参数我们只保留简单的几个,如下👇
{
"account": "xiaoxiaofeng",
"email": "1150640979@qq.com",
"nickName": "笑小枫",
"password": "123456",
"phone": "18300000000",
"userName": "笑小枫"
}
调用结果如下图所示👇
可以看到数据里面,我们的数据已经插入进去了👇
接下来我们调用查询接口看一下👇
OK,大功告成✌️
我们在上文中配置阿里巴巴的Druid数据库连接池,那么我们怎么可以看一下我们的sql执行情况呢?
可以在浏览器输入:http://127.0.0.1:6666/druid
在SQL监控中可以看到我们的sql执行情况,以及一些慢sql的分析👇
小结
好啦,本文就到这里了,我们简单的总结一下,主要介绍了以下内容
- SpringBoot集成mysql数据库
- 集成Mybatis Plus框架
- 通过一个简单的例子演示了一下使用Mybatis Plus进行数据插入和查询
- 使用Knife4j进行接口调试
- 集成阿里巴巴Druid数据连接池
- 通过Druid页面进行执行sql查询、分析
本文源码:https://github.com/hack-feng/maple-demo
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。