🍀 前言
博客地址:
- CSDN:https://blog.csdn.net/powerbiubiu
👋 简介
本章节开始从实际的应用场景,来讲解Mybatis-Plus常用的一些操作,根据业务场景来进行增删改查的功能,首先先搭建一个项目。
📖 正文
1 搭建数据库
根据业务场景,设定了用户,角色,菜单三张表,同时还有用户与角色关联表,角色与菜单关联表,实现符合RBAC权限模型的一个项目基础架构
1.1 用户表
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户id',
`username` varchar(20) NOT NULL DEFAULT '' COMMENT '用户名',
`password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '密码',
`name` varchar(50) DEFAULT NULL COMMENT '姓名',
`email` varchar(50) DEFAULT NULL COMMENT 'email',
`phone` varchar(11) DEFAULT NULL COMMENT '手机',
`avatar` varchar(200) DEFAULT NULL COMMENT '头像地址',
`sex` tinyint NOT NULL DEFAULT '2' COMMENT '性别(0:女 1:男 2:保密)',
`description` varchar(255) DEFAULT NULL COMMENT '描述',
`status` tinyint DEFAULT '1' COMMENT '状态(1:正常 0:停用)',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`is_deleted` tinyint NOT NULL DEFAULT '0' COMMENT '逻辑删除标记(0:可用 1:已删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表';
1.2 角色表
DROP TABLE IF EXISTS `tb_role`;
CREATE TABLE `tb_role` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '角色id',
`role_name` varchar(20) NOT NULL DEFAULT '' COMMENT '角色名称',
`role_code` varchar(20) DEFAULT NULL COMMENT '角色编码',
`description` varchar(255) DEFAULT NULL COMMENT '描述',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`is_deleted` tinyint NOT NULL DEFAULT '0' COMMENT '删除标记(0:可用 1:已删除)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3 COMMENT='角色表';
1.3 菜单表
DROP TABLE IF EXISTS `tb_menu`;
CREATE TABLE `tb_menu` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`parent_id` bigint NOT NULL DEFAULT '0' COMMENT '所属上级',
`name` varchar(20) NOT NULL DEFAULT '' COMMENT '名称',
`type` tinyint NOT NULL DEFAULT '0' COMMENT '类型(0:目录,1:菜单,2:按钮)',
`path` varchar(100) DEFAULT NULL COMMENT '路由地址',
`component` varchar(100) DEFAULT NULL COMMENT '组件路径',
`perms` varchar(100) DEFAULT NULL COMMENT '权限标识',
`icon` varchar(100) DEFAULT NULL COMMENT '图标',
`sort_value` int DEFAULT NULL COMMENT '排序',
`status` tinyint DEFAULT '1' COMMENT '状态(0:禁止,1:正常)',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`is_deleted` tinyint NOT NULL DEFAULT '0' COMMENT '删除标记(0:可用 1:已删除)',
PRIMARY KEY (`id`),
KEY `idx_parent_id` (`parent_id`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='菜单表';
1.4 关联表
用户角色关联表
DROP TABLE IF EXISTS `tb_user_role`;
CREATE TABLE `tb_user_role` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键id',
`role_id` bigint NOT NULL DEFAULT '0' COMMENT '角色id',
`user_id` bigint NOT NULL DEFAULT '0' COMMENT '用户id',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_role_id` (`role_id`),
KEY `idx_admin_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3 COMMENT='用户角色关联表';
角色菜单关联表
DROP TABLE IF EXISTS `tb_role_menu`;
CREATE TABLE `tb_role_menu` (
`id` bigint NOT NULL AUTO_INCREMENT,
`role_id` bigint NOT NULL DEFAULT '0',
`menu_id` bigint NOT NULL DEFAULT '0',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_role_id` (`role_id`),
KEY `idx_menu_id` (`menu_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3 COMMENT='角色菜单表';
2 项目依赖
pom.xml
中使用到的依赖
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--打印sql执行日志-->
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.9.1</version>
</dependency>
<!--mybatis plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<!--mybatis plus代码生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.2</version>
</dependency>
<!--模板引擎(代码生成器使用)-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
<!-- knife4j -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
<version>4.3.0</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
3 添加配置
3.1 application.yml配置
server:
port: 8080 # 项目运行端口,默认 8080
spring:
datasource:
# 指定数据库驱动类
# driver-class-name: com.mysql.cj.jdbc.Driver
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
# 数据库连接信息
# url: jdbc:mysql://localhost:3306/mpdemo?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
url: jdbc:p6spy:mysql://localhost:3306/mpdemo?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
username: root
password: 123456
hikari: # 数据库连接池使用 Hikari
minimum-idle: 5 # 连接池中最小空闲连接数
maximum-pool-size: 20 # 连接池中允许的最大连接数
auto-commit: true # 是否自动提交事务
idle-timeout: 30000 # 连接在连接池中闲置的最长时间,超过这个时间会被释放。
pool-name: MP-HikariCP # 自定义连接池的名字
max-lifetime: 1800000 # 连接在连接池中的最大存活时间,超过这个时间会被强制关闭。
connection-timeout: 30000 # 连接的超时时间
connection-test-query: SELECT 1 # 用于测试连接是否可用的SQL查询
前面添加了p6spy
的依赖,所以这里数据库的驱动及url需要修改
备注:因为p6spy
影响性能,只在开发环境使用,如果项目上生产环境,尽量不要使用该方式
3.2 spy.properties配置
在项目resource目录下新建spy.properties
文件,对p6spy
进行配置
#3.2.1以上使用
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1以下使用或者不配置
#modulelist=com.p6spy.engine.logging.P6LogFactory,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
3.3 MapperScan扫描
在启动类上,通过MapperScan
注解对mapper进行扫描
/**
* @author power
* @time 2023/12/20 20:36:14
* @Description
*/
@SpringBootApplication
@MapperScan("com.power.mpdemo.mapper")
public class MpDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MpDemoApplication.class, args);
}
}
Tips :
@MapperScan 注解用于告诉 Mybatis-Plus 框架需要扫描的 mapper 类的包路径,mapper 类主要用于操作数据库。
✏ 总结
使用SpringBoot
和Mybatis-Plus
可以快速搭建稳健的后端项目,省去了大量繁琐的配置和代码编写,提高了开发效率。本系列文章通过结合实际的项目,深入理解Mybatis-Plus
框架的使用。