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

一、 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);
    }
}

数据库最后显示:

在这里插入图片描述

文章源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Daniel521-Spark

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值