二、前后端分离通用权限系统(2)

news2024/9/24 9:23:29

🌻🌻 目录

  • 一、 Mybatis-Plus 复习
    • 1.1、简介
    • 1.2、特点
    • 1.3、支持数据库
    • 1.4、在工程中引入依赖
  • 二、Mybatis-Plus 入门
    • 2.1、导入配置文件
    • 2.2、导入启动类
    • 2.3、实体类
    • 2.4、创建 Mapper 类
    • 2.5、创建测试 Mapper接口
    • 2.6、CRUD 测试
      • 2.6.1、insert 添加
      • 2.6.2、主键策略
      • 2.6.3、更新
      • 2.6.4、删除
        • 2.6.4.1、根据id删除(逻辑删除)
        • 2.6.4.2、批量删除
      • 2.6.5、MyBatis-Plus 条件构造器
    • 2.7、MyBatis-Plus 封装 service 层
      • 2.7.1、添加service接口
      • 2.7.2、添加service接口实现
      • 2.7.3、测试Service接口

一、 Mybatis-Plus 复习

Mybatis-Plus详细总结:中级进阶阶 👉👉 三十五、MyBatis-Plus(1)

官网:https://baomidou.com/

1.1、简介

MyBatis-Plus (简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

1.2、特点

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

1.3、支持数据库

MySQLOracleSQLServerPostgreSQLDB2,H2,HSQL,SQLite,Phoenix,Gauss ,ClickHouse,Sybase,OceanBase,Firebird,Cubrid,Goldilocks,csiidb等。

1.4、在工程中引入依赖

依赖前面已经引入了,分析如下:

工程入口依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.1</version>
</dependency>

在这里插入图片描述

在这里插入图片描述

二、Mybatis-Plus 入门

在这里插入图片描述

前面介绍了Mybatis-Plus,当前就以角色管理为例在service-system模块中总结Mybatis-Plus的使用

2.1、导入配置文件

配置 MySQL 数据库的相关配置及Mybatis-Plus日志

在主工程下面的 service-system下面的分别创建 application-dev.ymlapplication.yml 并导入如下面配置:

application-dev.yml

在这里插入图片描述

server:
  port: 8800
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 查看日志
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/gansu-auth?characterEncoding=utf-8&useSSL=false
    username: root
    password: root

application.yml

在这里插入图片描述

spring:
  application:
    name: service-system
  profiles:
    active: dev

2.2、导入启动类

  • service-system下面的java下面创建包 com.gansu.system,再创建启动类 ServiceAuthApplication ,导入如下:
  • 再在Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹:

在这里插入图片描述

package com.gansu.system;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@MapperScan("com.gansu.system.mapper")
@SpringBootApplication
public class ServiceAuthApplication {

    public static void main(String[] args) {

        SpringApplication.run(ServiceAuthApplication.class, args);

    }
}

2.3、实体类

引入 实体,到 service-system 如下所示:

在这里插入图片描述

下面实体类说明:

实体类注解 官方详细文档

  • @TableName:表名注解,标识实体类对应的表
  • @TableId:主键注解,type = IdType.AUTO(数据库 ID 自增)
  • @TableField:字段注解(非主键)
  • @TableLogic逻辑删除

在这里插入图片描述

2.4、创建 Mapper 类

java下面创建包 com.gansu.system.mapper 再次创建mapper接口 SysRoleMapper

在这里插入图片描述

package com.gansu.system.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gansu.model.system.SysRole;
import org.springframework.stereotype.Repository;

@Repository
public interface SysRoleMapper extends BaseMapper<SysRole> {
}

com.baomidou.mybatisplus.core.mapper.BaseMapper这是Mybatis-Plus提供的默认Mapper接口,点进去可以看到,已经封装好了很多的crud方法。

在这里插入图片描述

2.5、创建测试 Mapper接口

test下面的java下面创建包 com.gansu.system 再次创建测试类 SysRoleMapperTest

在这里插入图片描述

package com.gansu.system;


import com.gansu.model.system.SysRole;
import com.gansu.system.mapper.SysRoleMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
public class SysRoleMapperTest {

    @Autowired
    private SysRoleMapper sysRoleMapper;
    @Test  //org.junit.jupiter.api.Test; 导入 junit5
    public void test1(){

        //UserMapper 中的 selectList() 方法的参数为 MP 内置的条件封装器 Wrapper
        //所以不填写就是无任何条件
        List<SysRole> sysRoles = sysRoleMapper.selectList(null);

        for (SysRole sysRole : sysRoles) {

            System.out.println(sysRole);

        }
    }
}

注意:

  • IDEA在sysRoleMapper处报错,因为找不到注入的对象,因为类是动态创建的,但是程序可以正确的执行。
  • 为了避免报错,可以在 mapper 层 的接口上添加 @Repository 或直接使用 @Resource 代替 @Autowired

运行程序控制台输出:

在这里插入图片描述

对比数据库如下:

在这里插入图片描述

通过以上几个简单的步骤,我们就实现了 User 表的 CRUD 功能,甚至连 XML 文件都不用编写!

2.6、CRUD 测试

2.6.1、insert 添加

在这里插入图片描述

@Test  //增加
public void test2(){

    SysRole sysRole1 = new SysRole();

    sysRole1.setRoleName("角色管理");
    sysRole1.setRoleCode("roleManager");
    sysRole1.setDescription("角色描述");

    int insert = sysRoleMapper.insert(sysRole1);

    System.out.println(insert); //影响的行数
    System.out.println(sysRole1.getId());//id自动会增
}

运行程序控制台输出:

在这里插入图片描述

对比数据库如下:
增加前:

在这里插入图片描述

增加后:

在这里插入图片描述

2.6.2、主键策略

1、ID_WORKER

MyBatis-Plus默认的主键策略是:ID_WORKER 全局唯一ID

2、自增策略

  • 要想主键自增需要配置如下主键策略

    • 需要在创建数据表的时候设置主键自增
    • 实体基类 BaseEntity 字段中配置 @TableId(type = IdType.AUTO)

在这里插入图片描述

在这里插入图片描述

@TableId(type = IdType.AUTO)
private Long id;

2.6.3、更新

在这里插入图片描述

@Test  //更新
public void test3(){

    SysRole sysRole1 = new SysRole();

    sysRole1.setId(1824717962347577345L);
    sysRole1.setRoleName("橘色管理88");
    sysRole1.setRoleCode("8888888");
    sysRole1.setDescription("橘色描述");

    int i = sysRoleMapper.updateById(sysRole1);

    System.out.println(i); //影响的行数
    System.out.println(sysRole1.getId());//id不变
}

运行程序控制台输出:

在这里插入图片描述

更新前:

在这里插入图片描述

更新后:

在这里插入图片描述

2.6.4、删除

在这里插入图片描述

2.6.4.1、根据id删除(逻辑删除)

如果数据库中没有delete这个字段则会物理删除

配置:application-dev.yml 中添加:

在这里插入图片描述

spring:
  mybatis-plus:
    global-config:
      db-config:
        logic-delete-value: 1
          logic-not-delete-value: 0

在这里插入图片描述

@Test  //更具id删除
public void test4(){

    sysRoleMapper.deleteById(1824717962347577345L);

}

运行程序控制台输出:

在这里插入图片描述

删除前:

在这里插入图片描述

删除后:

在这里插入图片描述

2.6.4.2、批量删除

在这里插入图片描述

@Test  //更具id删除
public void test4(){

   //逻辑删除
  // sysRoleMapper.deleteById(1824717962347577345L);
   //批量删除
 sysRoleMapper.deleteBatchIds(Arrays.asList(1824717962347577346L,1824717962347577347L));

}

运行程序控制台输出:

在这里插入图片描述

删除前:

在这里插入图片描述

删除后:

在这里插入图片描述

再次查询,则如下显示,查询不到:

在这里插入图片描述

2.6.5、MyBatis-Plus 条件构造器

在这里插入图片描述

Wrapper : 条件构造抽象类,最顶端父类

  • AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
    –​ QueryWrapper : Entity 对象封装操作类,不是用lambda语法
    –​ UpdateWrapper : Update 条件封装,用于Entity对象更新操作
    –​ AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
    –​ - LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
    –​ - LambdaUpdateWrapper : Lambda 更新封装Wrapper

注意:以下条件构造器的方法入参中的 column 均表示数据库字段

① 根据用户名查询和用户名模糊查询

在这里插入图片描述

@Test  //模糊查询
public void test5(){

    //1.创建构造器
    QueryWrapper<SysRole> wrapper = new QueryWrapper<>();

    //wrapper.eq("role_name","普通管理员");

    wrapper.like("role_name","管理员");

    List<SysRole> sysRoles = sysRoleMapper.selectList(wrapper);

    System.out.println(sysRoles);
}

在这里插入图片描述

在这里插入图片描述

控制台输出:

在这里插入图片描述

在这里插入图片描述

② 根据用户名删除

在这里插入图片描述

@Test  //删除
public void test6(){
    //1.创建构造器
    QueryWrapper<SysRole> wrapper = new QueryWrapper<>();

    wrapper.eq("role_name","用户管理员");

    sysRoleMapper.delete(wrapper);
}

控制台输出:

在这里插入图片描述

删除前:

在这里插入图片描述

删除后:

在这里插入图片描述

其他条件构造有兴趣的可自行测试也可以参考详细总结里面的。

2.7、MyBatis-Plus 封装 service 层

2.7.1、添加service接口

① 在 service-system 下面创建包 com.gansu.system.service,再在下面创建 接口 SysRoleService,并继承mybatisPlus接口 IService

在这里插入图片描述

com.baomidou.mybatisplus.extension.service.IService这是Mybatis-Plus提供的默认Service接口。

package com.gansu.system.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.gansu.model.system.SysRole;

public interface SysRoleService extends IService<SysRole> {

}

2.7.2、添加service接口实现

② 再创建包 com.gansu.system.service.impl 并且创建接口实现类 SysRoleServiceImpl ,并继承 Mybatis-Plus提供的默认类 ServiceImpl

在这里插入图片描述

package com.gansu.system.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gansu.model.system.SysRole;
import com.gansu.system.mapper.SysRoleMapper;
import com.gansu.system.service.SysRoleService;

@Service
public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper,SysRole> implements SysRoleService {

}

源码分析:

在这里插入图片描述

com.baomidou.mybatisplus.extension.service.impl.ServiceImpl这是Mybatis-Plus提供的默认Service接口实现。

2.7.3、测试Service接口

还原数据库表sys_role字段is_deleted所有为0,便于下面测试

在这里插入图片描述

在原先包下面创建测试类 SysRoleServiceTest

在这里插入图片描述

package com.gansu.system;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.gansu.model.system.SysRole;
import com.gansu.system.service.SysRoleService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.stereotype.Repository;

import java.util.List;

@SpringBootTest
public class SysRoleServiceTest {

    @Autowired
    private SysRoleService sysRoleService;

    @Test //查询所有
    public void test1(){

        List<SysRole> list = sysRoleService.list();

        for (SysRole sysRole : list) {

            System.out.println(sysRole);
        }
    }

    @Test //增加
    public void test2(){

        SysRole sysRole1 = new SysRole();
        sysRole1.setRoleName("角色818");
        sysRole1.setRoleCode("818");
        sysRole1.setDescription("角色818描述");

        sysRoleService.save(sysRole1);
    }

    @Test //更新
    public void test3(){

        SysRole sysRole1 = new SysRole();

        sysRole1.setId(1824717962347577347L);
        sysRole1.setRoleName("818");

        sysRoleService.updateById(sysRole1);
    }


    @Test //删除
    public void test4(){

        sysRoleService.removeById(1824717962347577347L);
    }

    @Test //模糊查询
    public void test5(){

        QueryWrapper<SysRole> wrapper = new QueryWrapper<SysRole>();

        wrapper.like("role_name","818");

        sysRoleService.list(wrapper);
    }
}

数据库最后显示:

在这里插入图片描述

文章源码

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flink环境搭建

Flink会话模式 1.集群规划&#xff1a; 2. 将flink拖到/opt/so下 3. 将安装包解压到/opt/module下&#xff1a; tar -zxvf /opt/so/flink-1.15.4-bin-scala_2.12.tgz -C /opt/module 4. 改个名&#xff1a;mv flink-1.15.4 flink 5. 修改配置文件&#xff1a;cd /opt/mo…

CPU 绑核

随笔记录 目录 1. 背景介绍 2. 查询设备CPU 中断核 2.1 查询设备名 2.2 查询设备CPU 中断核 2.2.1 查询本服务上所有设备 CPU 中断核Number 2.2.2 查询 每个设备cpu 中断核的 3. 确定可绑定CPU 核 3.1 查询cpu 信息 3.2 绑核 3.3 更新group 3.4 重启后查看 4. 绑核…

9 算术、关系、逻辑、赋值、位操作、三元运算符及其优先级

目录​​​​​​​ 1 运算符基础 1.1 什么是运算符 1.2 什么是表达式 1.3 左操作数和右操作数 1.4 运算符分类 1.4.1 按照操作数个数分类 1.4.2 按照功能分类 1.5 如何掌握运算符 2 算术运算符 2.1 正号和负号 2.2 加、减、乘、除 2.3 取模&#xff08;取余&#…

Java八股整合(MySQL+Redis+Maven)

MySQL 数据库设计三范式 不可再分&#xff0c;部分依赖&#xff0c;传递依赖 主键和外键区别 主键非空约束&#xff0c;唯一性约束&#xff0c;唯一标识一个字段 外键用于和其他表建立连接&#xff0c;是另一张表的主键&#xff0c;可重复可为空可以有多个 为什么不推荐使…

记录一次生产jvm问题的排查

记录一次生产问题的排查 第一天晚上 现象 1、前援反馈页面有接口陆续出现请求超时 2、登录后台服务器top命令查看发现java进程发生高cpu占用情况 3、查看对应业务日志&#xff0c;报数据库连接等待超时-数据库连接池连接无空闲 对应处理 1、临时调大数据库连接池最大连接数限…

如何发布自己的NPM包详细步骤

前言 在前端开发中&#xff0c;将自己编写的 Vue 组件或插件打包并发布到 NPM 上&#xff0c;不仅可以方便自己在其他项目中复用&#xff0c;还能分享给更多的开发者使用。本文将从 NPM 注册、登录与发布流程&#xff0c;及如何通过 Vue CLI 打包插件的角度详细介绍如何发布 V…

C#线程的使用

每个正在操作系统上运行的应用程序都是一个进程&#xff0c;一个进程可以包括一个或多个线程。线程是操作系统分配处理器时间的基本单元&#xff0c;在进程中可以有多个线程同时执行代码。 1、单线程 单线程就是只有一个线程。默认情况下&#xff0c;系统为应用程序分配一个主…

论团体标准的有效期

在当今快速发展的社会中&#xff0c;标准对于规范行业秩序、保障产品和服务质量起着至关重要的作用。其中&#xff0c;团体标准作为标准体系的重要组成部分&#xff0c;以其灵活性和专业性受到了广泛的关注。而团体标准的有效期&#xff0c;则是一个值得深入探讨的重要议题。 团…

2024年最新上榜的文件加密管理软件

文件加密市场风起云涌&#xff0c;后辈迭出&#xff0c;2024年安企神软件在文件加密管理软件市场中备受瞩目&#xff0c;凭借其强大的功能和全面的保护策略&#xff0c;成功上榜并受到广泛认可。以下是对它的详细介绍&#xff1a; 一、产品概述 安企神软件不仅是一款电脑监控…

“软件定义汽车”下的软件虚拟化技术

01.虚拟化技术概述 近年来&#xff0c;随着嵌入式软硬件的高速发展&#xff0c;嵌入式系统产品已融入日常生活的方方面面&#xff0c;在航空航天、车载电子、工业控制等要求更为严苛等领域的应用也更加广泛。特别对汽车领域&#xff0c;每辆车内ECU的使用数量已从21世纪初的30…

定时任务调度`crond` 和 `at` 命令使用

&#x1f600;前言 本篇博文是关于 linux实操篇-定时任务调度crond 和 at 命令&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满…

【心酸报错】ImportError: failed to find libmagic. Check your installation

目录 报错信息&#xff1a;ImportError: failed to find libmagic. Check your installation按照网络上找的办法修改还是报错&#xff1a;LookupError:Resource punkt not found.下载nltk_data又报错&#xff1a;AttributeError: tuple object has no attribute page_content怀…

软件工程概述(下)

4、软件工程原理 &#xff08;1&#xff09;什么是软件工程&#xff1f; 软件工程是指导计算机软件开发和维护的一门学科。 采用工程的概念、原理、技术和方法来开发与维护软件&#xff0c;把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来&#xf…

【Qt】常用控件QCheckBox

常用控件QCheckBox QCheckBox表示复选按钮&#xff0c;可以允许选中多个。 QCheckBox继承自QAbstractButton 例子&#xff1a;获取复选按钮的取值 使用Qt Designer先大体进行设计 代码实现&#xff1a; #include "widget.h" #include "ui_widget.h"Widge…

【数学建模】趣味数模问题——舰艇追击问题

问题描述 某缉私舰位于走私船以东 d 10 km&#xff0c;走私船以匀速 u 8 km/h 向北沿直线行驶。缉私舰立即以速度 v 12 km/h 追赶。缉私舰使用雷达进行跟踪&#xff0c;保持瞬时速度方向始终指向走私船。求解缉私舰的追逐路线和追上走私船所需的时间。 方法 理论求解&…

阿里巴巴拍立淘API返回值:商品搜索与社交媒体的融合

阿里巴巴拍立淘API返回值在商品搜索与社交媒体融合方面展现出了巨大的潜力和价值。以下是对这一主题的详细分析&#xff1a; 一、拍立淘API在商品搜索中的应用 1. 技术原理 拍立淘API基于图像识别技术&#xff0c;利用深度学习算法对上传的图片进行智能分析&#xff0c;快速…

WebSocket协议解析与Java实践

文章目录 一、HTTP协议与HTTPS协议1.HTTP协议的用处2.HTTP协议的特点3.HTTP协议的工作流程4.HTTPS协议的用处5.HTTPS协议的特点6.HTTPS协议的工作流程 二、WebSocket协议出现的原因1. 传统的HTTP请求-响应模型2. 轮询&#xff08;Polling&#xff09;3. 长轮询&#xff08;Long…

《向量数据库指南》——AI应用长文本与RAG技术爬坡

技术爬坡 长文本的技术爬坡方向 推理质量不能有所下降,如何在保质保量的做长文本的推理,是一件非常困难的事。 解决了能力问题之后,还要解决贵且慢的问题。前面讲到两个瓶颈,一个是推理成本会特别高,一个是首token会特别慢。在一个阶段解决好这两个问题之后,待上下文窗口…

深度学习基础案例3--构建CNN卷积神经网络实现对不同天气的识别(测试集准确率百分之90+)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 基础阶段目标目标 熟悉CNN、RNN神经网络&#xff0c;了解yolo、transfomer等模型熟练使用Pytorch框架&#xff0c;了解tensorflow 本次目标 了解CNN神经网络…

使用ToDesk云电脑3个月,这5个功能点越用越爽!

在过去的三个月里&#xff0c;小埋 有幸 深度 体验了ToDesk云电脑这一创新科技产品&#xff0c;它不仅彻底改变了我的工作方式&#xff0c;还让我在日常学习和娱乐中享受到了前所未有的便捷与高效。 下面就跟着小埋&#xff0c;一起来看看 ToDesk云电脑使用体验极佳的五大功能特…