深入解析Mybatis-Plus框架:简化Java持久层开发(二)

🍀 前言

博客地址:

  • 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 类主要用于操作数据库。

✏ 总结

使用SpringBootMybatis-Plus可以快速搭建稳健的后端项目,省去了大量繁琐的配置和代码编写,提高了开发效率。本系列文章通过结合实际的项目,深入理解Mybatis-Plus框架的使用。

💖 欢迎关注我的公众号

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/391641.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年上班族最适合做的副业:抖音小店,门槛真低!

大家好&#xff0c;我是电商糖果 搞钱难&#xff0c;做副业搞钱更难&#xff01; 作为普通上班族&#xff0c;一个人的薪资很难养活一个家庭&#xff0c;于是越来越多人开始琢磨副业。 而2024年最适合上班族的副业&#xff0c;真的是非抖音小店莫属了。 这两年抖音购物已经…

java.lang.NoClassDefFoundError: org/springframework/core/GenericTypeResolver

前言 小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识&#xff0c;有兴趣的小伙伴可以关注一下&#xff01; 也许一个人独行&#xff0c;可以走的很快&#xff0c;但是一群人结伴而行&#xff0c;才能走的更远&#xff01;让我们在成长的道路上互相学习&…

Java实现新能源电池回收系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户档案模块2.2 电池品类模块2.3 回收机构模块2.4 电池订单模块2.5 客服咨询模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 E-R 图设计 四、系统展示五、核心代码5.1 增改电池类型5.2 查询电池品类5.3 查询电池回…

485. Max Consecutive Ones(最大连续 1 的个数)

问题描述 给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 问题分析 因为nums中只有1与0两种字符&#xff0c;我们可以设计一个统计变量来统计某一段中1出现的次数&#xff0c;因为当1后面跟着一个0时意味着这一段1结束&#xff0c;由此可以实现统计1的数…

Pandas.Series.cummin() 累积最小值 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本&#xff1a; 本文基于 pandas2.2.0 编写。 关于本文内容更新&#xff1a; 随着pandas的stable版本更迭&#xff0c;本文持续更新&#xff0c;不断完善补充。 传送门&#xff1a; Pandas API参考目录 传送门&#xff1a; Pandas 版本更新及新特性 传送门&…

【打工日常】使用docker部署tool工具箱

一、tools介绍 Tools是一款开源的便捷解决我们日常遇到的小问题的工具集合&#xff0c;支持Docker私有化部署&#xff0c;具备大量的好用的小功能&#xff0c;如各种加密解密、token解析、url解析等等。 二、本次实践介绍 1. 本次实践简介 本次实践部署环境为个人测试环境 2.…

Oracle数据字典学习1

之前查看了几个用户的默认表空间&#xff0c;是从user_users来查看的&#xff1b; 根据资料&#xff1b; ORACLE中数据字典视图分为3大类,用前缀区别&#xff0c;分别为&#xff1a;USER&#xff0c;ALL 和 DBA&#xff1b; 许多数据字典视图包含相似的信息&#xff1b; USER_…

Dynamo之视图过滤器介绍

你好&#xff0c;这里是BIM的乐趣&#xff0c;我是九哥~ 今天简单整理一篇&#xff0c;源于最近很多人给我留言&#xff0c;问如何添加过滤器&#xff0c;那么我就简单把视图过滤器这块的节点及其用法整理下&#xff0c;基本上自带的节点就够用了。 获取项目中的所有视图过滤器…

高清和理解物理世界依然是Sora下一步方向

刚在微博看到一个作者的文&#xff0c;应该是国内的AI创业公司吧&#xff0c;他说了对Sora的看法&#xff0c;比较长&#xff0c;张贴出来&#xff0c;高清和能理解物理世界依然是OPENAI以后的趋势&#xff0c;高清其实不难搞&#xff0c;这老板部分说的是对&#xff0c;部分还…

手把手教你用Unet做眼底血管图像分割

手把手教你用Unet做眼底血管图像分割 配套教学视频地址&#xff1a;手把手教你用Unet做眼底血管图像分割_哔哩哔哩_bilibili 配套代码和数据下载地址&#xff1a;Unet眼底血管图像分割数据集代码模型系统界面教学视频.zip资源-CSDN文库 Hi&#xff0c;这里是肆十二&#xff0c;…

[BJDCTF2020]Cookie is so stable

先发现有flag页面和Hint页面&#xff0c;dirsearch扫完也没有获得什么 falg输入什么就返回什么 题目提到cookie&#xff0c;抓包看看 猜测是ssti注入 输入user{{7*7}}测试一下&#xff0c;确实存在&#xff08;注意cookie的user前面的连接是;&#xff09; 同时也判断了ssti注…

【Python--网络编程之TCP三次握手】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python开发技术 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; Python网络编程之[TCP三次握手] 往期内容代码见资源&#xff0c;效果图如下一、实验要求二、协…

YOLOv8制作自定义数据集并训练

YOLOv8制作自定义数据集并训练 前言一、制作自定义数据集1、建立相应文件夹2、下载图片3、为图片打标签&#xff08;1&#xff09;安装labelimg&#xff08;2&#xff09;打开labelimg&#xff08;3&#xff09;标记图片 二、按比例移动自定义数据集中的内容三、建立数据集测试…

「算法」二分查找1:理论细节

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;算法详解 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 二分查找算法简介 这个算法的特点就是&#xff1a;细节多&#xff0c;出错率高&#xff0c;很容易就写成死循环有模板&#xff0c;但…

MySQL篇之SQL优化

一、表的设计优化 表的设计优化&#xff08;参考阿里开发手册《嵩山版》&#xff09;&#xff1a; 1. 比如设置合适的数值&#xff08;tinyint int bigint&#xff09;&#xff0c;要根据实际情况选择。 2. 比如设置合适的字符串类型&#xff08;char和varchar&#xff09…

UnityShader——06UnityShader介绍

UnityShader介绍 UnityShader的基础ShaderLab UnityShader属性块介绍 Properties {//和public变量一样会显示在Unity的inspector面板上//_MainTex为变量名&#xff0c;在属性里的变量一般会加下划线&#xff0c;来区分参数变量和临时变量//Texture为变量命名//2D为类型&…

OpenAI Sora 初体验

OpenAI Sora 初体验 就在刚刚&#xff0c;OpenAI 再次投下一枚重磅炸弹——Sora&#xff0c;一个文本到视频生成模型。 我第一时间体验了 Sora。看过 Sora 的能力后&#xff0c;我真的印象深刻。对细节的关注、无缝的角色刻画以及生成视频的绝对质量真正将可能性提升到了一个新…

程序员搞什么副业才有性价比?

干一行恨一行&#xff0c;三百六十行&#xff0c;行行干破防&#xff01; 一份稳定的主业固然重要&#xff0c;但是有性价比的副业更令人心动。朝九晚五的工作日复一日&#xff0c;当然也可能是996的生活反复捶打。从整体来讲&#xff0c;程序员算是高收入群体&#xff0c;但往…

GitLab配置SSHKey

段落一&#xff1a;什么是SSH密钥 SSH&#xff08;Secure Shell&#xff09;是一种网络协议&#xff0c;用于安全地远程登录和执行命令。SSH密钥是一种用于身份验证的加密文件&#xff0c;它允许您在与远程服务器通信时&#xff0c;无需输入密码即可进行认证。在GitLab中配置S…

小苯的数组切分 ---- 牛客月赛

题目描述 qionghuaqionghuaqionghua 给了小苯一个长度为 n 的数组 a&#xff0c;希望小苯将数组 aaa 分为恰好非空的三段。即&#xff1a;[1,l−1],[l,r],[r1,n]这三段&#xff0c;其中 1< l≤r<n。接着&#xff1a; ∙ 第一段的所有数字做 ⊕&#xff08;按位异或&…